2011-10-31 15 views
5

मैं इस प्रकार कुछ जानकारी स्टोर करने के लिए चाहते हैं (ध्यान दें, मैं इस डेटा संरचना करने के लिए शादी-शुदा नहीं हूँ, लेकिन यह आपको पता चलता है अंतर्निहित जानकारी मैं संग्रहीत करना चाहते हैं):मूल्य से सरल खोज?

{ user_id: 12345, page_id: 2, country: 'DE' } 

इन में रिकॉर्ड्स, user_id एक अनूठा फ़ील्ड है, लेकिन पेज_आईडी नहीं है।

मैं एक Redis डेटा संरचना में इस अनुवाद करना चाहते हैं, और मैं कुशल खंगालने के लिए सक्षम होने के लिए इस प्रकार चाहते हैं:

  • user_id 12345 के लिए, संबंधित देश पाते हैं।
  • पेज_आईडी 2 के लिए, सभी संबंधित उपयोगकर्ता_आईड्स और उनके देशों को ढूंढें।

क्या यह वास्तव में रेडिस में ऐसा करना संभव है? यदि हां, तो मुझे किस डेटा संरचना का उपयोग करना चाहिए, और जब मैं उन्हें सम्मिलित करता हूं तो मैं रिकॉर्ड को डुप्लिकेट करने की संभावना से कैसे बचूं?

उत्तर

4

ऐसा लगता है कि आपको दो प्रमुख प्रकार की आवश्यकता है: एक हैश कुंजी अपने उपयोगकर्ता के डेटा को स्टोर करने के लिए, और प्रत्येक पृष्ठ के लिए एक सूची जिसमें संबंधित उपयोगकर्ताओं की सूची शामिल है। नीचे एक उदाहरण है कि यह कैसे काम कर सकता है।

लोड डाटा:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

पुल डाटा:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

निकालें पृष्ठ से उपयोगकर्ता:

> LREM page:2:users 0 12345 

दोहराएँ तरह हो जाता है उपयोगकर्ता के लिए अतिरिक्त मान पुनः प्राप्त करने के।

मुझे उम्मीद है कि यह मदद करता है, अगर आपको कुछ भी स्पष्ट करना है या आपको और सहायता की आवश्यकता है तो मुझे बताएं। मैं redis web site पर विशेष रूप से एसओआरटी ऑपरेशन के संबंध में उपलब्ध कमांड सूची और दस्तावेज पढ़ने की भी सिफारिश करता हूं।

+0

जाने का तरीका प्रतीत होता है - वास्तव में मैंने एक हैश और एक एसईटी का उपयोग करने के बजाय समाप्त किया एक सूची - लेकिन अच्छा जवाब! – Richard

1

चूंकि user_id अद्वितीय है और इसलिए देश भी है, उन्हें एक साधारण कुंजी-मूल्य जोड़ी में रखें। उपयोगकर्ता के लिए पूछताछ ओ (1) है इस तरह के मामले में ... फिर, कुछ Redis sets रखें, पेज_आईडी और सदस्यों के सभी उपयोगकर्ता_आईड्स के साथ ..

+0

धन्यवाद। इसके बारे में मेरी चिंता यह है: क्या होगा यदि आप कुंजी-मान में कोई नया उपयोगकर्ता डालते हैं, तो * पहले * आप सेट एंट्री जोड़ सकते हैं, डेटाबेस नीचे चला जाता है? जब यह बैक अप आता है, तो आपको जानकारी के खराब आधा-दर्ज बिट्स के साथ छोड़ा जाएगा। – Richard

+1

ऐसे मामले में, आपके पास दो विकल्प हैं: या तो अपने क्लाइंट कोड में किसी प्रकार का राज्य रखें, दूसरे शब्दों में, परिणाम की जांच करें कि हर ऑपरेशन के बाद रेडिस रिटर्न देता है और विफलता मामलों में तदनुसार व्यवहार करता है, या http: // redis का उपयोग करता है। कब/# लेन-देन आदेश; – hymloth

+1

मुझे लगता है कि [पाइपलाइनिंग] (http://redis.io/topics/pipelining) अच्छी पसंद –

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