एक रेडिस सूची में सभी प्रविष्टियों को हटा दें


82

मान लीजिए कि आपके पास Redis में एक LIST डेटाटाइप है। आप इसकी सभी प्रविष्टियाँ कैसे हटाते हैं? मैंने पहले से ही यह कोशिश की है:

LTRIM key 0 0
LTRIM key -1 0

वे दोनों पहले तत्व को छोड़ देते हैं। यह सभी तत्वों को छोड़ देगा:

LTRIM key 0 -1

किसी सूची को पूरी तरह से खाली करने के लिए मुझे एक अलग कमांड नहीं दिखती है।


2
@ डेविडजम्स: इसे वर्तनी के दूसरे तरीके पर विचार करें "फू।" मैं रेडिस
पॉल ए जुंगविर्थ

हां, रेडिस में, सभी डेटा संरचनाएं चाबियाँ हैं। इसका मतलब यह नहीं है कि 'कुंजी' एक उदाहरण में उपयोगी है। इसके विपरीत, मुझे लगता है। उपयोग mylistकरने से आपका प्रश्न स्पष्ट हो जाएगा। उदाहरण के लिए, redis.io/commands/ltrim लिखते हैं LTRIM mylist 1 -1:। आपके द्वारा उद्धृत पृष्ठ एक कमांड संदर्भ है और इसे अच्छे उदाहरण बनाने के लिए "सम्मेलन" नहीं माना जाना चाहिए।
डेविड जे।

जवाबों:


151

कुंजी हटाएँ, और वह सभी आइटम साफ़ कर देगा। सूची का न होना, इसमें किसी भी वस्तु के न होने के समान है। जब आप किसी गैर-मौजूद कुंजी तक पहुँचने का प्रयास करते हैं तो रेडिस कोई अपवाद नहीं फेंकेंगे।

DEL key

यहाँ कुछ कंसोल लॉग हैं।

रेडिस> कुंजी *
(खाली सूची या सेट)
redis> LPUSH का नाम जॉन है
(पूर्णांक) १
redis> एलपीयूएसएच नाम मैरी
(पूर्णांक) २
redis> एलपीयूएसएच नाम एलिस
(पूर्णांक) ३
redis> LLEN नाम
(पूर्णांक) ३
redis> LRANGE नाम 0 2
1) "एलिस"
2) "मैरी"
3) "जॉन"
रेडिस> DEL नाम
(पूर्णांक) १
redis> LLEN नाम
(पूर्णांक) ०
redis> LRANGE नाम 0 2
(खाली सूची या सेट)

क्या ऐसा करने का एक तरीका एक परमाणु ऑपरेशन में है? (दोनों "LRANGE नाम 0 2" और "DEL नाम")
refaelos

1
डेल may create extra overhead, टाइम जटिलता: ओ (एन) का उपयोग करते हुए एक चीज जहां एन कुंजी की संख्या है जिसे हटा दिया जाएगा। जब हटाने की कुंजी एक स्ट्रिंग के अलावा एक मूल्य रखती है, तो इस कुंजी के लिए व्यक्तिगत जटिलता ओ (एम) है जहां एम सूची में तत्वों की संख्या है, सेट, सॉर्ट सेट या हैश। स्ट्रिंग मान रखने वाली एकल कुंजी को हटाना O (1) है। डॉक्स
ChewOnThis_Trident

2
यह विधि खतरनाक है क्योंकि यह कुंजी के ttl को भी हटा देती है
साइतामा

17

आप सूची में सभी मान तभी निकाल सकते हैं जब सूची में एक से अधिक मूल्य हों

LTRIM key -1 0

उदाहरण:

redis 127.0.0.1:6379> RPUSH mylist four 1 3 1
(integer) 4
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"
6) "mylist"
redis 127.0.0.1:6379> LTRIM mylist -1 0
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
(empty list or set)
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"

लेकिन यदि सूची में केवल एक मूल्य है, तो आपको इसका उपयोग करना चाहिए

