在StackExchange中有条件地操作hash.Redis依赖于一些同步

本文关键字:依赖于 Redis 同步 hash 操作 StackExchange 有条件 | 更新日期: 2023-09-27 18:04:56

我使用redis支持一些底层持久存储,所以当缓存请求失败时,逻辑将从备份存储中获取数据并将其传递给客户端,并将其存储在缓存中。当一些丢失键的同时请求发生时,我确实希望只允许一个请求到达持久存储并完成任务,而其他请求将锁定或已订阅键更改并返回调用者,并从缓存中获取值。

在StackExchange中有条件地操作hash.Redis依赖于一些同步

一种可能的方法是在缓存需要填充时添加一个带过期的字符串键(参见EXPIRE命令),称为whatever:lock(更改任何对您的项目有意义的东西),并在4-5分钟内过期。

所有对缓存的请求都应该检查whatever:lock是否存在:

  • 如果它不存在,那么整个进程添加整个锁键并尝试填充缓存。
  • 如果锁键存在,整个进程将轮询缓存,直到锁键不再存在,它将从缓存中获取数据。

SETEXPIRE都应该作为MULTI命令的一部分发出,以确保在创建密钥时自动设置过期。

您也可以使用SETNX。查看Redis官方文档关于这个命令,它说它可以用来创建锁。