2010-07-25 9 views
29

मैं नियमित कुंजी की हैश कीड़े का उपयोग शुरू करने की योजना बना रहा हूं। लेकिन मुझे रेडिस विकी में हैश-चाबियों के लिए बहु प्राप्त करने के बारे में कोई जानकारी नहीं मिल रही है। क्या इस तरह का आदेश Redis द्वारा समर्थित है?क्या रेडिस हैश के लिए एमजीईटी एनालॉग है?

धन्यवाद।

+0

आपके प्रश्न का उत्तर दिया गया है, सही जवाब में चिह्नित करें। धन्यवाद। – kmerenkov

उत्तर

31

आप पाइपलाइन में हैश या किसी भी कुंजी से पूछ सकते हैं, यानी आपके रेडिस इंस्टेंस के अनुरोध में। वास्तविक क्रियान्वयन के लिए अपने ग्राहक पर निर्भर करता है, लेकिन redis-py साथ यह इस तरह दिखना चाहते हैं:

pipe = conn.pipeline() 
pipe.hgetall('foo') 
pipe.hgetall('bar') 
pipe.hgetall('zar') 
hash1, hash2, hash3 = pipe.execute() 

ग्राहक 3 आदेशों के साथ एक अनुरोध जारी करेगा। यह वही तकनीक है जिसका प्रयोग एक बार में एक सेट में एकाधिक मान जोड़ने के लिए किया जाता है।

और पढ़ें http://redis.io/topics/pipelining

2

रेडिस में HMGET कमांड है, जो एक कमांड के साथ कई हैश कुंजी के मान देता है।

+1

हाँ, लेकिन एचएमजीईटी ठोस क्षेत्रों के कई मूल्य लौटाएगा, लेकिन मुझे पूरे हैंश की वापसी की आवश्यकता है (जैसे HGETALL http://code.google.com/p/redis/wiki/HgetallCommand करें)। वैसे भी, आपके उत्तर के लिए धन्यवाद। – Kirzilla

+1

टक्कर! पूरे हैंश से आपका क्या मतलब है? 'एचएमजीईटी' के साथ आपके पास पूछे गए कुंजियों के लिए सभी मान हैं, और चूंकि आपके पास पहले से ही चाबियाँ हैं, और प्रत्येक कुंजी के क्रम में एक समान मान है, तो आप अपने कोड में प्रत्येक कुंजी/मूल्य जोड़ी के साथ एक स्थानीय हैश बना सकते हैं। कृपया समझाएँ। धन्यवाद। – Niloct

+4

यदि कोई हैश अवधारणात्मक रूप से उपयोगकर्ता को पकड़ने के लिए उपयोग किया जाता है, तो एचएमजीईटी आपको उदाहरण के लिए उपयोगकर्ता के उपयोगकर्ता नाम और पासवर्ड के उपयोगकर्ता नाम के पासवर्ड के रूप में प्राप्त करेगा। हैश के लिए एमजीईटी के समान समकक्ष विधि, आईडी का एक सेट दिया जाएगा, उन सभी उपयोगकर्ताओं के उपयोगकर्ता नाम और पासवर्ड प्राप्त करें, सब एक ही बार में। वह अंतर है। – majelbstoat

6

यदि सॉर्ट आपको -> वाक्यविन्यास के साथ कई जीईटी का उपयोग करने देता है, और आपके सभी हैंशों में एक ही फ़ील्ड था, तो आप उन्हें अपने नाम को एक सेट में डालकर और इसे सॉर्ट करके एक बड़े जवाब में प्राप्त कर सकते हैं।

SORT names_of_hashes GET *->field1 *->field2 *->field3 *->etc 

लेकिन ऐसा लगता है कि आप हैश एक्सेस के साथ ऐसा नहीं कर सकते हैं। इसके अलावा आपको रिटर्न सूची को अपने आप में हैश में बदलना होगा।

अद्यतन: Redis आप एक से अधिक क्षेत्रों को लाने अगर आप अपने हैश अच्छी तरह से नाम बताने के लिए लगता है:

redis> hset hash:1 name fish 
(integer) 1 
redis> hset hash:2 name donkey 
(integer) 1 
redis> hset hash:3 name horse 
(integer) 1 
redis> hset hash:1 type fish 
(integer) 1 
redis> hset hash:2 type mammal 
(integer) 1 
redis> hset hash:3 type mammal 
(integer) 1 
redis> sadd animals 1 
(integer) 1 
redis> sadd animals 2 
(integer) 1 
redis> sadd animals 3 
(integer) 1 
redis> sort animals get # get hash:*->name get hash:*->type 
1. "1" 
2. "fish" 
3. "fish" 
4. "2" 
5. "donkey" 
6. "mammal" 
7. "3" 
8. "horse" 
9. "mammal" 
0

एक शॉट पर यह करने के लिए कोई आदेश नहीं है, लेकिन वहां यह "अच्छी तरह से" करने के लिए एक रास्ता है , एक सूची (या क्रमबद्ध सेट) का उपयोग करके जहां आप हैशकेज़ स्टोर करेंगे, और फिर उन्हें बहु का उपयोग करके थोक के रूप में पुनर्प्राप्त करें।

PHP में:

$redis->zAdd("myHashzSet", 1, "myHashKey:1"); 
$redis->zAdd("myHashzSet", 2, "myHashKey:2"); 
$redis->zAdd("myHashzSet", 3, "myHashKey:3"); 

$members = $redis->zRange("myHashzSet", 0, -1); 
$redis->multi(); 
foreach($members as $hashKey) { 
    $redis->hGetAll($hashKey); 
} 
$results = $redis->exec(); 

मैं एक क्रमबद्ध सेट, जहाँ आप अपने हैश के लिए एक आईडी के रूप में स्कोर का उपयोग का उपयोग कर recommand, यह सब स्कोर आधारित आदेश के लाभ लेने के लिए अनुमति देता है।

3

नहीं MHGETALL लेकिन आप इसे Lua कर सकते हैं पर:

local r = {} 
for _, v in pairs(KEYS) do 
    r[#r+1] = redis.call('HGETALL', v) 
end 

return r 
संबंधित मुद्दे