首页 数据库 Redis redis怎么加锁

redis怎么加锁

Jun 05, 2019 pm 02:49 PM

本文主要给大家介绍了关于redis实现加锁的几种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

redis怎么加锁

redis加锁分类

redis能用的的加锁命令分表是INCR、SETNX、SET

第一种锁命令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秒
登录后复制

第二种锁SETNX

这种加锁的思路是,如果 key 不存在,将 key 设置为 value

如果 key 已存在,则 SETNX 不做任何动作

1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功

2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败

3、 客户端A执行代码完成,删除锁

4、 客户端B在等待一段时间后在去请求设置key的值,设置成功

5、 客户端B执行代码完成,删除锁

$redis->setNX($key, $value);
$redis->expire($key, $ttl);
登录后复制

第三种锁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表示秒
登录后复制

以上是redis怎么加锁的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Redis不同版本兼容性如何 Redis不同版本兼容性如何 Mar 04, 2025 pm 05:57 PM

本文解决了Redis版本的兼容性挑战。 主要版本升级由于命令,数据结构和配置的变化而引起的显着兼容性风险。 这篇文章强调使用Redis-CLI进行彻底的测试

如何在Redis群集中选择一个碎片键? 如何在Redis群集中选择一个碎片键? Mar 17, 2025 pm 06:55 PM

本文讨论了在Redis群集中选择碎片键,并强调了它们对性能,可伸缩性和数据分布的影响。关键问题包括确保均匀数据分配,与访问模式保持一致以及避免常见错误l

Redis查看版本有快捷方式吗 Redis查看版本有快捷方式吗 Mar 04, 2025 pm 05:59 PM

本文详细介绍了检查Redis服务器版本的方法。 它使用Redis-CLI - Version和Info Server进行比较,检查配置文件,过程列表和软件包管理器。 redis-cli中的信息服务器命令被确定为t

Redis如何通过命令行查看版本 Redis如何通过命令行查看版本 Mar 04, 2025 pm 06:00 PM

本文详细介绍了通过命令行检查Redis服务器版本的方法。 主要方法Redis-CLI信息服务器有效地从服务器的输出中检索了版本信息,提供了直接可靠的解决方案。 替代a

如何在REDIS中实施缓存无效策略? 如何在REDIS中实施缓存无效策略? Mar 17, 2025 pm 06:46 PM

本文讨论了在REDIS中实施和管理缓存无效的策略,包括基于时间的到期,事件驱动的方法和版本控制。它还涵盖了缓存到期的最佳实践和监视和自动的工具

Redis版本号是什么样的 Redis版本号是什么样的 Mar 04, 2025 pm 06:01 PM

本文详细介绍了Redis版本号,其字符串数据类型以及用于检查版本的方法(使用Redis-CLI,配置文件或编程方式)。 它还探讨了主要版本之间的差异,重点是增强性能

如何将Redis用于酒吧/子消息传递? 如何将Redis用于酒吧/子消息传递? Mar 17, 2025 pm 06:48 PM

本文介绍了如何将Redis用于酒吧/子消息传递,涵盖设置,最佳实践,确保消息可靠性和监视性能。

如何将Redis用于工作队列和背景处理? 如何将Redis用于工作队列和背景处理? Mar 17, 2025 pm 06:51 PM

本文讨论了使用REDIS进行工作队列和背景处理,详细的设置,作业定义和执行。它涵盖了原子运营和工作优先级等最佳实践,并解释了REDIS如何提高处理效率。

See all articles