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

Bagaimana cara menghapus jutaan kunci yang cocok dengan pola secara atom menggunakan Redis murni?

Script Lua berikut menggunakan SCAN perintah, sehingga menghapus sebagian dalam skrip - menghindari kesalahan "terlalu banyak elemen untuk dibongkar".

local cursor = 0
local calls = 0
local dels = 0
repeat
    local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1])
    calls = calls + 1
    for _,key in ipairs(result[2]) do
        redis.call('DEL', key)
        dels = dels + 1
    end
    cursor = tonumber(result[1])
until cursor == 0
return "Calls " .. calls .. " Dels " .. dels

Ini mengembalikan berapa kali SCAN dipanggil dan berapa banyak kunci yang dihapus.

Gunakan sebagai:

EVAL "local cursor = 0 local calls = 0 local dels = 0 repeat    local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1])     calls = calls + 1   for _,key in ipairs(result[2]) do       redis.call('DEL', key)      dels = dels + 1     end     cursor = tonumber(result[1]) until cursor == 0 return 'Calls ' .. calls .. ' Dels ' .. dels" 0 prefix:1

Perhatikan itu akan memblokir server saat berjalan, jadi tidak disarankan untuk produksi apa adanya.

Untuk produksi, pertimbangkan untuk mengubah DEL untuk UNLINK . Anda juga dapat mengembalikan kursor (alih-alih mengulangi di dalam skrip hingga nol) dan menambahkan parameter COUNT ke SCAN untuk mencekik (lihat Apakah ada nilai COUNT yang direkomendasikan untuk perintah SCAN / HSCAN di REDIS?). Dengan cara ini Anda melakukannya dalam potongan alih-alih sekali jalan, mirip dengan Bagaimana saya bisa mendapatkan semua set dalam redis?

Atau Anda dapat melakukan sesuatu yang lebih canggih menggunakan pendekatan yang dinyatakan dalam jawaban ini:Redis `SCAN`:bagaimana menjaga keseimbangan antara kunci baru yang mungkin cocok dan memastikan hasil akhirnya dalam waktu yang wajar?



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. HSET jika kunci ada

  2. Tidak dapat terhubung ke redis menggunakan jedis

  3. Mengonfigurasi redis untuk secara konsisten mengeluarkan data lama terlebih dahulu

  4. Menyalahgunakan cURL untuk berkomunikasi dengan Redis

  5. Menemukan nilai dengan menggunakan nama kunci parsial dalam Redis Sorted Set