2012-03-22 21 views
53

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

LTRIM key 0 0 
LTRIM key -1 0 

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

LTRIM key 0 -1 

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

+2

@ डेविडजम्स: इसे "foo" वर्तनी का एक और तरीका मानें। मैं रेडिस के अपने दस्तावेज में इस्तेमाल किए गए सम्मेलन का पालन कर रहा हूं: http://redis.io/commands/ –

+0

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

उत्तर

94

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

DEL key 

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

 
redis> KEYS * 
(empty list or set) 
redis> LPUSH names John 
(integer) 1 
redis> LPUSH names Mary 
(integer) 2 
redis> LPUSH names Alice 
(integer) 3 
redis> LLEN names 
(integer) 3 
redis> LRANGE names 0 2 
1) "Alice" 
2) "Mary" 
3) "John" 
redis> DEL names 
(integer) 1 
redis> LLEN names 
(integer) 0 
redis> LRANGE names 0 2 
(empty list or set) 
+0

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

+0

हां। रेडिस लेनदेन देखें - http://redis.io/topics/transactions – Anurag

+1

डेल का उपयोग करके एक चीज अतिरिक्त ओवरहेड बना सकती है, समय जटिलता: ओ (एन) जहां एन हटाए जाने वाले चाबियों की संख्या है। जब निकालने की कुंजी स्ट्रिंग के अलावा कोई मान रखती है, तो इस कुंजी के लिए व्यक्तिगत जटिलता ओ (एम) है जहां एम सूची, सेट, क्रमबद्ध सेट या हैश में तत्वों की संख्या है। एक स्ट्रिंग मान रखने वाली एक कुंजी को निकालना ओ (1) है। [डॉक्स] (http://redis.io/commands/del) –

11

आप सूची में सभी मूल्यों को हटा सकते हैंकेवल अगर सूची एक से अधिक महत्व है

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" 

लेकिन अगर सूची में एक मूल्य ओएनएल है y, आपको

DEL key 
-1

स्वीकृत उत्तर गलत है। मान लीजिए कि मेरे पास

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 ही हटा दिया। एक ही बात नहीं। बिल्कुल नहीं। मेरे पास एक छोटा सा ऐप है जहां सूची कुंजी कई डेटा से गणना की जाती है (ठीक है, क्या वे सभी नहीं हैं?), उन सूचियों को कभी-कभी साफ़ कर दिया जाता है, लेकिन रिक्त सूची का अर्थशास्त्र और एक अस्तित्व सूची बहुत अलग होती है। तो, नहीं, मैं DEL 'myhashes' नहीं करना चाहता, मैं बस सभी प्रविष्टियों को हटाना चाहता हूं।

सावधान रहें, ओह, जो यहां घूमते हैं।

+0

की ttl ** को हटा दें यदि आप नीचे दिए गए पृष्ठ को देखेंगे तो आप देखें कि वास्तव में अर्थशास्त्र एक ही हैं! लिया [से] (http://redis.io/topics/data-types#lists): 'एलपीयूएसएच कमांड सिर पर एक नया तत्व डालता है, जबकि RPUSH पूंछ पर एक नया तत्व डालता है। एक नई सूची बनाई जाती है जब इस अभियान में से एक खाली कुंजी के खिलाफ किया जाता है। इसी तरह कुंजी सूची से कुंजी हटा दी जाती है यदि एक सूची ऑपरेशन सूची खाली कर देगा। ये बहुत ही आसान अर्थशास्त्र हैं क्योंकि सभी सूची कमांड ठीक तरह से व्यवहार करेंगे जैसे उन्हें एक खाली सूची के साथ बुलाया जाता है यदि गैर-मौजूदा कुंजी के साथ तर्क के रूप में कहा जाता है। घोड़ों के मुंह से – Dominic

+0

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

+0

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

1

मैं अपने फोन पर जवाब दे रहा हूं इसलिए वास्तव में उत्तर को अच्छी तरह प्रारूपित नहीं कर सकता।

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

लघु जवाब

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

लांग जवाब

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

Ltrim सूची STARTINDEX ENDINDEX

उदाहरण मानते हुए हम कुंजी 10 प्रविष्टियों युक्त MyList के साथ एक redis सूची है: सूचकांक से 5 के माध्यम से

ltrim MyList 0 5 सूचकांक 0 से शुरू तत्वों के लिए सूची ट्रिम जाएगा। और उन सीमाओं को छोड़ दें जो उस सीमा से बाहर आते हैं।

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

-1 अंतिम तत्व को संदर्भित करता है, - 2 अंतिम तत्व, आदि और (-n) पहला तत्व है।

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

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

+0

आपकी अंतर्दृष्टि साझा करने के लिए धन्यवाद। आपके उत्तर के विस्तार के रूप में, आप बस एन के मूल्य की आपूर्ति कर सकते हैं जो कि सूची से पर्याप्त रूप से बड़ा है, यह गारंटी देने के लिए कि सभी आइटम हटा दिए गए हैं। उदाहरण के लिए 'ltrim mylist 0 -99999'। –

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