博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis分布式锁的具体应用
阅读量:7103 次
发布时间:2019-06-28

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

1、关于redis分布式锁,有个setIfAbsent:

即如果没有设置,会添加分布式锁,并返回true;

2、redis分布式锁有个轮询过程:

 /* @param key redis键* @param expire 键过期时间(单位:毫秒)* @param timeout 超时时间(单位: 毫秒) * @return true表示加锁成功,false表示加锁失败 */public boolean lock(String key, long expire, long timeout) {    timeout *= 1000*1000; //一般用常量表示,进行毫秒与纳秒之间的转换    long nanoTime = System.nanoTime();    try {        //在timeout的时间范围内不断轮询锁        while (System.nanoTime() - nanoTime < timeout) {            //锁不存在的话,设置锁并设置锁过期时间,即加锁            Boolean isSuccess = redisTemplate.opsForValue().setIfAbsent(key, RedisLock.LOCKED);            if (isSuccess) {                //设置锁过期时间是为了在没有释放锁的情况下锁过期后消失,不会造成永久阻塞                redisTemplate.expire(key, expire, TimeUnit.MILLISECONDS);                this.lock = true;                return true;            }            //短暂休眠,避免可能的活锁            Thread.sleep(3, RANDOM.nextInt(30));        }    } catch (Exception e) {        throw new RuntimeException("locking error",e);    }    return false;}

 3、设置分布式锁,一般而言,分布式锁只做判断,具体我们还要使用redis进行一个设置key的过程,这样也类似于另一把锁:

  为什么要使用另一把锁呢?其实分布式锁只是为了解决几个程序间同时操作的问题,它的时间非常不好控制,当我们有了另一把锁就可以轻易地去控制锁的时间,

lockkey = RedisKeyConstants.LOCK_PREFIX + ":" + redisKey;            redisLock.lock(lockkey, RedisKeyConstants.LOCK_ROUTE_GEN_EXPIRE_TIME, RedisKeyConstants.LOCK_ROUTE_GEN_TIMEOUT_TIME);            //判断redis中是否有数据            String redisValue = redisTemplate.opsForValue().get(redisKey);            if (redisValue != null) {                return;            }            redisTemplate.opsForValue().set(redisKey, "1", RedisKeyConstants.ROUTE_TYPE_GEN_EXPIRE_TIME, TimeUnit.SECONDS);

 4、程序结束后一定要在finally代码块中释放锁,这样就好了; 

finally {            redisTemplate.delete(redisKey);            redisLock.unlock(lockkey);        }

 5、防止程序出现bug,所以我们设置另一把锁的失效时间为半个小时;

 

 

需要考虑的问题:

1、多台服务器的时间有误差;

2、人工触发;

3、服务器宕机;

转载于:https://www.cnblogs.com/gendway/p/10497922.html

你可能感兴趣的文章
APPSTORE时下热门应用数量
查看>>
Android自定义View的实现 (重要的内容)
查看>>
Redis被bgsave和bgrewriteaof阻塞的解决方法
查看>>
Boost::filesystem 使用小笔记
查看>>
java毕业设计自学入门教程
查看>>
为什么传统的婚姻和家庭会消解?
查看>>
Linode使用记录
查看>>
使用jconsole和jvisualvm检测jvm性能
查看>>
JAVA语言泛型编程实现单例模式
查看>>
magento中csv文件表格制作容易出现的问题
查看>>
python文件读取并使用mysql批量插入
查看>>
python
查看>>
HTTPS SSL免费证书生成
查看>>
Linux下卸载和安装MySQL[rpm包]
查看>>
Xcode 自带git 使用,忽略用户数据
查看>>
title: Spring Security源码分析七:Spring Security 记住我
查看>>
【原创】图解 hotwheels
查看>>
Git提交与更新
查看>>
自定义类实现基于数组/字典Literal Syntax设置和获取数据
查看>>
iOS开发22:SandBox的结构
查看>>