有没有办法使用StackExchange.Redis客户端在Redis中存储Null值?
如果您使用IDatabase.StringGet(key)
,则返回Null用于表示“没有结果”。因此,如果您使用IDatabase.StringSet(key, null)
,则结果是您不知道 Null 值还是 No 值!
有没有适合这方面的机制? - 即您要缓存 否定 。
我非常希望避免任何令人讨厌的哨兵值(如value ?? new byte[] {1}
),如果某个值恰好匹配,以后会导致问题!
我查看了RedisValue.Null
,但这只会产生一个与上述问题相同的Null。
答案 0 :(得分:1)
这是零点的常见困境。我们有类似的情况,这是我们如何处理它们: 1.我们从后端系统中检索日期列表并将其存储在缓存中。如果没有检索到日期,则DAL类返回null,如果错误/超时与后端系统通信,则抛出异常。为了缓存空值,我们用空列表替换了null - 这仍然表示没有可用的日期。 我们曾经将用户首选项存储为后端的字符串。空值表示用户未设置首选项。为了缓存这个,我们缓存了在用例中永远不会出现的特殊字符串值 - 类似于没有偏好。
HTH。
答案 1 :(得分:1)
我正在使用代理模式来减少对数据库的调用。我发现的唯一合理的方法是在Redis中存储一个空字节数组。
byte[] array = new byte[0];
IDatabase.StringSet(key, array)
查询Redis时,可以使用value.IsNull
检查字节数组是否为空。
这种方式似乎比存储0
,""
或任何其他任意值更好。