我们使用Redis作为缓存服务器,并且经常需要处理缓存列表。当我们缓存简单对象时,我们执行GET,如果对象不存在,Redis将返回null,并且我们将知道该对象未被缓存并且必须从数据库加载。
但是我们如何才能最好地处理相同的列表 - 空列表可以是有效值。我们是否需要调用EXISTS来检查列表是否存在(但是使操作2调用而不是一个)或者是否有人更好地了解如何处理这种情况?
/感谢
答案 0 :(得分:10)
如果您绝对需要这样做,那么在创建列表时,您可以将“sentinel”作为从未删除的第一个元素。为了原子地执行此操作,您可以使用MULTI / EXEC / WATCH,但是Watch仅在Redis 2.2中可用,当前是预览(即使非常稳定,您也可以从github master分支中获取它)。
我认为在你的用例中你可能也想要RPUSHX和LPUSHX,只有当它已经存在时才会原子地推送它。
请注意,由于Redis 2.2存在意味着列表中至少有1个元素,因为有很多理由会自动删除将达到零元素的列表;)
答案 1 :(得分:3)
不幸的是,列表/设置检索命令(如LRANGE和SMEMBERS)似乎无法区分空列表/集和不存在的列表/集。
因此,如果你绝对需要区分这两种情况,我想你首先需要做一个EXISTS。尝试管道化命令以获得更好的性能。大多数Redis客户端库都支持流水线操作。
或者您可能会重新考虑您的缓存策略,以便您无需区分它们。
答案 2 :(得分:-1)
如果您使用的是php,我会将返回值赋给变量,然后检查它是否是数组。 (这是使用Predis库的工作方式)
$res = $redis->get('Key');
if(is_array($res))
do code here