2013-10-14 25 views
0

我正在使用redis來保存我的中間數據的小應用程序。插入數據後,我需要按照我插入的順序重新加載我的數據。如何從Redis獲取前100條記錄

我使用keys方法獲取所有密鑰,但返回密鑰的順序與插入的順序不同。

回答

2

您必須自己維護訂單,爲插入的密鑰保留一個單獨的列表。所以,與其

SET foo, bar 

你可以做這樣的事情:

SET foo, bar 
RPUSH insert_order, foo 

然後,你可以做

LRANGE insert_order, 0, 100 

得到第一個100個字段。

如果您想跟蹤實際插入(而不是更新),則可以使用SETNX。此外,您可以使用排序集而不是列表(如@Leonid所述)此外,您可以將整個事件包裝在Lua中,以便記帳對客戶端代碼隱藏。

+0

感謝您的回覆。但我將擁有數百萬條記錄。將所有記錄的密鑰保存在單個記錄中可能會使我的系統變慢? – Alex

+1

@亞歷克斯:它可能會,也可能不會。有技巧(如分片'insert_order'列表)。或者你可以使用真正的數據庫,因爲你似乎想要一個。 –

+1

或者你可以將你的密鑰存儲在[sorted set](http://redis.io/commands#sorted_set)中,以插入時間作爲分數,不斷用'zremrangebyrank'清理它以保留最後的100個條目。 –

1

索引網址,並通過插入的訂單獲取列表,你應該使用有序集合:

zadd <your_url_list_key> <inserted_time> <url> 

針對單一網址詳細數據應該存儲在不同的地方。例如,使用哈希:

hset <your_url_data_key> <url> <url_data> 

它的更好,如果你不存儲在Redis的詳細數據,所以不是使用Redis的哈希,您應該保存在MySQL網址的詳細數據。

您也可以在索引前減少大小(然後將完整的url值存儲在url_data中)之前md5(url)

在我的項目中,排序後的設置仍然可以與大約3mil記錄一起工作(閱讀&頻繁寫入)。但是你應該經常觀察哈希大小,它會變得非常快。