【问题标题】:Is exists check required before calling StringSet method of StrackExchange.Redis在调用 StrackExchange.Redis 的 StringSet 方法之前是否需要检查是否存在
【发布时间】:2015-06-10 13:08:42
【问题描述】:

我在 C# 中使用 StackExchange.Redis 1.0.450 nuget。 我有像下面这样的代码,它在添加之前检查 redis 中是否存在键 -

if (!Cache.KeyExists(fKey))
{
    Cache.StringSet(fKey, Serialize(data));
}

缓存数据库对象

我在http://redis.io/commands/set 阅读了有关 redis SET 命令的信息 并发现 SET 将覆盖现有的键值,如果它已经存在。 使用 StackExchange.Redis 我可以安全地删除存在检查条件并调用 -

Cache.StringSet(fKey, Serialize(data));

感谢您的回复。

【问题讨论】:

  • 是什么让您认为您无法安全地删除它?在一天结束的时候,另一个线程可能已经在检查 KeyExistsStringSet 之间的缓存中放了一些东西。
  • 如果密钥已经存在,您是要想要覆盖,还是要保留现有值?
  • 感谢 James 和 Jon,即使它被覆盖我也很好。谢谢。
  • @VST 我很好奇为什么您首先接受了我的回答,该回答完全回答了您的问题,后来您选择标记另一个。不是为了积分。只是因为我觉得其他答案与您的问题无关:P
  • Matias 我实际上首先接受了当前接受的答案,而不是你的答案。我不知道我不能接受多个答案我认为您的答案也是有用的答案之一并将其标记为正确并意识到其他未选中。关于相关性,我觉得当前的更相关,因为我的问题更多是关于是否需要进行存在检查。您的建议是如何避免存在检查。于是又换了一个。不过感谢您的回复 - 你们所有人。

标签: c# redis stackexchange.redis


【解决方案1】:

是的,您可以将其删除。我们也不会检查是否存在,因为这会导致有两个访问点到缓存,而其中只有一个是必需的。这确实会减慢缓存访问速度。

您可能还需要考虑其他三件事:

  • 您可能必须使设置操作可重复,以防在访问时 redis 缓存不可用。
  • 您可能必须使连接的初始化可重复
  • 请参考buffer redis stream如何使redis缓存条目的(反)序列化可靠且快速。

【讨论】:

    【解决方案2】:

    默认行为是简单地覆盖,所以如果这对你来说没问题:你不需要检查。还有一个可选的when 参数可以让您更精细地控制它 - 请参阅redis SET 文档中的NX 等参数以了解这实际上意味着什么。对于“平等”检查,您可以使用带有约束的事务。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2012-09-07
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多