使用lua+redis的方法。之所以使用lua是为了保证原子性

问题:

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

针对问题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);

 

转载于:https://www.cnblogs.com/linn/p/11045565.html

REDIS中加锁和解锁问题相关推荐

  1. UNIX操作系统中加锁和解锁

    Unix操作系统加锁和解锁的基本思想是,当某个进程进入临界区,它将持有一个某种类型的锁(UNIX里一般来说是semaphore,Linux里一般是信号量和原子量或者spinlock).当其他进程在该进 ...

  2. Redis实现分布式锁:加锁、解锁、续租和一致

    目录 分布式锁及其应用场景 为何需要分布式锁 分布式锁的特性 互斥性 不死锁 一致性 可重入性 支持阻塞和非阻塞: 支持公平锁和非公平锁(可选) 使用原生Redis实现分布式锁 加锁 解锁 续租 如何 ...

  3. 使用redis的setnx可以非同一线程进行加锁和解锁(附源码)

    使用redis的setnx可以非同一线程进行加锁和解锁(附源码) 问题背景 项目搭建 总结 Lyric: 那在终点之前 问题背景 Redisson做分布式锁是目前比较流行的方式,但是在使用的过程中遇到 ...

  4. redis加锁、解锁

    在Java中,关于锁我想大家都很熟悉.在并发编程中,我们通过锁,来避免由于竞争而造成的数据不一致问题.通常,我们以synchronized .Lock来使用它. 但是Java中的锁,只能保证在同一个J ...

  5. jedis对redis键加锁+解锁+事务提交

    [README] redis的java客户端对键加锁和解锁(Jedis.watch()   Jedis.unwatch()  ): [1]代码 /*** redis加锁-watch * [场景描述]: ...

  6. 【面试题】Redis中是如何实现分布式锁的

    分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. Redis的分布式锁 Redis要实现分布式锁,以下条件应该得到满足 互斥性:在任意时刻, ...

  7. redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面 ...

  8. Redis初学:14(Redis中的事务)

    Redis中的事务 Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. Redis事务的主 ...

  9. java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

    前言 为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantRead ...

  10. ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述)

    - title: ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述) - date: 2021/8/16 文章目录 一.ReentrantLock 1. 构造函数 二.Reentr ...

最新文章

  1. 创建物化视图commit_oracle 中物化视图讲解
  2. 大家都来说说为什么要学习jQuery Mboile?
  3. Android自定义绘制 绘制基础
  4. 潭州Java中级班(day_04)
  5. springmvc参数绑定
  6. 获取控制器 nextResponder的简单应用
  7. 程序员:你的业余时间是怎么被浪费掉的?
  8. Vim winmanager文件浏览自动更新
  9. redis常用命令(基础篇)
  10. VS+Qt报错无法解析的外部符号
  11. java数字的实验怎么做_java实验题目
  12. 基于正点原子STM32F407开发板源码和贪吃蛇程序
  13. windows 豆沙绿参数
  14. localStorage的使用方法
  15. ssb门限_ssb单边带的产生方法
  16. 三炮的三舅走了,才发觉日子真的不经念叨呀!
  17. 区块链钱包—BTC Java版离线签名交易
  18. 最新版Jenkins 2.249.3的安装
  19. 【146】LRU缓存机制
  20. 【JNLP】什么是JNLP

热门文章

  1. 宜信正式开源其 AIOps 落地三大利器
  2. 一份清单:所有可以放进head标签的元素
  3. Hibernate4.3注解常见错误
  4. [编程语言]C陷阱与缺陷
  5. linux下查找文件、排序、查看文件内容
  6. 工作的思考十:思维的高度决定设计的好坏(小菜的思维)
  7. Wireshark实战分析值ICMP协议(一)
  8. linux内核分析及应用 -- Linux 的进程隔离技术与 Docker 容器
  9. KVM 介绍(5):libvirt 介绍 [ Libvrit for KVM/QEMU ]
  10. 学习OO,实现的小跟堆代码