2010-10-28 95 views
8

我们使用Redis作为缓存服务器,并且经常需要处理缓存列表。当我们缓存简单对象时,我们做一个GET,如果对象不存在,Redis将返回null,并且我们将知道该对象没有被缓存并且必须从数据库中加载。Redis中的列表和集合处理的最佳做法是什么?

但我们如何最好地处理列表 - 空列表可以是一个有效的值。我们是否需要调用EXISTS来检查列表是否存在(但是让操作2次调用而不是1次)或者是否有人更好地了解如何处理这种情况?

/感谢

回答

9

如果您绝对需要这样做,当列表创建时,您可以将“标记”作为第一个不会被删除的元素。为了以原子方式执行此操作,您可以使用MULTI/EXEC/WATCH,但watch仅在Redis 2.2中可用,它目前是预览(即使相当稳定,您可以从github主分支中抓取它)。

我认为在你的用例中,你可能还需要RPUSHX和LPUSHX,它只会在列表已经存在的情况下自动推送列表。

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

+1

经过一番考虑之后,我认为我的解决方案将不会自动重新生成列表。我的关注点如下:我将一条记录插入数据库,并同时添加到Redis列表中。如果Redis发生崩溃(并且可能丢失最后一秒的事务) - 我怎么才能达到数据库和Redis再次同步的状态。我认为我已经着手解决方案,这意味着如果Redis发生崩溃,则必须通过重新同步数据库中的列表来手动恢复情况。哦 - 谢谢你的好工作:-) – Micael 2010-11-06 14:12:57

+0

+1是正确的答案。但是,你能否指出我“你的好理由?”空集和列表与不存在的不同。 – Crisfole 2014-09-23 17:17:14

-1

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

$res = $redis->get('Key'); 
if(is_array($res)) 
    do code here 
3

不幸的是,表/集检索命令,如LRANGE和SMEMBERS似乎没有一个空列表/套和一个不存在的列表/设置加以区分。

所以,如果你绝对需要区分这两种情况,我想你需要先做一个EXISTS。尝试流水线您的命令以获得更好的性能。大多数Redis客户端库支持流水线。或者你可能会重新考虑你的缓存策略,这样你就不需要区分它们了。

+0

由于2.0 redis的治疗空列表,SETs,ZSET和HASHE的方式与现有方法相同。当您从列表中删除所有元素时,EXISTS命令将返回false! – 2010-11-04 12:56:34

+0

@Ludger Sprenker哇,我不知道!我只在1.2.6之前测试过。这完全是螺丝钉的Micael的缓存策略。 – kijin 2010-11-04 16:19:41

相关问题