高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

来源:互联网 发布:淘宝达人怎么发帖子 编辑:程序博客网 时间:2024/06/06 06:32

高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存


问题描述:某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖


方案一

利用数据库锁机制,对记录进行锁定,再进行操作 

SELECT * from goods where ID =1 for update;UPDATE goods set stock = stock - 1;


利用排它锁将并行转化为串行操作,但该方案的性能和用户体验较差


方案二

利用redis 实现分布式锁,

使用setnx命令(在key不存在时,创建并设置value 返回1,key存在时,会反回0)来获取锁,在业务逻辑中,我们可以通过这样的方案来操作

    Jedis client = jedisPool.getResource();    while(client.setnx("lock",String.valueOf(System.currentTimeMillis())) == 0){        Thread.sleep(10000);    }    ...........................    client.del("lock")

方案二进阶

考虑到死锁问题,即现成A获取锁后,宕机了,导致锁一直无法释放,我们可以通过get命令获取锁的时间戳,通过他进行超时判断,并进行释放

    Long TIMEOUT_SECOUND = 120000L;    Jedis client = jedisPool.getResource();    while(client.setnx("lock",String.valueOf(System.currentTimeMillis())) == 0){        Long lockTime = Long.valueOf(client.get("lock"));        if (lockTime!=null && System.currentTimeMillis() > lockTime+TIMEOUT_SECOUND) {            client.del("lock");            }        Thread.sleep(10000);    }    ...........................    ...........................    client.del("lock")

方案二加强

方案2的算法中,为了确保在非超时情况下,锁只能由有锁的线程进行释放,可以在value的时间戳中,拼上线程特征码

    Long TIMEOUT_SECOUND = 120000L;    String featureCode = "machine01";    Jedis client = jedisPool.getResource();    while(client.setnx("lock",featureCode+":"+String.valueOf(System.currentTimeMillis())) == 0){        Long lockTime = Long.valueOf(client.get("lock").substring(9));        if (lockTime!=null && System.currentTimeMillis() > lockTime+TIMEOUT_SECOUND) {            client.del("lock");            }        Thread.sleep(10000);    }    ...........................    ...........................    if (featureCode.equals(client.get("lock").substring(0, 8))) {        client.del("lock");        }

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 容易中暑的人该怎么办 喷泡3m反光脏了怎么办 新摩托车被交警查到怎么办 写字楼保安夜班巡逻害怕怎么办 全民k歌歌曲删了怎么办 莲藕洞里的黑膜怎么办 鞋子后面的拉链磨脚怎么办 磨砂鞋尖踢掉皮怎么办 塔吊吊装过程中遇到障碍物怎么办 高速路上突然遇到障碍物怎么办 被不明物蛰了怎么办 喝酒后开车撞路政护栏怎么办 电脑过了质保期怎么办 电闸推不上去怎么办啊? 寝室的电闸不亮了怎么办 海绵城市改造只挖不修怎么办 怀孕一个月做了胸透怎么办 怀孕了照了胸透怎么办 刚怀孕照了胸透怎么办 怀孕进了ct室怎么办 消防稳压罐气囊压力不够怎么办 备孕期间拍了ct怎么办 晚上睡不好老做梦怎么办 零线和地线短路怎么办 火花塞拧的过紧怎么办 眼睛被电弧光灼伤怎么办 电脑模拟器微信附近人屏蔽了怎么办 美的电压锅漏气怎么办 电压力锅排气阀漏气怎么办 win10系统上不了网怎么办 手机自拍杆坏了怎么办 车辆遭核生化打击时怎么办? 遭核生化打击时怎么办? 车辆行驶中遭核生化打击时怎么办? 硫酸气体熏到嗓子怎么办 硫酸味儿进嗓子了怎么办 吸入二氧化氯气体后怎么办 衣服84消毒 变色了怎么办 我的身份证被诈骗犯知道了怎么办 母婴店来客人少怎么办 键盘驱动被卸载了怎么办