Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

एक रेडिस लुआ स्क्रिप्ट के साथ एकाधिक डीबी का प्रयोग करें?

संबंधित डेटा को अलग-अलग Redis डेटाबेस में रखना आमतौर पर एक गलत विचार है। कुंजी नामकरण सम्मेलनों द्वारा नामस्थानों को परिभाषित करने की तुलना में लगभग कोई लाभ नहीं है (सुरक्षा, दृढ़ता, समाप्ति प्रबंधन, आदि के संबंध में कोई अतिरिक्त ग्रैन्युलैरिटी नहीं ...) और एक बड़ी कमी यह है कि ग्राहकों को सही डेटाबेस के चयन को मैन्युअल रूप से संभालना पड़ता है, जो एक ही समय में कई डेटाबेस को लक्षित करने वाले ग्राहकों के लिए त्रुटि प्रवण होता है।

अब, यदि आप अभी भी एकाधिक डेटाबेस का उपयोग करना चाहते हैं, तो इसे redis-py और Lua स्क्रिप्टिंग के साथ काम करने का एक तरीका है।

अंतर्निहित थ्रेड-सुरक्षित कनेक्शन पूल कार्यान्वयन के कारण, redis-py SELECT कमांड (आमतौर पर वर्तमान डेटाबेस को स्विच करने के लिए उपयोग किया जाता है) के लिए एक रैपर को परिभाषित नहीं करता है। लेकिन कुछ भी आपको Lua स्क्रिप्ट से SELECT को कॉल करने से नहीं रोकता है।

निम्नलिखित उदाहरण पर विचार करें:

$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1

निम्न स्क्रिप्ट एक ही क्लाइंट कनेक्शन से 2 डेटाबेस में mykey का मान प्रदर्शित करती है।

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

lua1 = """
   redis.call("select", ARGV[1])
   return redis.call("get",KEYS[1])
"""
script1 = r.register_script(lua1)

lua2 = """
   redis.call("select", ARGV[1])
   local ret = redis.call("get",KEYS[1])
   redis.call("select", ARGV[2])
   return ret
"""
script2 = r.register_script(lua2)

print r.get("mykey")
print script2( keys=["mykey"], args = [1,0] )
print r.get("mykey"), "ok"
print
print r.get("mykey")
print script1( keys=["mykey"], args = [1] )
print r.get("mykey"), "misleading !!!"

स्क्रिप्ट lua1 अनुभवहीन है:यह मान वापस करने से पहले किसी दिए गए डेटाबेस का चयन करता है। इसका उपयोग भ्रामक है, क्योंकि इसके निष्पादन के बाद, कनेक्शन से जुड़ा वर्तमान डेटाबेस बदल गया है। ऐसा मत करो।

स्क्रिप्ट lua2 बहुत बेहतर है। यह लक्ष्य डेटाबेस और वर्तमान डेटाबेस को पैरामीटर के रूप में लेता है। यह सुनिश्चित करता है कि स्क्रिप्ट के अंत से पहले वर्तमान डेटाबेस को फिर से सक्रिय किया गया है, ताकि कनेक्शन पर लागू अगला कमांड अभी भी सही डेटाबेस में चले। दुर्भाग्य से, लुआ स्क्रिप्ट में वर्तमान डेटाबेस का अनुमान लगाने के लिए कोई कमांड नहीं है, इसलिए क्लाइंट व्यवस्थित रूप से उपलब्ध कराना है। कृपया ध्यान दें कि लुआ स्क्रिप्ट को वर्तमान डेटाबेस को अंत में रीसेट करना चाहिए (यहां तक ​​​​कि पिछली त्रुटि के मामले में भी), इसलिए यह जटिल स्क्रिप्ट को बोझिल और अजीब बनाता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 100% CPU होने पर Redis के प्रदर्शन को कैसे बढ़ाया जाए? साझा करना? सबसे तेज़ नेट क्लाइंट?

  2. रेडिस स्लेव मास्टर के साथ सिंक नहीं करेगा

  3. फेय या रेडिस पबसुब

  4. लॉकिंग और रेडिस

  5. दावे की समय सीमा समाप्त होने वाली रेडिस कतार