我们使用 Redis 作为缓存服务器,经常要处理缓存列表。当我们缓存简单对象时,我们执行 GET,如果对象不存在,Redis 将返回 null,我们将知道该对象没有被缓存并且必须从数据库中加载。
但是我们如何最好地处理列表 - 一个空列表可以是一个有效值。我们是否需要调用 EXISTS 来检查列表是否存在(但进行操作 2 次调用而不是一次),还是有人对如何处理这种情况有更好的想法?
/谢谢
我们使用 Redis 作为缓存服务器,经常要处理缓存列表。当我们缓存简单对象时,我们执行 GET,如果对象不存在,Redis 将返回 null,我们将知道该对象没有被缓存并且必须从数据库中加载。
但是我们如何最好地处理列表 - 一个空列表可以是一个有效值。我们是否需要调用 EXISTS 来检查列表是否存在(但进行操作 2 次调用而不是一次),还是有人对如何处理这种情况有更好的想法?
/谢谢
如果您绝对需要这样做,则在创建列表时,您可以将“哨兵”作为第一个永远不会删除的元素推送。为了自动执行此操作,您可以使用 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