RedisTemplate实现Redis锁
Redis锁
项目中使用redis锁主要是依据 redis setnx命令的特性(SETNX:在指定的 key 不存在时,为 key 设置指定的值。 设置成功,返回 1 设置失败,返回 0 )
实现Redis锁方式
实现Redis锁方式有很多比如:1.采用lua脚本方式,项目中采用执行lua脚本的方式获取锁跟释放锁2.整合jedis执行 SETNX 3.整合redistemplate 执行SETNX这几种方法都可已实现redis锁
Redis锁代码
@SpringBootTest
class RedislockApplicationTests {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 公共锁key*/private final String LOCK_KEY = "lock";private final String VALUE = "value";@Testpublic void redisLockTest(){//获取锁,设置有效期,防止程序异常没有释放锁导致死锁try {Boolean b = redisTemplate.opsForValue().setIfAbsent(LOCK_KEY, VALUE,Duration.ofSeconds(10));if (b){//获取锁成功//执行业务逻辑}else {//获取锁失败//快速失败,响应给客户端}}finally {//释放锁redisTemplate.delete(LOCK_KEY);}}
}
Redis锁几个问题
1.程序异常报错没有释放锁怎么办?
案例中是采用了给key设置有效期,当程序报错没有释放锁时key可以自动过期,但是这里有个弊端是key的过期时间怎么才能设置的更合理
2.如果一个请求更新缓存的时间比锁的有效期还要长,导致在缓存更新过程中锁就失效了,此时另一个请求就会获取到锁,但前一个请求在缓存更新完毕的时候,直接删除锁的话就会出现误删其它请求创建的锁的情况。所以要避免这种问题,可以在创建锁的时候需要引入一个随机值并在删除锁的时候加以判断
@SpringBootTest
class RedislockApplicationTests {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 公共锁key*/private final String LOCK_KEY = "lock";@Testpublic void redisLockTest(){//获取锁,设置有效期,防止程序异常没有释放锁导致死锁UUID uid = UUID.randomUUID();String str = uid.toString();try {Boolean b = redisTemplate.opsForValue().setIfAbsent(LOCK_KEY, str,Duration.ofSeconds(10));if (b){//获取锁成功//执行业务逻辑}else {//获取锁失败//快速失败,响应给客户端}}finally {//释放锁if (str.equals(redisTemplate.opsForValue().get(LOCK_KEY))){redisTemplate.delete(LOCK_KEY);}}}
}
3.假如1000个人同时发出请求,第一时间只会有一个请求获取到锁执行业务逻辑,获取锁失败的请求怎么办?
案例中没有获取到锁的请求是通过快速失败的策略,没有获取到锁直接响应如:当前排队人数较多,请稍后再试诸如此类的话语.但是这样用户体验很差
方式二 : 没有获取到锁的请求采用轮询的方式处理,这样增加了CPU压力
Redis锁优点
redis锁相对于zookeeper锁实现简单,相对于基于DB的乐观锁执行效率快
RedisTemplate实现Redis锁相关推荐
- synchronized、Lock和 redis锁,基于redis实现的扣减库存锁(附代码)
目录 锁的概念 公平锁 可中断锁 可重入锁 几种加锁方式 synchronized Lock Lock接口的6个方法: Lock的实现类 ReentrantLock 可重入锁 ReadWriteLoc ...
- redis RedisTemplate实现分布式锁
2019独角兽企业重金招聘Python工程师标准>>> 话不多说,上代码: import org.springframework.beans.factory.annotation.A ...
- 使用RedisTemplate实现Redis分布式锁出现的一些列问题(避坑)
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/lmx125254/ article/details/89604638 自己的项目因为会一直抓取某些信息,但是本地会和线上经常一 ...
- Redis redisTemplate.execute 执行锁
Redis 脚本执行redis锁代码如下: /*** 加锁*/public final static String SCRIPT_LOCK = "local key = KEYS[1];\n ...
- 借助Redis锁,完美解决高并发秒杀问题
欢迎关注方志朋的博客,回复"666"获面试宝典 场景:一家网上商城做商品限量秒杀. 1 单机环境下的锁 将商品的数量存到Redis中.每个用户抢购前都需要到Redis中查询商品数量 ...
- 必看企业级Redis锁资产巡检扫描业务场景实现(加锁限制扫描次数)
Redis实现资产巡检扫描 前言 一.需求一:限制扫描次数 1.1 业务分析 1.2 代码实现 二.需求二:限制同一个位置同一时间只能有一个人扫描 1.1 业务分析 1.2 伪代码实现 1.3 具体代 ...
- redis锁和分布式锁的实现
redis环境搭建 redis在java.spring.springboot中的实现 redis锁 1.添加依赖 <dependency><groupId>org.spring ...
- java加redis锁
redis锁的作用: 防止接口重复提交数据 maven包: <dependency><groupId>org.redisson</groupId><artif ...
- 通过Expire实现Redis锁机制
在我们的业务系统中,可能因为某种原因,用户会不断的点击表单提交按钮,为了较少对系统的 无意义访问.暴力提交 以及用户体验,我们利用redis的过期时间简单的实现了一种Redis锁 当用户提交表单的时候 ...
最新文章
- 我拍了拍 Redis,没想到被移出了群聊......
- 她说要介绍10000个开源项目?来!我们一起监督!
- 【Java】Servlet 工作原理解析
- Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
- POI操作Excel常用方法总结
- 力扣1523.在区间范围内统计奇数数目Count Odd Numbers in an Interval Range
- Java并发编程的艺术笔记(四)——ThreadLocal的使用
- 【BZOJ3631】松鼠的新家 树链剖分
- 打破思维定势,创新景区门票网络分销模式
- 跨模态神经搜索实践VCED CLIP简介
- 签约沈腾、贾玲,苏宁拼购打造下沉市场“新引擎”
- 用python玩转数据慕课答案_大学慕课用Python玩转数据章节测验答案
- 主流mes厂商_国内主流MES厂商排名报告
- 我们谈谈面试技巧(初入职场年轻人该学的)
- 从芯片设计到电磁炮的解决方案
- 数学合集——杨子曰数学
- ffmpeg在window下的编译
- 当当网“夫妻店”官宣分手,李国庆欲以区块链DAPP开启第二春
- 优思学院|2022年获美质协ASQ和ILSSI奖项的《精益六西格玛的十条戒律》
- 【MacOS】macos Ventura使用BetterDummy在2k屏幕实现HiDPI缩放屏幕