DEL key 

जैसे कि स्वीकृत उत्तर की टिप्पणियों में उल्लेख किया गया है: DEL कुंजी भी सूची के ttl को हटा देगा
patrick

4

बस LTRIM का उपयोग करें । ... Aaaand जादू यहाँ से start अधिक का उपयोग करने के लिए हैend

LTRIM key 99 0

और ... उछाल! तत्वों की पूरी सूची जाती है। सिर्फ * पूफ़ * अपनी आँखों के ठीक सामने !! कोई अवशेष शेष नहीं, और बिल्कुल कोई प्रश्न नहीं पूछा गया।

नोट: इससे कुंजी को "हटा दिया गया" ( हटाए गए के रूप में ) यहां वर्णित किया जाएगा

... यदि प्रारंभ सूची के अंत से बड़ा है, या प्रारंभ> अंत है, तो परिणाम एक खाली सूची होगी (जिसके कारण कुंजी को हटाया जा सकता है)।


क्या कोई कारण है जिसे आप DEL key@ अनुराग के उत्तर में पसंद करते हैं ? ऐसा लगता है कि जैसे उनका प्रभाव है।
पॉल ए जंगविर्थ

स्पष्ट रूप से, बेंचमार्क पर गौर करने का समय नहीं मिला, बस डॉक्स पढ़ रहा था जब मैंने उपरोक्त विधि की खोज की, तो सोचा कि यह भी उल्लेख कर सकता है।
मोहम्मद अब्दुल मुजीब

1
ठीक है शुक्रिया! अपवोटेड क्योंकि मैं LTRIMबार-बार उपयोग करने वाले एल्गोरिदम की कल्पना कर सकता हूं , और यह जानना अच्छा है कि क्या होता है जब दूसरा पैरामीटर पहले से नीचे आता है। मैं देख सकता हूं कि इस व्यवहार का शोषण कुछ कोड को और अधिक सुरुचिपूर्ण बना सकता है।
पॉल ए जंगविर्थ

0

स्वीकृत उत्तर गलत है। मुझे लगता है

redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 
6) "mylist" 

अहम् के उदाहरण का उपयोग करना, जो वास्तव में सही है। अब, अगर मैं:

DEL 'test4'

मैं इसके साथ समाप्त होता हूं:

