我正在使用redis來保存我的中間數據的小應用程序。插入數據後,我需要按照我插入的順序重新加載我的數據。如何從Redis獲取前100條記錄
我使用keys
方法獲取所有密鑰,但返回密鑰的順序與插入的順序不同。
我正在使用redis來保存我的中間數據的小應用程序。插入數據後,我需要按照我插入的順序重新加載我的數據。如何從Redis獲取前100條記錄
我使用keys
方法獲取所有密鑰,但返回密鑰的順序與插入的順序不同。
您必須自己維護訂單,爲插入的密鑰保留一個單獨的列表。所以,與其
SET foo, bar
你可以做這樣的事情:
SET foo, bar
RPUSH insert_order, foo
然後,你可以做
LRANGE insert_order, 0, 100
得到第一個100個字段。
如果您想跟蹤實際插入(而不是更新),則可以使用SETNX。此外,您可以使用排序集而不是列表(如@Leonid所述)此外,您可以將整個事件包裝在Lua中,以便記帳對客戶端代碼隱藏。
索引網址,並通過插入的訂單獲取列表,你應該使用有序集合:
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記錄一起工作(閱讀&頻繁寫入)。但是你應該經常觀察哈希大小,它會變得非常快。
感謝您的回覆。但我將擁有數百萬條記錄。將所有記錄的密鑰保存在單個記錄中可能會使我的系統變慢? – Alex
@亞歷克斯:它可能會,也可能不會。有技巧(如分片'insert_order'列表)。或者你可以使用真正的數據庫,因爲你似乎想要一個。 –
或者你可以將你的密鑰存儲在[sorted set](http://redis.io/commands#sorted_set)中,以插入時間作爲分數,不斷用'zremrangebyrank'清理它以保留最後的100個條目。 –