【问题标题】:Can I use StackExchange.Redis to store a Null value in Redis?我可以使用 StackExchange.Redis 在 Redis 中存储 Null 值吗?
【发布时间】:2016-10-14 00:48:12
【问题描述】:

有没有办法使用 StackExchange.Redis 客户端在 Redis 中存储 Null 值?

如果您使用IDatabase.StringGet(key),则返回 Null 用于表示“没有结果”。因此,如果您使用IDatabase.StringSet(key, null),那么结果是您不知道是否存在 Null 值或 No 值!

有什么机制可以解决这个问题吗? - 即你想缓存一个否定

我宁愿避免任何讨厌的哨兵值(如value ?? new byte[] {1}),如果值恰好匹配,以后可能会导致问题!

我查看了RedisValue.Null,但这只会产生与上述问题相同的 Null。

【问题讨论】:

  • 您的用例是什么?为什么要针对键存储 null?
  • 我的缓存层减少了对数据库的调用。有时我的数据库没有结果,所以我想缓存该结果,以便下次调用仅命中缓存(结果为“数据为空”)。此刻,空响应表明缓存没有结果,所以我最终去数据库然后获取“无”结果。

标签: stackexchange.redis


【解决方案1】:

这是空值的常见困境。我们也遇到过类似的情况,我们是这样处理的:

  1. 我们从后端系统检索日期列表并将它们存储在缓存中。如果没有检索到日期,则 DAL 类返回 null,并在与后端系统通信发生错误/超时的情况下引发异常。为了缓存 null 值,我们将 null 替换为空列表 - 这仍然表示没有可用的日期。
  2. 我们曾经将用户偏好作为字符串存储在后端。 null 值表示用户没有设置偏好。为了缓存它,我们缓存了在用例中永远不会出现的特殊字符串值 - 例如 NO PREFERENCE

HTH。

【讨论】:

    【解决方案2】:

    我正在使用代理模式来减少对数据库的调用。我发现唯一合理的方法是在 Redis 中存储一个空字节数组。

    byte[] array = new byte[0];
    IDatabase.StringSet(key, array)
    

    查询Redis时可以使用value.IsNull来检查字节数组是否为空。

    这种方式似乎比存储0"" 或任何其他任意值更可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2017-08-29
      • 2021-05-20
      • 2021-06-03
      • 2019-05-27
      • 2017-01-01
      • 2018-08-23
      相关资源
      最近更新 更多