StackExchange Redis客户端StringSet返回false?

4
我们已经使用 StackExchange Redis .Net 客户端几个月了,没有出现任何问题。最近一个小时内,我们的日志记录显示 StringSet 返回了数千次 false,但现在它又按预期工作了。
我找不到关于 FALSE 的任何说明。我认为这意味着值没有被放入缓存,但如果是这样,我该如何查明原因呢?客户端没有抛出异常。有没有人能向我展示 API 规范,描述返回值以及如何进行故障排除?
我们在 Azure 上运行 Redis,如果有影响,请告知。
result = cache.StringSet(fullKey, value, GetCacheTime(cacheType));
if (!result)
{
    if (_logger != null)
    {
        _logger.LogError( "Failed to Set Cache");
    }
}

你最终解决了这个问题吗?我们的服务每天会收到数百个类似的请求,我认为虚假响应可能不是错误,但找不到任何关于 .net api 的文档来验证这一点。这是虚假的,与过期时间或内存/驱逐策略无关。 - Daniel
不,我们仍然不知道为什么会得到 false。 - Scott K Davis
有点晚了,但如果您尝试使用空值设置相同的键,则StringSet调用将返回false。我想从技术上讲,您应该使用KeyDelete()操作。 - Daniel
1个回答

0

http://redis.io/commands/set

简单字符串回复:如果SET执行正确,则返回OK。空回复:如果用户指定了NX或XX选项但未满足条件,则返回Null Bulk Reply,表示未执行SET操作。
尽管您似乎正在使用SETEX(http://redis.io/commands/setex),但您是否将有效的时间跨度设置为第三个参数?
SETEX是原子性的,并且可以通过在MULTI / EXEC块中使用前两个命令来重现。它作为一种更快的替代方案提供,因为当Redis用作缓存时,此操作非常常见。当秒数无效时会返回错误。

谢谢你的回复,Ben。时间跨度应始终有效。我的GetCacheTime函数基于正在缓存的内容返回静态值。但我会添加额外的检查和记录以确保。看起来我们会在大段时间(数分钟)内连续获得此方法的“false”返回日志,然后在几天内没有日志问题。这与我们有时会出现多次Redis连接失败,然后再过几天什么都没有一样。同样,我会添加检查以确保时间戳始终有效。谢谢! - Scott K Davis
你是否有驱逐策略,而且是否触及内存限制? - Ben Adams
根据我们的Azure门户,我们的内存利用率低于50%。在过去的30天中,问题只出现了一次,而以前每周都会出现一次。我预计Azure团队可能正在进行平台改进? - Scott K Davis
也许还应该明确测试 null:使用 == null 而不是不测试,因为可能存在其他值。 - Ben Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接