我们正在使用的Redis作为缓存服务器,并经常要处理与缓存列表。当我们缓存简单的对象,我们做一个GET和Redis的将返回null如果对象不存在,我们就会知道,对象是不缓存,并且必须从数据库中加载。

但是,我们如何最好地处理相同的列表 - 空单可以有效的值。我们是否需要呼叫的存在是为了检查列表中存在(但使操作2调用,而不是一个),或者是否有人有更好的主意如何处理这种情况?

/感谢

有帮助吗?

解决方案

如果你绝对需要做的是,当创建列表,你可以把一个“定点”作为永远不会被删除第一个元素。为了做到这一点原子可以使用MULTI / EXEC /手表,但手表仅在2.2的Redis可为当前的预览(即使相当稳定,可以从GitHub主分支抓住它)。

我想在您的使用情况下,你可能还需要RPUSHX和LPUSHX,这将推动原子只针对如果它已经存在的列表。

注意,因为Redis的2.2存在装置具有用于列表至少1个元素,如列出了将达到零个元素被自动移除,许多很好的理由;)

其他提示

不幸的是,列表/设定检索命令如LRANGE和SMEMBERS似乎没有空列表/集合和一个不存在的列表/组之间进行区分。

所以,如果你确实需要这两种情况之间的区别,我想你需要做的首先存在。尝试流水线你的命令有更好的表现。最Redis的客户端库支持流水线操作。

或者,你可能会重新考虑你的缓存策略,这样你就不需要区分它们。

如果您使用的PHP中,我将在返回值分配给一个变量,然后检查它是否是一个数组。 (这是它的工作原理使用Predis库)

$res = $redis->get('Key');
if(is_array($res))
    do code here
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top