【发布时间】:2011-05-01 17:35:35
【问题描述】:
我们使用 Redis 作为缓存服务器,经常要处理缓存列表。当我们缓存简单对象时,我们会执行 GET,如果对象不存在,Redis 将返回 null,我们会知道该对象没有被缓存并且必须从数据库中加载。
但是我们如何最好地处理列表 - 一个空列表可以是一个有效值。我们是否需要调用 EXISTS 来检查列表是否存在(但进行操作 2 次调用而不是一次调用)还是有人知道如何处理这种情况?
/谢谢
【问题讨论】:
标签: redis
我们使用 Redis 作为缓存服务器,经常要处理缓存列表。当我们缓存简单对象时,我们会执行 GET,如果对象不存在,Redis 将返回 null,我们会知道该对象没有被缓存并且必须从数据库中加载。
但是我们如何最好地处理列表 - 一个空列表可以是一个有效值。我们是否需要调用 EXISTS 来检查列表是否存在(但进行操作 2 次调用而不是一次调用)还是有人知道如何处理这种情况?
/谢谢
【问题讨论】:
标签: redis
如果您绝对需要这样做,则在创建列表时,您可以将“哨兵”作为第一个永远不会删除的元素推送。为了以原子方式执行此操作,您可以使用 MULTI/EXEC/WATCH,但 watch 仅在 Redis 2.2 中可用,目前是预览版(即使相当稳定,您也可以从 github master 分支获取)。
我认为在您的用例中,您可能还需要 RPUSHX 和 LPUSHX,它们只会在列表已经存在时自动推送列表。
请注意,由于 Redis 2.2 的存在意味着列表至少有 1 个元素,因为出于许多充分的理由,将自动删除将达到零元素的列表;)
【讨论】:
不幸的是,LRANGE 和 SMEMBERS 等列表/集检索命令似乎无法区分空列表/集和不存在的列表/集。
因此,如果您绝对需要区分这两种情况,我想您需要先执行 EXISTS。尝试流水线化您的命令以获得更好的性能。大多数 Redis 客户端库都支持流水线。
或者你可能会重新考虑你的缓存策略,这样你就不需要区分它们了。
【讨论】:
如果您使用的是 php,我会将返回值分配给一个变量,然后检查它是否是一个数组。 (这是使用 Predis 库的工作原理)
$res = $redis->get('Key');
if(is_array($res))
do code here
【讨论】: