高并发Redis锁使用案例

redis setnx 锁在单机架构中使用示

应用场景

  1. 在应用系统中,在涉及对数据库增删改的情况下,即使前端做了相关限制,还是有可能因为网络或异常操作产生并发重复调用的情况,导致对相通记录进行重复处理
  2. 高并发情况下,在请求的接口中对数据有增删改的情况下

3.为了防止这种情况对系统造成异常影响,我们通过Redis实现了一个简单的锁,每个请求需先获取锁才能执行业务逻辑,执行结束后才会释放锁;保证了同一数据的并发重复操作请求只有一个请求可以获取到锁(依赖Redis的单线程)

图片.png

redis命令参考

场景示例

模拟简单的下单减库存的场景,使用ab压力测试模拟并发请求。

  1. 数据库中good_id =1 商品剩余库存 10
  2. 模拟100次请求 ,每次并发 10个请求
# 模拟50次请求 ,每次并发 5个请求
ab  -n 50 -c 5 127.0.0.1:80/redis-lock/index.php
图-01.png
图-02.png
图-03.png
图-04.png
图-05.png

在代码中将$flag设置为false 如 图-05,不使用redis setnx , 模拟并发请求前库存剩余10件 如: 图-01 所示,模拟并发请求后,库存剩余 0件 如:图-02 所示, 生成的用户定单 如:图-03所示,此时下单记录总商品数为13 如:图-04 所示, 下单数 13 大于 库存数据10,并发情况下出现超买的情况

使用 setnx

图-06.png
图-07.png
图-08.png
# 开启redis的setnx 使用redis锁,进行模拟并发请求
ab  -n 50 -c 5 127.0.0.1:80/redis-lock/index.php

如图-06 所示在代码中将 $flag 设置为 true,开启redis 的setnx,模拟并发请求,如图-07 ,图-08 所示,没有出现超买的情况

核心代码示例:

图-9.png
图-10.png

如图-10 核心代码示例,是进行获取锁,设置锁,和解锁
如图-09 所示 是在业务处理开始首先进行锁的判断处理,当前进程只有获取锁成功才能进行业务处理,否则将终止程序的运行

源码克隆示例:

你可能感兴趣的:(高并发Redis锁使用案例)