Redis分布式锁

栏目: 数据库 · 发布时间: 4年前

内容简介:redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.采用通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.

redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.

采用 单进程单线程 模型,并发能力强大,主流的分布式缓存工具。

加锁

通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.

注意点

  • 1.必须给锁加一个失效时间,避免死锁.
  • 2.加锁时,每个节点产生一个随机字符串,避免误删锁.

比如:A节点加锁并设置有效时间,A未执行完毕但是锁已经失效了,B节点趁机加锁,此时A节点准备执行解锁动作,若AB节点加锁写入的值相等的话会造成A节点去解锁B节点的锁,显然不行.

  • 3.写入随机值与设置有效时间必须同时的,是原子操作,防止未设置有效时间.setnx命令

maven依赖:

<dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.7.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

解锁

匹配随机值,删除 redis 上的特定key的数据,要保证删除动作是原子的,即获取数据丶判断一致丶及删除数据三个操作是原子的。执行如下 lua 脚本:

ARV[1]是value值

if redis.call("get",KEYS[1])==ARGV[1] then

return redis.call("del",KEYS[1])

else

return 0

end

lua脚本丢到服务器上,它认为是一个操作序列不可分开的序列,redis介绍时说过是一个单进程单线程模型,这点要牢牢记住,因此会通过一个线程执行这个脚本之后才会去处理别的请求,因此保证了lua脚本保证了原子性.

代码实现:

加锁:

public boolean tryLock() {
    //随机生成字符串
    String uuid= UUID.randomUUID().toString();
    //获取redis原始链接
    Jedis jedis = redisManager.getJedis();
    //使用setnx命令请求写值,并设置有效时间
    String ret=jedis.set(KEY,uuid,"NX","PX",1000);
    if("OK".equals(ret)){
        //供给unlock时从threadLocal获取此值,Thread完成数据共享
        local.set(uuid);
        return  true;
    }
    return false;
}

解锁:

public void unlock() {

        //读取lua脚本
        String script= FileUtils.readFileByLines("lua脚本路径");
        Jedis jedis=redisManager.getJedis();
         //链接redis执行Lua脚本,value值无法从unlock方法入参了,因此用threadLocal来获取
        jedis.eval(script, Arrays.asList(KEY),Arrays.asList(local.get()));
        
    }

这里是简单的代码实现具体讲怎么用jedis执行对应的方法,方法不齐的可以自行查阅资料

顺便简单讲下ThreadLoacl
//1/做线程级的数据传递,在spring.mybatis随处可见
//2.比如spring的事务传播属性就是通过threadLocal来传递的
//3.tomcat的session也是放在threadLoacl的
private static ThreadLocal<String> local = new ThreadLocal<>();

以上所述就是小编给大家介绍的《Redis分布式锁》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

移动风暴

移动风暴

[美]弗雷德·沃格尔斯坦 / 朱邦芊 / 中信出版社 / 2014-1-1 / 39

也许,除了伟大的乔布斯,每一位奋力改变世界的硅谷英雄,都值得我们肃然起敬。苹果与谷歌十年博弈,关于这场移动平台战争的报道早已铺天盖地,而这是第一次,我们能听到幕后工程师的真实声音。两大科技巨人用智能手机和平板电脑颠覆了电脑产业。它们位处变革的中心,凭借各自的经营哲学、魅力领袖和商业敏感度,把竞争变成了残酷对决。商业记者沃格尔斯坦报道这场对抗已逾十载,在《移动风暴》中,他带领我们来到一间间办公室和会......一起来看看 《移动风暴》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具