C# 调用StrackExchange.Redis的StringSet方法之前是否需要进行exists检查

C# 调用StrackExchange.Redis的StringSet方法之前是否需要进行exists检查,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我正在使用C#中的StackExchange.Redis 1.0.450 nuget。 我有如下代码,在添加之前检查redis中是否存在密钥- if (!Cache.KeyExists(fKey)) { Cache.StringSet(fKey, Serialize(data)); } 其中,缓存是数据库对象 我在这里读到了关于redis SET命令的内容 并发现该集合将覆盖现有的键值(如果该键值已存在)。 使用StackExchange.Redis,我可以安全地删除exist che

我正在使用C#中的StackExchange.Redis 1.0.450 nuget。 我有如下代码,在添加之前检查redis中是否存在密钥-

if (!Cache.KeyExists(fKey))
{
    Cache.StringSet(fKey, Serialize(data));
}
其中,缓存数据库对象

我在这里读到了关于redis SET命令的内容 并发现该集合将覆盖现有的键值(如果该键值已存在)。 使用StackExchange.Redis,我可以安全地删除exist check条件并只调用-

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

感谢您的回复。

是的,您可以省去它。我们也不检查是否存在,因为这会导致缓存有两个访问点,其中只需要一个。这会降低缓存访问速度

你可能想考虑另外三件事:

  • 如果访问时redis缓存不可用,您可能必须使设置操作可重复
  • 您可能必须使连接的初始化可重复
  • 请参阅如何使redis缓存项可靠且快速地(反)序列化

    • 默认行为是简单地覆盖,因此,如果这对您来说合适的话:您不需要检查。还有一个可选的
      when
      参数,允许您更精细地控制它-请参阅redis
      SET
      文档中的
      NX
      etc参数,了解这在实际中的意义。对于“相等”检查,您可以使用带有约束的事务。

      什么使您认为无法安全地删除它?在一天结束时,另一个线程可能已经在检查
      KeyExists
      StringSet
      之间的缓存中放入了一些内容。如果密钥已经存在,那么您是想覆盖,还是想保留现有值?谢谢James&Jon,即使它覆盖了,我也很好。谢谢。@VST我很好奇,为什么你第一次接受了我的答案,而我的答案恰恰回答了你的问题,后来你选择了另一个答案。这不是为了分数。这只是因为我觉得另一个答案与你的问题无关:我实际上首先接受了目前被接受的答案&而不是你的答案。我不知道我不能接受多个答案,我认为你的答案也是有用的答案之一,并将其标记为正确的,并意识到其他答案未经检查。关于相关性,我觉得当前的问题更相关,因为我的问题更多的是关于是否需要进行检查。你的建议是如何避免支票。于是又换了另一个。尽管如此,谢谢你们的回应——你们所有人。