1. redis加锁分类

  1. redis能用的的加锁命令分表是INCRSETNXSET

2. 第一种锁命令INCR

这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。 
然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中。

1、 客户端A请求服务器获取key的值为1表示获取了锁2、 客户端B也去请求服务器获取key的值为2表示获取锁失败3、 客户端A执行代码完成,删除锁4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功5、 客户端B执行代码完成,删除锁$redis->incr($key);$redis->expire($key, $ttl); //设置生成时间为1秒

3. 第二种锁SETNX

这种加锁的思路是,如果 key 不存在,将 key 设置为 value 
如果 key 已存在,则 SETNX 不做任何动作

 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败客户端A执行代码完成,删除锁客户端B在等待一段时间后在去请求设置key的值,设置成功客户端B执行代码完成,删除锁$redis->setNX($key, $value);$redis->expire($key, $ttl);

4. 第三种锁SET

上面两种方法都有一个问题,会发现,都需要设置 key 过期。那么为什么要设置key过期呢?如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防不测。 
但是借助 Expire 来设置就不是原子性操作了。所以还可以通过事务来确保原子性,但是还是有些问题,所以官方就引用了另外一个,使用 SET 命令本身已经从版本 2.6.12 开始包含了设置过期时间的功能。

1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败3、 客户端A执行代码完成,删除锁4、 客户端B在等待一段时间后在去请求设置key的值,设置成功5、 客户端B执行代码完成,删除锁$redis->set($key, $value, array('nx', 'ex' => $ttl)); //ex表示秒

5. 其它问题

虽然上面一步已经满足了我们的需求,但是还是要考虑其它问题? 
1、 redis发现锁失败了要怎么办?中断请求还是循环请求? 
2、 循环请求的话,如果有一个获取了锁,其它的在去获取锁的时候,是不是容易发生抢锁的可能? 
3、 锁提前过期后,客户端A还没执行完,然后客户端B获取到了锁,这时候客户端A执行完了,会不会在删锁的时候把B的锁给删掉?

6. 解决办法

针对问题1:使用循环请求,循环请求去获取锁 
针对问题2:针对第二个问题,在循环请求获取锁的时候,加入睡眠功能,等待几毫秒在执行循环 
针对问题3:在加锁的时候存入的key是随机的。这样的话,每次在删除key的时候判断下存入的key里的value和自己存的是否一样

do { //针对问题1,使用循环$timeout = 10;$roomid = 10001;$key = 'room_lock';$value = 'room_'.$roomid; //分配一个随机的值针对问题3$isLock = Redis::set($key, $value, 'ex', $timeout, 'nx');//ex 秒if ($isLock) {if (Redis::get($key) == $value) { //防止提前过期,误删其它请求创建的锁//执行内部代码Redis::del($key);continue;//执行成功删除key并跳出循环}} else {usleep(5000); //睡眠,降低抢锁频率,缓解redis压力,针对问题2}} while(!$isLock)

redis实现分布式锁的几种方式相关推荐

  1. Java实现分布式锁的三种方式

    文章目录 前言 一.基于数据库实现分布式锁 二.Redisson实现分布式锁 三.Zookeeper实现分布式锁 四.总结 前言 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问 ...

  2. Redis实现分布式锁的7种方案

    https://www.cnblogs.com/wangyingshuo/p/14510524.html 七种方案前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适 ...

  3. redisson版本_Redisson实现Redis分布式锁的N种姿势

    来源:公众号 阿飞的博客 , 作者 阿飞的博客 前几天发的一篇文章<Redis分布式锁最牛逼的实现>,引起了一些同学的讨论,也有一些同学提出了一些疑问,这是好事儿.本文在讲解如何使用Red ...

  4. Redisson实现Redis分布式锁的N种姿势

    点击蓝色"程序猿DD"关注我哟 来源:阿飞的博客 前几天发的一篇文章<Redlock:Redis分布式锁最牛逼的实现>,引起了一些同学的讨论,也有一些同学提出了一些疑问 ...

  5. Redis之分布式锁

    # 基于 Redis 实现分布式锁的三种方案 用 Redis 实现分布式锁的正确姿势(实现一) 用 Redisson 实现分布式可重入锁(RedissonLock)(实现二) 用 Redisson 实 ...

  6. **Java有哪些悲观锁的实现_80% 人不知道的 Redis 分布式锁的正确实现方式(Java 版)...

    点击上方"小哈学Java",选择"星标" 回复"资源",领取全网最火的Java核心知识总结 来源:http://sina.lt/gfZU 前 ...

  7. 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...

    面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...

  8. Redis分布式锁【正确实现方式】

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  9. Redis分布式锁的正确实现方式(Java版)

    转自:https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于 ...

  10. 分布式锁的3种实现(数据库、缓存[redis]、Zookeeper)

    锁是开发过程中十分常见的工具,在处理高并发请求的时候和订单数据的时候往往需要锁来帮助我们保证数据的安全. 一.分布式锁的场景 场景1.前端点击太快,导致后端重复调用接口.两次调用一个接口,这样就会产生 ...

最新文章

  1. vi 搜索命令_vi或vim如何查询关键字
  2. MariaDB Galera Cluster with HA Proxy and Keepalived on Cents 6
  3. 槽函数会被执行多次的问题原因及解决方法
  4. 中装订线位置_企业宣传画册、产品目录常用的装订方法
  5. 水题 UVA 1586 - Ancient Cipher化学式分子量计算
  6. 信息学奥赛C++语言: 小明的步行
  7. jenkins配置ssh免密码登陆
  8. 内存颗粒和闪存颗粒的区别_NAND Flash闪存颗粒与SSD知识深度解析
  9. HDU 3240 Counting Binary Trees 数论-卡特兰数
  10. 海康相机回调方式理一下
  11. 在windows上删除linux文件夹,java-如何从Linux删除远程Windows中的文件夹
  12. Junit 单元测试以及断言
  13. python学生管理系统毕业设计flask_python+flask实现简单的web端学生管理系统
  14. 推荐三款最好用的压缩/解压软件
  15. 高数_第6章无穷级数__正项级数的性质_比值_比较_根值_极限审敛法
  16. 浏览器在线视频播放加速方法——直接修改网页代码实现加速
  17. RHCE(五)HTTP、SSL协议综合实验
  18. colormap保存 matlab_[转载]matlab的colormap的保存
  19. link rel=canonical概念和用法(增加页面权重,利于排名)
  20. 【浙江大学】一个开源的知识图谱表示学习框架

热门文章

  1. Kali扫描 vega的使用
  2. 有哪些防护措施可以解决DDOS攻击?
  3. 2021-07-15-2021年全球10大最佳单板计算机开发板(SBC)(第1-3名)
  4. “免费代理IP” 又双叒叕来了,这次无限量、更稳定。(附带使用教程)
  5. 仿真软件proteus构建LCD1602四线驱动实验
  6. 根据android版本号,增加兼容性处理
  7. 保研经历总结--天津大学
  8. Flink StreamingFileSink写入hdfs,文件一直处于inprogress
  9. 计算机项目符号操作,word项目符号和编号的操作方法-word技巧-电脑技巧收藏家...
  10. 前端几种本地缓存机制