前言 日常开发中,经常会碰到秒杀抢购等业务。为了避免并发请求造成的库存超卖 等问题,我们一般会用到redis分布式锁。但是使用redis分布式锁,很容易踩坑哦~ 本文田螺哥将给大家分析阐述,redis分布式锁的10个坑~
基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/ 1. 非原子操作(setnx + expire) 一说到实现redis的分布式锁,很多小伙伴马上就会想到setnx+ expire命令。也就是说,先用setnx来抢锁,如果抢到之后,再用expire给锁设置一个过期 时间。
伪代码如下:
if(jedis.setnx(lock_key,lock_value) == 1){ //加锁 jedis.expire(lock_key,timeout); //设置过期时间 dobusiness //业务逻辑处理} 这块代码是有坑 的,因为setnx和expire两个命令是分开写的,并不是原子操作!如果刚要执行完setnx加锁,正要执行expire设置过期时间时,进程crash或者要重启维护了,那么这个锁就“长生不老 ”了,别的线程永远获取不到锁啦。
基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/yudao-cloud 视频教程:https://doc.iocoder.cn/video/ 2. 被别的客户端请求覆盖( setnx + value为过期时间) 为了解决:发生异常时,锁得不到释放的问题 。有小伙伴提出,可以把过期时间 放到setnx的value里面。如果加锁失败,再拿出value值和当前系统时间校验一下是否过期即可。伪代码实现如下:
long expiretime = system.currenttimemillis() + timeout; //系统时间+设置的超时时间string expiretimestr = string.valueof(expiretime); //转化为string字符串// 如果当前锁不存在,返回加锁成功if (jedis.setnx(lock_key, expiretimestr) == 1) { return true;} // 如果锁已经存在,获取锁的过期时间string oldexpiretimrestr = jedis.get(lock_key);// 如果获取到的老的预期过期时间,小于系统当前时间,表示已经过期了if (oldexpiretimrestr != null && long.parselong(oldexpiretimrestr) 30ms+40ms+50ms+4m0s+50ms) 如果取到了锁,key的真正有效时间就变啦,需要减去获取锁所使用的时间。 如果获取锁失败(没有在至少n/2+1个master实例取到锁,有或者获取锁时间已经超过了有效时间),客户端要在所有的master节点上解锁(即便有些master节点根本就没有加锁成功,也需要解锁,以防止有些漏网之鱼)。 简化下步骤就是:
按顺序向5个master节点请求加锁 根据设置的超时时间来判断,是不是要跳过该master节点。 如果大于等于3个节点加锁成功,并且使用的时间小于锁的有效期,即可认定加锁成功啦。 如果获取锁失败,解锁!
EMI案例分析,这几天心里颇不宁静,采的不是信号,而是寂寞
SAW滤波器的使用和匹配
德州仪器凭借更多可用内存、Bluetooth 5兼容性以及汽车级认证拓展Bluetooth® 低功耗产品组合
全球代工巨头富士康首份年报出炉,营收破4000亿!
uClinux和Linux的差异
Redis分布式锁的10个坑
刘永好:要让年轻人上一线,没有房,他们有的是干劲
白皮书“实现高压信号隔离质量和可靠性”
RFID蔬菜供应链怎样打造绿色的生活品质
vivoXplay5怎么样 到底值不值得买
AC/DC转换器提高电源效率
华为在美国提起诉讼,挑战FCC将其列为国家安全威胁的裁决
欧司朗推出两款DisplixLED
裸眼3d技术的特征有哪些
联发科推出MT8192和MT8195芯片组
Oppo和Vivo正收缩印度分销商和零售商规模以削减支出
某新建项目中电力管理系统的研究以及应用
智能援救机器人的功能及探测应用方案
波音公司宣布将暂停737MAX飞机的生产
苹果新专利可扩大电池容量,iphone续航大升级