在调用 StrackExchange.Redis 的 StringSet 方法之前是否需要检查是否存在
Is exists check required before calling StringSet method of StrackExchange.Redis
我在 C# 中使用 StackExchange.Redis 1.0.450 nuget。
我有如下代码,在添加之前检查 redis 中是否存在密钥 -
if (!Cache.KeyExists(fKey))
{
Cache.StringSet(fKey, Serialize(data));
}
其中 Cache 是 Database 对象
我在这里阅读了有关 redis SET 命令的信息 http://redis.io/commands/set
并发现 SET 将覆盖现有的键值(如果它已经存在)。
使用 StackExchange.Redis 我可以安全地删除存在检查条件并只调用 -
Cache.StringSet(fKey, Serialize(data));
感谢您的回复。
是的,您可以放心地删除它。我们也不检查是否存在,因为这会导致有两个缓存访问点,而只有一个是必需的。这确实会减慢缓存访问速度。
您可能需要考虑其他三件事:
- 如果访问时 redis 缓存不可用,您可能必须使设置操作可重复。
- 您可能必须使连接的初始化可重复
- 请参考buffer redis stream如何使redis缓存条目的(反)序列化可靠且快速。
默认行为是简单地覆盖,所以如果这对您来说没问题:您不需要检查。还有一个可选的 when
参数,允许您更精细地控制它 - 请参阅 redis SET
文档中的 NX
等参数,以了解这在现实中意味着什么。对于 "equality" 检查,您可以使用具有约束的事务。
我在 C# 中使用 StackExchange.Redis 1.0.450 nuget。 我有如下代码,在添加之前检查 redis 中是否存在密钥 -
if (!Cache.KeyExists(fKey))
{
Cache.StringSet(fKey, Serialize(data));
}
其中 Cache 是 Database 对象
我在这里阅读了有关 redis SET 命令的信息 http://redis.io/commands/set 并发现 SET 将覆盖现有的键值(如果它已经存在)。 使用 StackExchange.Redis 我可以安全地删除存在检查条件并只调用 -
Cache.StringSet(fKey, Serialize(data));
感谢您的回复。
是的,您可以放心地删除它。我们也不检查是否存在,因为这会导致有两个缓存访问点,而只有一个是必需的。这确实会减慢缓存访问速度。
您可能需要考虑其他三件事:
- 如果访问时 redis 缓存不可用,您可能必须使设置操作可重复。
- 您可能必须使连接的初始化可重复
- 请参考buffer redis stream如何使redis缓存条目的(反)序列化可靠且快速。
默认行为是简单地覆盖,所以如果这对您来说没问题:您不需要检查。还有一个可选的 when
参数,允许您更精细地控制它 - 请参阅 redis SET
文档中的 NX
等参数,以了解这在现实中意味着什么。对于 "equality" 检查,您可以使用具有约束的事务。