redis setnx 锁在单机架构中使用示
应用场景
- 在应用系统中,在涉及对数据库增删改的情况下,即使前端做了相关限制,还是有可能因为网络或异常操作产生并发重复调用的情况,导致对相通记录进行重复处理
- 高并发情况下,在请求的接口中对数据有增删改的情况下
3.为了防止这种情况对系统造成异常影响,我们通过Redis实现了一个简单的锁,每个请求需先获取锁才能执行业务逻辑,执行结束后才会释放锁;保证了同一数据的并发重复操作请求只有一个请求可以获取到锁(依赖Redis的单线程)
场景示例
模拟简单的下单减库存的场景,使用ab压力测试模拟并发请求。
- 数据库中good_id =1 商品剩余库存 10
- 模拟100次请求 ,每次并发 10个请求
# 模拟50次请求 ,每次并发 5个请求
ab -n 50 -c 5 127.0.0.1:80/redis-lock/index.php
在代码中将$flag设置为false 如 图-05,不使用redis setnx , 模拟并发请求前库存剩余10件 如: 图-01 所示,模拟并发请求后,库存剩余 0件 如:图-02 所示, 生成的用户定单 如:图-03所示,此时下单记录总商品数为13 如:图-04 所示, 下单数 13 大于 库存数据10,并发情况下出现超买的情况
使用 setnx
# 开启redis的setnx 使用redis锁,进行模拟并发请求
ab -n 50 -c 5 127.0.0.1:80/redis-lock/index.php
如图-06 所示在代码中将 $flag 设置为 true,开启redis 的setnx,模拟并发请求,如图-07 ,图-08 所示,没有出现超买的情况
核心代码示例:
如图-10 核心代码示例,是进行获取锁,设置锁,和解锁
如图-09 所示 是在业务处理开始首先进行锁的判断处理,当前进程只有获取锁成功才能进行业务处理,否则将终止程序的运行