2 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
你是對的
...無法在一次調(diào)用中讀取多個(gè)哈希值...
所以是@TheDude
...您還可以創(chuàng)建一個(gè) Lua 腳本來迭代 Redis 鍵...
添加到它
看來您正在使用Redis作為數(shù)據(jù)庫。您已經(jīng)存儲(chǔ)了所有域數(shù)據(jù),現(xiàn)在您想要查詢它。這是對Redis的濫用。它可以做到,但這不是它的目的。對于此活動(dòng),如果您使用真實(shí)的數(shù)據(jù)庫,它將更容易且性能更高。
Redis 用于緩存常用數(shù)據(jù)[注:1]。請注意兩個(gè)詞 (1) 緩存和 (2) 常用。緩存是臨時(shí)存儲(chǔ)。如果您想要永久存儲(chǔ) - 在服務(wù)器重新啟動(dòng)后 - 去數(shù)據(jù)庫。常用表示不要將所有數(shù)據(jù)存儲(chǔ)在那里。僅存儲(chǔ)正在使用的子集。您可以將 Redis 與您的所有數(shù)據(jù)一起使用,甚至可以在永久存儲(chǔ)打開的情況下使用,但是您必須非常小心。
出于您的目的,它似乎使用通用數(shù)據(jù)庫,并且SELECT MAX(age) FROM ...
即使不是更好也同樣好。
或者可能,
您只引用了實(shí)際問題的一部分,實(shí)際上您正在遵循 Redis 最佳實(shí)踐。在這種情況下,我建議使用單獨(dú)的Sorted Set
. 對于插入到主密鑰集的每個(gè)員工,還要做ZADD employeeages 80 Alen
where80
是年齡和Alen
可能的人 Alen 的 ID。
要獲取最大年齡的人(的 ID),您可以執(zhí)行
ZREVRANGEBYSCORE employeeages +inf -inf WITHSCORES LIMIT 0 1
如果這看起來很奇怪,那么您是對的 - 這是非常有趣的事情!這不僅可以在一次調(diào)用中獲取數(shù)據(jù),而且可以在調(diào)用中的一個(gè)步驟中獲取數(shù)據(jù)!考慮一下:假設(shè)您有 100 萬名員工 (waao)。那么這種獲取最年長員工的方法將是最快的,使用數(shù)據(jù)庫SELECT MAX(...
并將獲得亞軍,而你的HGETALL
或Lua script
將是最慢的。
如果您的員工的年齡經(jīng)常變化,請使用這種方法 - 例如在線游戲的玩家分?jǐn)?shù),并且您經(jīng)常想查詢排名靠前的或較松的 - 比如更新排行榜。使用這種方法代替數(shù)據(jù)庫的缺點(diǎn)是冗余度高。當(dāng)(例如)員工的地址發(fā)生變化時(shí),您需要更改大量記錄,為此您需要撥打大量電話。
[1] 正如評論中所指出的,Redis 不僅僅是常用數(shù)據(jù)的緩存。我相信對于這個(gè)討論,這個(gè)定義就足夠了。
- 2 回答
- 0 關(guān)注
- 222 瀏覽
添加回答
舉報(bào)