栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis 实现复合操作 Compare And Set

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis 实现复合操作 Compare And Set

  在笔者的上一篇文章 《Redis Lua 脚本常用操作总结及实现 CAS 操作》中,总结了 Redis 使用 Lua 脚本的一些常用命令及实际使用时的语法示例。在实际 Java 项目中,可以通过 Jedis、redisson 或者 springboot 中的 redisTemplate 等操作 Redis。本文以 Jedis 为例,总结下 Java 项目调用 Redis Lua 脚本实现 CAS 复合操作的用法。

一、Redis Lua 脚本执行 setex 命令,实现比较更新,并设置过期时间

  在一些场景中,需要先获取 key 值,当 key 值等于某一数值时,才会把该 key 的数值更新为某一个新值,即 CAS (compare and set 问题)。这种乐观锁的思想可以实现分布式锁,通过判断是否更新成功来判断线程是否获取到锁。
  在 Redis 中,采用下述 lua 脚本即可实现。

# 设置 testkey 键的值为 testvalue,键的过期时间为 600 秒
127.0.0.1:6379> setex testkey 600 testvalue
OK
127.0.0.1:6379> eval "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('setex', KEYS[1], ARGV[2], ARGV[3]) else return 0 end" 1 testkey testvalue 600 newvalue
OK
127.0.0.1:6379> ttl testkey
(integer) 594
二、Jedis 调用 Lua 脚本实现 CAS 复合操作

  Jedis 提供了很多调用 Lua 脚本的 API,通过 eval() 方法可以直接调用脚本,也可以通过 evalsha() 方法调用脚本的 SHA1 校验和,同时 Jedis 也提供了其它判断脚本是否存在,以及清空脚本的方法。下方代码采用直接通过 eval() 调用 lua 脚本的方式实现 CAS 复合操作。

	
    public Boolean comAndSet(String key, String oldValue, String expireTime, String newValue) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource(); // 获取资源
            String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('setex', KEYS[1], ARGV[2], ARGV[3]) else return 0 end";
            List argv = new ArrayList<>();
            argv.add(oldValue);
            argv.add(expireTime);
            argv.add(newValue);
            Object result = jedis.eval(script, Collections.singletonList(key), argv);
            log.info("CAS更新结果: " + result);
            return "OK".equals(result);
        } catch (Exception e) {
            log.error("create redis connect fail!", e);
            return false;
        } finally {
            if (jedis != null) {
                jedis.close(); // 释放连接
                log.trace("Jedis connection releases successfully!");
            }
        }
    }

  此处省略了初始化 Jedis 的方法,具体实现时可以参考:jedis连接redis集群。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/978762.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号