依靠某种同步有条件地操作 StackExchange.Redis 中的散列

Conditionally manipulate hash in StackExchange.Redis relying on some synchronization

我正在使用由一些底层持久存储支持的 redis,因此当缓存请求未命中时,逻辑将从支持的存储中获取数据并将其传递给客户端,并将其存储在缓存中。 当同时发生一些丢失密钥的请求时,我确实希望只允许一个请求到达持久存储并完成工作,而其他请求将锁定或已订阅密钥更改,并 return 向调用者提供从缓存中获取的值。

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

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

  • 如果不存在,则整个过程会添加整个锁定密钥并尝试填充缓存。
  • 如果存在,整个进程将轮询缓存,直到锁定密钥不再存在,然后从缓存中获取数据。

SETEXPIRE 都应作为 MULTI command 的一部分发布,以确保在创建密钥的同时自动设置过期时间。

您也可以为此使用 SETNXCheck Redis official doc about this command, where it says that it can be used to create locks.