ज्यादातर मामलों में, SADD
या ZADD
पाइपलाइनिंग कमांड के साथ बेहतर होगा। एक बहु/EXEC लेनदेन का उपयोग करें यदि जोखिम है तो किसी अन्य ग्राहक को बीच में कुंजी मिल सकती है, इसलिए एक अपूर्ण वस्तु प्राप्त हो रही है।
हैश-फ़ील्ड में सूची को स्ट्रिंग करना कुछ मामलों में उचित हो सकता है।
'जल्दी से चाबियों को बेदखल' करने के संबंध में, UNLINK
. का उपयोग करना सुनिश्चित करें DEL
. के बजाय ।
यदि आप स्ट्रिंग करना चुनते हैं, तो लुआ और लुआ सीजेएसओएन लाइब्रेरी का उपयोग करके हैश फ़ील्ड में जेएसओएन-एन्कोडेड सरणी में परमाणु रूप से सम्मिलित करने और निकालने का समर्थन कैसे करें:
सम्मिलित करें :
local items = cjson.decode(redis.call('HGET', KEYS[1], 'items'))
table.insert(items, ARGV[1])
return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))
मान के आधार पर निकालें :
local items = cjson.decode(redis.call('HGET', KEYS[1], 'items'))
local pos = -1;
for i, v in ipairs(items) do
if ARGV[1] == v then
pos = i
break
end
end
if pos == -1 then
return -1
else
table.remove(items, pos)
return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))
end
उपयोग उदाहरण :
> HGETALL meta_key
1) "user"
2) "12345"
3) "tag"
4) "D12321341234123"
5) "items"
6) "{}"
> EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n table.insert(items, ARGV[1]) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))" 1 meta_key value1
(integer) 0
> HGETALL meta_key
1) "user"
2) "12345"
3) "tag"
4) "D12321341234123"
5) "items"
6) "[\"value1\"]"
> EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n table.insert(items, ARGV[1]) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))" 1 meta_key value2
(integer) 0
> HGETALL meta_key
1) "user"
2) "12345"
3) "tag"
4) "D12321341234123"
5) "items"
6) "[\"value1\",\"value2\"]"
> EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n local pos = -1; \n for i, v in ipairs(items) do \n if ARGV[1] == v then \n pos = i \n break \n end \n end \n if pos == -1 then \n return -1 \n else \n table.remove(items, pos) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items)) \n end" 1 meta_key value1
(integer) 0
> HGETALL meta_key
1) "user"
2) "12345"
3) "tag"
4) "D12321341234123"
5) "items"
6) "[\"value2\"]"
> EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n local pos = -1; \n for i, v in ipairs(items) do \n if ARGV[1] == v then \n pos = i \n break \n end \n end \n if pos == -1 then \n return -1 \n else \n table.remove(items, pos) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items)) \n end" 1 meta_key value3
(integer) -1
> HGETALL meta_key
1) "user"
2) "12345"
3) "tag"
4) "D12321341234123"
5) "items"
6) "[\"value2\"]"