1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "firstList" 
5) "mylist"` 

इसलिए, मैंने 'test4' सूची से सभी प्रविष्टियाँ नहीं निकालीं, मैंने test4 को ही हटा दिया । एक ही बात नहीं है। बिल्कुल नहीं। मेरे पास एक छोटा सा ऐप है, जहां लिस्ट कीज़ कई डेटा से गणना की गई हैं (ठीक है, वे सभी नहीं हैं?), उन सूचियों को कभी-कभी साफ़ कर दिया जाता है, लेकिन खाली सूची और गैर-मौजूद सूची के शब्दार्थ बहुत भिन्न होते हैं। इसलिए, नहीं, मैं 'myhashes' DEL नहीं करना चाहता, मैं केवल सभी प्रविष्टियाँ निकालना चाहता हूँ।

खबरदार, ओह तुम कौन यहाँ घूमते हो।


यदि आप नीचे दिए गए पृष्ठ को देखेंगे तो आप देखेंगे कि वास्तव में शब्दार्थ एक ही है! से लिया गया :The LPUSH command inserts a new element on the head, while RPUSH inserts a new element on the tail. A new list is created when one of this operations is performed against an empty key. Similarly the key is removed from the key space if a list operation will empty the list. These are very handy semantics since all the list commands will behave exactly like they were called with an empty list if called with a non-existing key as argument.
डोमिनिक

घोड़ों के मुंह से: "इसी तरह कुंजी को कुंजी स्थान से हटा दिया जाता है यदि एक सूची ऑपरेशन सूची को खाली कर देगा।" तो, {[], [], []} === {[]} है? मेरे लिए नहीं। मुझे लगता है कि हम विभिन्न टोपोलॉजिकल स्पेस में हैं .... :)
डेमोसफ़ेयर

खैर प्रारंभिक प्रश्न यह था कि रेडिस में संपूर्ण सूची को कैसे हटाया जाए। इसलिए यदि आप या तो कुंजी को हटाते हैं या सभी प्रविष्टियों को हटाते हैं और कुंजी को स्वचालित रूप से हटा दिया जाता है तो वही परिणाम देता है। इसलिए मुझे यकीन नहीं है कि आपका {{], [], []} === {[]} से क्या मतलब है।
डोमिनिक

अंतिम तत्व को सूची से हटाना कुंजी को हटाने के बराबर है। यह लिंक LIST के लिए भी समान है (RPOPLPUSH के साथ परीक्षण) bennadel.com/blog/…
Sugumar

0

मैंने यह कोशिश की और यह मेरे लिए काम करता है। बस अपनी सूची के नाम के लिए myList बदलें और इसे निष्पादित करें redis-cli KEYS "myList:*" | xargs redis-cli DEL


1
हालांकि यह काम करता है, keysएक अत्यंत भारी ऑपरेशन है जिसमें आपके डेटाबेस में हर एक कुंजी को पार्स करना शामिल है, जो इस मामले में काफी अनावश्यक है, या ज्यादातर मामलों में
एडलकर

0

यह एक देर से प्रतिक्रिया हो सकती है, लेकिन अगर किसी को अभी भी उस कार्यक्षमता की आवश्यकता है, तो मैं इसे यहां चिपका रहा हूं।

संक्षिप्त जवाब

ltrim mylist 0 - (n + 1) जहां mylist कुंजी है और n, mylist की लंबाई है।

लंबा जवाब

जिस तरह से ltrim काम करता है, वह दो सूचकांकों को लेता है और उन तत्वों को वापस करता है जो सूचकांकों के बीच आते हैं।

Ltrim सूची startIndex endIndex

उदाहरण मान लें कि हमारे पास 10 प्रविष्टियों वाली प्रमुख mylist के साथ एक लाल सूची है:

ltrim mylist 0 5 सूची 0 से अनुक्रमणिका 5 तक शुरू होने वाले तत्वों की सूची को ट्रिम 5. के माध्यम से विभाजित करेगा और उन लोगों को छोड़ देगा जो उस सीमा के बाहर आते हैं।

सौभाग्य से रेडिस सूची संचालन नकारात्मक अनुक्रमण का समर्थन करता है जो कुछ स्थितियों में अत्यंत उपयोगी साबित होता है। आमतौर पर जब आप सूची की लंबाई नहीं जानते हैं।

-1 से तात्पर्य अंतिम तत्व से है, - 2 पारमार्थिक तत्व, आदि और (एन) पहला तत्व है।

आउट ऑफ़ रेंज इंडेक्स हानिकारक नहीं हैं। यदि अंतिम इंडेक्स सूची की लंबाई से अधिक है, तो रेडिस इसे अंतिम इंडेक्स के बराबर मानता है।

यही कारण है कि ltrim mylist 0, - (n +1) सूची को साफ़ करें। यह ऐसा इसलिए करता है क्योंकि (-n) इंडेक्स 0. के बराबर है। इसमें 1 जोड़ना इस सीमा के भीतर कोई तत्व नहीं छोड़ता है क्योंकि यह पहले तत्व से पहले होगा।


अपनी अंतर्दृष्टि साझा करने के लिए धन्यवाद। आपके उत्तर के विस्तार के रूप में, आप बस एन के एक मूल्य की आपूर्ति कर सकते हैं जो इस सूची की तुलना में पर्याप्त रूप से बड़ा है कि सभी वस्तुओं को हटा दिया जाए। उदाहरण के लिए ltrim mylist 0 -99999
डेव जॉनसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.