2014-01-13 69 views
1

我正在使用redis作爲緩存,並且想要在redis中過期未使用的數據。目前,對象的設置到期會在到期時間過去後刪除對象。但是,如果在對象到期之前至少讀取一次,我想將對象保留在redis中。Redis作爲緩存 - 重置過期

我看到的一種方式是爲每個對象存儲一個單獨的expiry_key,並將expiry_key設置爲expiry_key而不是原始對象。在expiry_key上訂閱del通知,並在收到del通知時,在到期間隔期間檢查對象是否至少讀取一次(通過單獨維護的訪問日誌)。如果沒有讀取對象,則對原始對象執行del命令。如果讀取,則使用到期時間間隔重新創建expiry_key。

該實施需要額外的系統來管理過期,並希望在本地使用redis來完成。

有沒有更好的解決方案來解決這個問題?

爲每次讀取重置對象的過期將增加寫入redis的次數,因此這不是一個選擇。

請注意,redis緩存刷新是通過更改通知系統異步管理的。

回答

2

請參見「配置的Redis作爲一個緩存」在http://redis.io/topics/config

我們可以設置maxmemory-政策to allkeys-lru清除來自redis的非活動內容。這將適用於我所陳述的用例。

7

您可以在每次讀取後再次設置到期密鑰(設置密鑰的TTL爲O(1))。

它也許有道理爲您的系統在交易中要做到這一點:

MULTI 
GET mykey 
EXPIRE mykey 10 
EXEC 

你也可以管的命令。

此模式也在official documentation中描述。

+0

嗨,Agis,感謝您的答覆。我從Slave實例讀取並從不同組件寫入Master實例。所以,我可能無法利用交易或管道。我們可以異步寫入master,但是這會增加寫入redis的次數。 – vinoths

+0

@vinoths你確定這些額外的'EXPIRE'會成爲一個問題嗎?正如我所說的那樣,他們應該對Redis毫無問題。 – Agis

0

另一種方式是做定義鍵上的通知,然後重置它的到期

see here