2014-10-20 52 views
1

我想在Redis中有一個數組(使用Node),我可以在其中添加值並指定我希望它保留在那裏的時間。在這個時間限制之後,他們應該被刪除,並且理想地能夠打電話給我,所以我知道剛剛離開的東西。恩。我可能會收到120秒的請求,因此我想將該值添加到地圖上很長時間,然後將其刪除。Redis:將數組添加到特定長度?

有沒有更好的方法來做到這一點?我想過使用EXPIRE,但似乎只是爲了鍵,而不是數組中的元素?

任何想法都會很棒。

這是我在做什麼:

app.get('/session/:length', function(req, res) { 
    var length = parseInt(req.param('length'), 10); 

    addToArray(length, ip) 
    var ip = req.connection.remoteAddress; 

    res.json({ip: ip, length: length}); 

});

基本上,當我將它添加到數組中時,我希望它只在傳入的時間內保持它在數組中。所以如果你說30秒,它在該數組中30秒,然後消失,並調用回調。也許有更好的方法來解決這個問題?

我現在要做的是保持在一個陣列添加的時間和IP,時間,並定期遍歷數組檢查和刪除,但也許認爲這將有可能在Redis的自動做到這一點。

+0

你有沒有一個你想要做什麼的例子?也許你到目前爲止? – Termato 2014-10-20 19:03:00

回答

2

儘管在Redis中沒有自動的方法來處理這些問題,但常見的方法是使用Redis排序集。在你的情況下,使用時代表示將IP設置爲成員的值和到期時間(現在+生存時間)作爲分數。

除了定期循環,您可以每隔一段時間撥打ZREMRANGEBYSCORE

但是,由於集合成員是唯一的,這意味着您只能保存每個IP一次。如果沒關係,只是更新與它的每一個打IP比分,否則使成員值唯一通過時間戳串聯的IP。

最後,要獲得尚未「過期」的IP,請使用ZRANGEBYSCORE獲取分數(到期時間)比現在更高的成員。同樣地,在用ZREMRANGEBYSCORE刪除之前,獲取您提到的回調邏輯過期的密鑰。