博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis分布式锁
阅读量:4914 次
发布时间:2019-06-11

本文共 1585 字,大约阅读时间需要 5 分钟。

一、实现分布式锁的方式

1. 数据库乐观锁

2. Redis分布式锁

3. zookeeper分布式锁

 

二、锁的条件

1. 互斥性

2. 不会发生死锁

3. 容错性

4. 加锁和解锁必须是同一个客户端

 

三、加锁

jedis.set(key,value,NX,PX,time) 保证原子性,value为请求id保证解锁的也是同一个客户端

public class RedisTool {    private static final String LOCK_SUCCESS = "OK";    private static final String SET_IF_NOT_EXIST = "NX";    private static final String SET_WITH_EXPIRE_TIME = "PX";    /**     * 尝试获取分布式锁     * @param jedis Redis客户端     * @param lockKey 锁     * @param requestId 请求标识     * @param expireTime 超期时间     * @return 是否获取成功     */    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);        if (LOCK_SUCCESS.equals(result)) {            return true;        }        return false;    }}

 

 

四、解锁

jedis.eval(),使用Lua脚本,保证原子性,和解锁的是同一个客户端

public class RedisTool {    private static final Long RELEASE_SUCCESS = 1L;    /**     * 释放分布式锁     * @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;    }}

 

 

参考:

 

转载于:https://www.cnblogs.com/june0816/p/11388246.html

你可能感兴趣的文章
ASP.NET Core 应用程序Startup类介绍
查看>>
【python】-类的继承
查看>>
同一个POD中默认共享哪些名称空间
查看>>
HTTP协议详解
查看>>
xdebug调试的原理
查看>>
php 日期时间运算比较
查看>>
C#类、接口、虚方法和抽象方法
查看>>
Linq C#增删改查
查看>>
[转]第一章 Windows Shell是什么 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...
查看>>
iOS获取设备UUID和IDFA
查看>>
模糊查询
查看>>
linux 出现:-bash-3.2$提示符
查看>>
jsp电子商务 购物车实现之二 登录和分页篇
查看>>
科普:搜索引擎的基本工作原理
查看>>
Docker Compose 原理
查看>>
mongodb index 的background 及集群的索引建立
查看>>
判断两个控件在同一个Window上是否有重叠
查看>>
Android+Jquery Mobile学习系列(3)-创建Android项目
查看>>
android:inputType参数类型说明
查看>>
android 抽屉式滑动demo
查看>>