2013-05-24 10 views
14

मैं वर्तमान में एक वेब ऐप को बल्ब कर रहा हूं और सत्रों को स्टोर करने के लिए रेडिस का उपयोग करना चाहता हूं। लॉगिन पर, सत्र को संबंधित उपयोगकर्ता आईडी के साथ रेडिस में डाला जाता है, और 15 मिनट में समाप्ति सेट होता है। अब मैं सत्रों के लिए रिवर्स लुक-अप लागू करना चाहता हूं (एक निश्चित उपयोगकर्ता आईडी के साथ सत्र प्राप्त करें)। यहां समस्या यह है कि, क्योंकि मैं रेडिस कीस्पेस नहीं खोज सकता, इसे कैसे कार्यान्वित किया जाए। एक तरीका यह होगा कि प्रत्येक उपयोगकर्ता आईडी के लिए एक रेडिस सेट होगा, जिसमें सभी सत्र आईडी शामिल हैं। लेकिन चूंकि रेडिस किसी सेट में किसी आइटम की समाप्ति की अनुमति नहीं देता है, और सत्र समाप्त होने के लिए सेट हो जाते हैं, तो सेट में अनन्य सत्र आईडी का एक टन होगा।रेडिस, सत्र समाप्ति, और रिवर्स लुकअप

कुंजी समाप्ति पर सेट से आईडी को हटाने का सबसे अच्छा तरीका क्या होगा? या, क्या मैं चाहता हूं कि पूरा करने का एक बेहतर तरीका है (रिवर्स लुकअप)?

उत्तर

16

रेडिस (2.6) की वर्तमान रिलीज शाखा पर, आइटम समाप्त होने पर आपको अधिसूचनाएं नहीं हो सकती हैं। यह शायद अगले संस्करणों के साथ बदल जाएगा।

इस बीच, आपकी आवश्यकता का समर्थन करने के लिए, आपको समाप्ति अधिसूचना समर्थन मैन्युअल रूप से कार्यान्वित करने की आवश्यकता है। तो आपके पास है:

session:<sessionid> -> a hash storing your session data - one of the field is <userid> 
user:<userid> -> a set of <sessionid> 

सत्र समाप्त होने पर आपको उपयोगकर्ता सेट से सत्र आईडी को हटाने की आवश्यकता है। तो आप एक अतिरिक्त क्रमबद्ध सेट को बनाए रख सकते हैं जिसका स्कोर टाइमस्टैम्प है।

आप उपयोगकर्ता 100 के लिए सत्र 10 बनाते हैं:

MULTI 
HMSET session:10 userid:100 ... other session data ... 
SADD user:100 10 
ZADD to_be_expired <current timestamp + session timeout> 10 
EXEC 

उसके बाद, आप एक डेमॉन जो zset मतदान सत्र की पहचान के लिए समाप्त करने के लिए होगा (ZRANGEBYSCORE) का निर्माण करने की जरूरत है।

  • zset से बाहर सत्र पॉप (ZREMRANGEBYRANK)
  • सत्र userid पुनः प्राप्त (HMGET)
  • सत्र हटाना (डेल)
  • निकालें: प्रत्येक की अवधि समाप्त हो सत्र के लिए, यह डेटा संरचना को बनाए रखने की है उपयोगकर्ता आईडी सेट (एसआरईएम) से सत्र

मुख्य कठिनाई यह सुनिश्चित करना है कि डेमॉन चुनावों और वस्तुओं को संसाधित करते समय कोई दौड़ की स्थिति न हो। यह प्रश्न देखने के लिए मेरा प्रश्न देखें कि इसे कैसे कार्यान्वित किया जा सकता है:

how to handle session expire basing redis?

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