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 गुना धीमी है।