2010-10-28 90 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

相關問題