有条件地在StackExchange.Redis中操作散列依赖于某些同步

时间:2015-07-28 04:40:41

标签: c# caching redis publish-subscribe stackexchange.redis

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

1 个答案:

答案 0 :(得分:1)

一种可能的方法是在需要填充名为whatever:lock的缓存时添加带有过期(see EXPIRE command)的字符串密钥(使用对项目有意义的内容更改任何) )并在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