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

अजगर के साथ रेडिस डेटाबेस में सभी कुंजियाँ प्राप्त करें

scan_iter() Use का इस्तेमाल करें

scan_iter() keys() . से बेहतर है बड़ी संख्या में चाबियों के लिए क्योंकि यह आपको एक पुनरावर्तक देता है जिसका उपयोग आप सभी कुंजियों को स्मृति में लोड करने की कोशिश करने के बजाय कर सकते हैं।

मेरे रेडिस में मेरे पास 1B रिकॉर्ड था और मुझे कभी भी इतनी मेमोरी नहीं मिली कि एक बार में सभी चाबियां वापस कर सकें।

कुंजी को एक-एक करके स्कैन करना

यहां scan_iter() . का उपयोग करते हुए एक पायथन स्निपेट दिया गया है एक पैटर्न से मेल खाने वाले स्टोर से सभी चाबियां प्राप्त करने के लिए और उन्हें एक-एक करके हटाएं:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
    # delete the key
    r.delete(key)

बैच में स्कैन करना

यदि आपके पास स्कैन करने के लिए कुंजियों की एक बहुत बड़ी सूची है - उदाहरण के लिए,>100k कुंजियों से बड़ी - तो उन्हें बैचों में स्कैन करना अधिक कुशल होगा, जैसे:

import redis
from itertools import izip_longest

r = redis.StrictRedis(host='localhost', port=6379, db=0)

# iterate a list in batches of size n
def batcher(iterable, n):
    args = [iter(iterable)] * n
    return izip_longest(*args)

# in batches of 500 delete keys matching user:*
for keybatch in batcher(r.scan_iter('user:*'),500):
    r.delete(*keybatch)

मैंने इस स्क्रिप्ट को बेंचमार्क किया और पाया कि 500 ​​के बैच आकार का उपयोग एक-एक करके स्कैनिंग कुंजियों की तुलना में 5 गुना तेज था। मैंने विभिन्न बैच आकारों (3,50,500,1000,5000) का परीक्षण किया और पाया कि 500 ​​का बैच आकार इष्टतम लगता है।

ध्यान दें कि क्या आप scan_iter() . का उपयोग करते हैं या keys() विधि, ऑपरेशन परमाणु नहीं है और आंशिक रूप से विफल हो सकता है।

निश्चित रूप से कमांड-लाइन पर XARGS का उपयोग करने से बचें

मैं इस उदाहरण की अनुशंसा नहीं करता हूं जिसे मैंने कहीं और दोहराया है। यह यूनिकोड कुंजियों के लिए विफल हो जाएगा और मध्यम संख्या में कुंजियों के लिए भी अविश्वसनीय रूप से धीमा है:

redis-cli --raw keys "user:*"| xargs redis-cli del

इस उदाहरण में xargs प्रत्येक कुंजी के लिए एक नई रेडिस-क्ली प्रक्रिया बनाता है! यह बुरा है।

मैंने इस दृष्टिकोण को पहले पायथन उदाहरण की तुलना में 4 गुना धीमा होने के लिए बेंचमार्क किया है, जहां इसने प्रत्येक कुंजी को एक-एक करके हटा दिया और 500 के बैचों में हटाने की तुलना में 20 गुना धीमी है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. डेटास्टोर के लिए रेडिस से मोंगोडीबी तक डेटा जारी रखना

  2. Node.js . से रेडिस का उपयोग कैसे करें

  3. नोड रेडिस को सुरक्षित करना

  4. फेडोरा 12 . पर phpredis

  5. रेडिस - उपयोगकर्ता नाम, पासवर्ड और डीबी?