redis 分布式事物

实现代码

Jedis jedis = pool.getResource();
try {
    Transaction tx = jedis.multi();
    try {
        tx.get("XXX");
        tx.set("YYY","ZZZ")
        resp = tx.exec();
    } finally { tx.close(); }
} catch (Exception e) {
    // TODO
}finally { jedis.close(); }
  • 问题:
    1、客户端分片和中间件(我们目前使用的codis)分片均不支持transaction。因为transaction提供了原子级的执行保证,在instance之外是无法提供的,也就是说必须同一个reids实例上
    2、Redis Cluster集群 支持transaction,但是前提是transaction涉及的所有key都属于同一hash slot,2^14-1 16383个槽位(总)
  • 解决办法:
/**
     * 尝试获取分布式锁
     *
     * @param jedis     Redis客户端
     * @param lockKey   锁
     * @param requestId 请求标识
     * @return 是否获取成功
     */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId) {
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST(NX), SET_WITH_EXPIRE_TIME(PX), expireTime(过期时间));
        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
 /**
     * 释放分布式锁
     *
     * @param jedis     Redis客户端
     * @param lockKey   锁
     * @param requestId 请求标识
     * @return 是否释放成功
     */
    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }

解释
使用 SETNX(set if not exist)指令插入一个键值对,如果 Key 已经存在,那么会返回 False,否则插入成功并返回 True。
SETNX 指令和数据库的唯一索引类似,可以保证只存在一个 Key 的键值对,可以用一个 Key 的键值对是否存在来判断是否存于锁定状态。
EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了死锁的发生。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 9,509评论 2 27
  • Codis 3.2 部署配置汇总 概念总结 集群配置前需要了解架构,集群分片主要分三种: 客户端分片:这个需要自己...
    三杯水Plus阅读 11,346评论 0 11
  • 之前写过一篇介绍redis集群的文章,那篇可以方便大家入门,这篇是对这几个方案的原理介绍,方便对大家对这几个集群方...
    monkey01阅读 7,606评论 1 7
  • 一、Redis集群概述 Redis官方近期推出的Redis Cluster,Redis集群有三种实现机制,分别介绍...
    E狼阅读 4,522评论 2 6
  • 1.集群与分布式的概述 1.1 分布式 分布式是指将不同的业务分布在不同的地方. web应用和数据库服务分开 1....
    程序员Darker阅读 3,226评论 1 1

友情链接更多精彩内容