lua脚本实现redis命令decrby减至最小为0
local current = redis.call('get', KEYS[1]); if current == false then return nil; end if tonumber(ARGV[1]) > tonumber(current) then return redis.call('decrby', KEYS[1], current); else return redis.call('decrby', KEYS[1], ARGV[1]); end
java代码
package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** * redis lua工具类 * @author xuzhipeng * @date 2021/01/31 */ @Component public class RedisLuaUtil { private static final Logger log = LoggerFactory.getLogger(RedisLuaUtil.class); private static final String LUA_SCRIPT_DECRBY_UNTIL_TO_0 = "local current = redis.call('get', KEYS[1]);" + "if current == false then " + " return nil;" + "end " + "if tonumber(ARGV[1]) > tonumber(current) then " + " return redis.call('decrby', KEYS[1], current);" + "else " + " return redis.call('decrby', KEYS[1], ARGV[1]);" + "end"; @Resource private RedisTemplate redisTemplate; /** * Decrby 命令将 key 所储存的值减去指定的减量值。(减至最小值为0) * @param key * @param delta * @return 当key不存在时返回null;key存在,当前值<delta时,减去当前值;key存在,当前值>=delta时,减去delta; */ public Long decrByUntilTo0(String key, long delta){ List<String> keyList = new ArrayList<>(); keyList.add(key); DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(LUA_SCRIPT_DECRBY_UNTIL_TO_0,Long.class); Long result = null; try { result = (Long) redisTemplate.execute(redisScript,keyList,delta); } catch (Exception e) { log.error("decrby异常",e); } return result; } }
如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步