技术文摘
Redis 乐观锁和悲观锁的使用方法
Redis 乐观锁和悲观锁的使用方法
在多线程或多进程环境下,数据的并发访问控制至关重要,Redis 提供的乐观锁和悲观锁为解决此类问题提供了有效手段。
先说说悲观锁。悲观锁秉持一种悲观的态度,它认为在数据处理过程中,很可能会有其他进程或线程对数据进行修改。在 Redis 里实现悲观锁,常用的方式是使用 SETNX 命令(即 SET if Not eXists)。当一个客户端想要获取锁时,它会尝试使用 SETNX 命令将一个特定的键值对写入 Redis。如果该键不存在,SETNX 操作成功,客户端就获取到了锁,可以进行后续的数据操作;若键已存在,说明锁已被其他客户端持有,当前客户端获取锁失败,需要等待或重试。例如:
SETNX lock_key 1
这里 lock_key 是锁的键,值 1 可以是任意标识。当操作完成后,需要通过 DEL 命令释放锁:
DEL lock_key
再看看乐观锁。乐观锁则持乐观态度,它认为数据在大多数情况下不会被其他进程或线程修改。Redis 实现乐观锁主要借助 WATCH 命令。客户端在读取数据时,使用 WATCH 命令监控一个或多个键。在执行事务操作前,Redis 会检查被监控的键在读取数据后是否被修改过。如果没有被修改,事务可以顺利执行;若有修改,事务将被放弃。示例如下:
WATCH data_key
# 读取数据
GET data_key
MULTI
# 执行数据修改操作
SET data_key new_value
EXEC
如果在 WATCH 和 EXEC 之间,data_key 被其他客户端修改,EXEC 命令将返回 nil,表示事务执行失败,客户端需要重新读取数据并再次尝试事务操作。
Redis 的乐观锁和悲观锁各有适用场景。悲观锁适合并发冲突可能性较高的场景,能确保数据一致性,但可能会导致性能下降;乐观锁则适用于并发冲突较少的场景,能提高系统并发性能,减少锁等待时间。开发者可根据具体业务需求,合理选择使用这两种锁机制,保障系统在并发环境下的数据安全与稳定运行 。
- 你是否真正了解 C 语言中 Extern "C" 的作用
- Golang 语言 Struct 字段的 Tag 如何使用?
- Libuv 中 Io_Uring 的使用探讨
- Python 揭秘北京道路数量:多达 1.5 万条!
- Java 开发了解 HashMap 底层存储原理有益无害
- OAuth 2.0 为单纯授权协议,OIDC 系认证授权协议
- 为何不了解 AST ?
- 巧用责任链模式,提升代码逼格
- Spring Boot Actuator 集成:灵活运用之难
- Web 趋势榜:上周 10 大热门且有趣的 Web 项目
- 我将重构软件行业
- Nacos魅力无限,从零基础开始学习
- 你是否考虑过 Defer Close() 的风险
- 六个维持.NET 应用程序内存良好状态的实践
- Nacos 服务注册的源码剖析