簡體   English   中英

在redis中創建中到大型列表/ set / zset / hash的最有效方法是什么?

[英]What's the most efficient way to create a medium to large list/set/zset/hash in redis?

使用redis ,有許多命令可以檢索整個數據結構( 列表LRANGE ,集合為SMEMBERS ,排序集為ZRANGE ,哈希為HGETALL )。

只有散列有一個方法( HMSET )才能用一個命令插入多個項目。

我看到的所有示例都顯示只是一次添加一個項目到列表(通過RPUSHLPUSH )或一組(通過SADD / ZADD )。

我想解決的更具體的問題是創建包含數據庫ID的列表和排序集,這些列表對每個用戶都是唯一的,並且包含幾百到幾千個ID。

它們通常從數據庫查詢中收集,在內存中按摩一點,然后存儲在redis中,用於分頁(列表)或執行基於集合的操作以檢索子集(集合和排序集合)。

目前,我正在遍歷列表並為每個元素調用適當的add方法。 這具有通過線路發出多個請求並且每次都重復密鑰的缺點。

redis> RPUSH employee:ids 1000
(integer) 1
redis> RPUSH employee:ids 1001
(integer) 2
redis> RPUSH employee:ids 1002
(integer) 3
redis> RPUSH employee:ids 1003
(integer) 4
redis> del employee:ids
(integer) 1

我認為使用具有MULTIEXEC事務可以幫助將其轉換為單個請求,但這對重復的密鑰沒有幫助。

redis> MULTI
OK
redis> RPUSH employee:ids 1000
QUEUED
redis> RPUSH employee:ids 1001
QUEUED
redis> RPUSH employee:ids 1002
QUEUED
redis> RPUSH employee:ids 1003
QUEUED
redis> RPUSH employee:ids 1004
QUEUED
redis> EXEC
1. (integer) 1
2. (integer) 2
3. (integer) 3
4. (integer) 4
5. (integer) 5

是否有一些我缺少的東西可以讓我在單個命令中添加元素到列表/集合,或者每次都不重復鍵?

我也使用jedis客戶端庫,如果這很重要(或者如果有另一個我可以從JVM使用的庫更好)。

設置交易在這里沒有用。 事務的目的是確保命令同時執行,這樣您就不會在服務器上有半個列表。 他們仍然會一次發送一個。

多個命令真的會導致性能問題嗎? 1000個項目實際上並不多,只要您沒有為每個項目打開新連接,就不會出現任何延遲問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM