zoukankan      html  css  js  c++  java
  • 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脚本。

  • 相关阅读:
    Spring Security 自动装配
    Mysql学习
    java 学习路线(bilibili)
    Mac上配置idea的项目上传到GitHub
    vim安装自动补全插件
    spring aop 获取request、response对象
    centos7配置本地yum源 使用安装镜像安装软件
    eclipse启动速度优化
    spring-mvc springboot 使用MockMvc对controller进行测试
    java web 验证码-字符变形(推荐)
  • 原文地址:https://www.cnblogs.com/use-D/p/11746280.html
Copyright © 2011-2022 走看看