Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

bagaimana cara mendapatkan kunci yang tidak cocok dengan pola tertentu di redis?

PENTING: selalu gunakan SCAN bukannya (jahat ) KEYS

Pencocokan pola Redis agak terbatas secara fungsional (lihat implementasi stringmatchlen di util.c) dan tidak memberikan apa yang Anda cari ATM. Karena itu, pertimbangkan kemungkinan rute berikut:

  1. Perpanjang stringmatchlen agar sesuai dengan kebutuhan Anda, mungkin mengirimkannya sebagai PR.
  2. Pertimbangkan apa yang Anda coba lakukan - mengambil subset kunci selalu tidak efisien kecuali Anda mengindeksnya, pertimbangkan untuk melacak nama semua kunci non-pengguna (mis. dalam Set Redis).
  3. Jika Anda benar-benar bersikeras untuk memindai seluruh ruang kunci dan mencocokkan dengan pola negatif, satu cara untuk mencapainya adalah dengan sedikit keajaiban Lua.

Perhatikan kumpulan data dan skrip berikut:

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

Lua (simpan ini sebagai 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

Keluaran - pertama kali pencocokan reguler, kedua kali pelengkap:

[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"


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis sebagai database

  2. Pengantar Redis

  3. Redis zrevrangebyscore, pengurutan selain urutan leksikografis

  4. fungsi siaran socket.io &arsitektur Redis pub/sub

  5. Menggunakan nginx untuk menyajikan konten langsung dari cache redis