Redis lua脚本应用

  高并发情况下对缓存进行读取-修改操作时,需要原子性操作,Redis本身提供一个一些命令,例如incrby、hincrby自增(减)命令,但是这些命令在有些业务中不适用,这种情况下就可以使用lua脚本来实现多命令的执行(读、写);

  以下lua脚本,通常lua脚本只需要加载一次,然后使用redis返回的hash值进行操作;

复制代码
local local = redis.call('exists', KEYS[1])
if tonumber(local) == 0 then
    return false
end
if tonumber(redis.call('get', KEYS[1])) <= 0 then
    return false
end
if tonumber(ARGV[1]) > 0 then
    redis.call('incrby', KEYS[1], ARGV[1])
    return true
else
    if tonumber(redis.call('get', KEYS[1])) >= tonumber(ARGV[1]) then
        redis.call('incrby', KEYS[1], ARGV[1])
        return true
    else
        return
false
end end
复制代码

该脚本实现了对库存的读取和修改,该脚本可以在resources文件夹进行统一管理;

在java代码中:

  

复制代码
        try {
        DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("/limit.lua")));
        redisScript.setResultType(Boolean.class);

        return redisTemplate.execute(redisScript, Collections.singletonList(key), String.valueOf(mlitimes), String.valueOf(maxCount));

        } catch (IOException e) {
            e.printStackTrace();
        }
复制代码

重点:在集群模式下,如果只在某个节点上传了脚本,在其他节点中会找不到,因此需要判断脚本是否存在,如果不存在,重新上传lua脚本。

 

posted @   使用D  阅读(644)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示