महत्वपूर्ण: हमेशा SCAN
का उपयोग करें के बजाय (बुराई ) KEYS
रेडिस का पैटर्न मिलान कुछ हद तक कार्यात्मक रूप से सीमित है (stringmatchlen
. का कार्यान्वयन देखें) in util.c) और वह प्रदान नहीं करता जो आप एटीएम चाहते हैं। उस ने कहा, निम्नलिखित संभावित मार्गों पर विचार करें:
- विस्तार
stringmatchlen
अपनी आवश्यकताओं से मेल खाने के लिए, संभवतः इसे पीआर के रूप में सबमिट करना। - विचार करें कि आप क्या करने की कोशिश कर रहे हैं - चाबियों का एक सबसेट प्राप्त करना हमेशा अक्षम होता है जब तक कि आप उन्हें अनुक्रमित नहीं करते हैं, इसके बजाय सभी गैर-उपयोगकर्ता कुंजियों (जैसे रेडिस सेट में) के नामों को ट्रैक करने पर विचार करें।
- यदि आप वास्तव में पूरे कीस्पेस को स्कैन करने और नकारात्मक पैटर्न से मेल खाने पर जोर दे रहे हैं, तो इसे पूरा करने का एक तरीका थोड़ा सा लुआ जादू है।
निम्नलिखित डेटासेट और स्क्रिप्ट पर विचार करें:
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> set user:1 1
OK
127.0.0.1:6379> set use:the:force luke
OK
127.0.0.1:6379> set non:user a
OK
लुआ (इसे scanregex.lua
के रूप में सेव करें) ):
local re = ARGV[1]
local nt = ARGV[2]
local cur = 0
local rep = {}
local tmp
if not re then
re = ".*"
end
repeat
tmp = redis.call("SCAN", cur, "MATCH", "*")
cur = tonumber(tmp[1])
if tmp[2] then
for k, v in pairs(tmp[2]) do
local fi = v:find(re)
if (fi and not nt) or (not fi and nt) then
rep[#rep+1] = v
end
end
end
until cur == 0
return rep
आउटपुट - पहली बार नियमित मिलान, दूसरी बार पूरक:
[email protected]:~$ redis-cli --eval scanregex.lua , "^user"
1) "user:1"
[email protected]:~$ redis-cli --eval scanregex.lua , "^user" 1
1) "use:the:force"
2) "non:user"