Redis 面试必备 > 分布式锁和一致性hash
分布式锁应用场景-世界杯优惠券活动

微信给了 A公司300w 微信代金券(金额分别有88 50 10  5 3) 做世界杯活动 , 世界杯活动的持续时间是 30天 ,要保证用户在每天支付后都可以通过抽奖领到代金券,   这时候需要控制每天发出去代金券的最大金额不能超过 300w/30  = 10w .


抽奖服务分布在10台机器上 .这时候可以使用上分布式锁防止 每天抽奖金额 过多.


1.  使用redis   记录一个 当前发放总额的key Amount ,

2.  每个抽奖的请求过来后 使用redis  set  命令加索

具体实现

所有请求去 使用 redis     set key value [EX seconds] [PX milliseconds] [NX|XX] 命令

set   ActivityLock  requestId   Ex  10   NX

命令解释:   让每个请求都去获取 ActivityLock  , 加上NX表示只有但 redis key不存在或者过期了才能获取到key , 加上Ex 10 是为了防止当前请求在的机器挂了后可以释放掉锁,

3. 执行业务上逻辑

4. 获取 Amount  判断当天是否金额足够,不足够直接返回 释放锁

5.  如果金额足够 使用redis 提供的lua 脚本修改 Amount金额 并且释放锁

6  释放锁: 释放锁的时候需要 获取ActivityLock值, 判断是否和当前请求的requestid 一致 防止误删除.

7 根据redis上面命令执行结果 判断是够要真的给用户下发优惠券

需要注意:

1  requestId 需要时唯一

2. 释放锁和修改金额需要使用redis 提供的lua脚本 ,目的是为了实现原子性,这里执行