在StackExchange中有条件地操作hash.Redis依赖于一些同步
本文关键字:依赖于 Redis 同步 hash 操作 StackExchange 有条件 | 更新日期: 2023-09-27 18:04:56
我使用redis支持一些底层持久存储,所以当缓存请求失败时,逻辑将从备份存储中获取数据并将其传递给客户端,并将其存储在缓存中。当一些丢失键的同时请求发生时,我确实希望只允许一个请求到达持久存储并完成任务,而其他请求将锁定或已订阅键更改并返回调用者,并从缓存中获取值。
一种可能的方法是在缓存需要填充时添加一个带过期的字符串键(参见EXPIRE
命令),称为whatever:lock
(更改任何对您的项目有意义的东西),并在4-5分钟内过期。
所有对缓存的请求都应该检查whatever:lock
是否存在:
- 如果它不存在,那么整个进程添加整个锁键并尝试填充缓存。
- 如果锁键存在,整个进程将轮询缓存,直到锁键不再存在,它将从缓存中获取数据。
SET
和EXPIRE
都应该作为MULTI
命令的一部分发出,以确保在创建密钥时自动设置过期。
您也可以使用SETNX
。查看Redis官方文档关于这个命令,它说它可以用来创建锁。