最近在开发中涉及到了多个客户端的对redis的某个key同时进行增删的问题。这里就会涉及一个问题:锁
先举例不加锁会出现问题:
redis中存放了某个用户的账户余额 ,例如100 (用户id:余额)
A端需要对用户扣费-1,需要两步,1.将该用户的目前余额取出来(100) 2.将余额扣除一部分(99)后再插入到redis中
B端需要对用户充值+10,需要两部,1.将该用户的目前余额取出来(99)2.将余额添加充值额度(109)后再插入到redis中
我们的期望执行顺序是A1、A2、B1、B2 结果就会是109
但是如果不加锁,就会出现A1、B1、A2、B2(110)或者其他各种随机情况,这样就会造成数据错误。
Redis加锁的几种实现方式
方式一,自己实现
使用set命令:SET key value [EX seconds] [PX milliseconds] [NX|XX]
代码参考redis官网:https://redis.io/topics/distlock