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

Dapatkan semua kunci dalam database Redis dengan python

Gunakan scan_iter()

scan_iter() lebih unggul dari keys() untuk sejumlah besar kunci karena memberikan Anda iterator yang dapat Anda gunakan daripada mencoba memuat semua kunci ke dalam memori.

Saya memiliki catatan 1B di redis saya dan saya tidak pernah bisa mendapatkan cukup memori untuk mengembalikan semua kunci sekaligus.

KUNCI PEMINDAI SATU-PERSATU

Berikut ini cuplikan python menggunakan scan_iter() untuk mendapatkan semua kunci dari toko yang cocok dengan pola dan menghapusnya satu per satu:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
    # delete the key
    r.delete(key)

PINDIKASI DALAM BATCH

Jika Anda memiliki daftar kunci yang sangat banyak untuk dipindai - misalnya, lebih besar dari>100 ribu kunci - akan lebih efisien untuk memindainya secara berkelompok, seperti ini:

import redis
from itertools import izip_longest

r = redis.StrictRedis(host='localhost', port=6379, db=0)

# iterate a list in batches of size n
def batcher(iterable, n):
    args = [iter(iterable)] * n
    return izip_longest(*args)

# in batches of 500 delete keys matching user:*
for keybatch in batcher(r.scan_iter('user:*'),500):
    r.delete(*keybatch)

Saya membandingkan skrip ini dan menemukan bahwa menggunakan ukuran batch 500 adalah 5 kali lebih cepat daripada memindai kunci satu per satu. Saya menguji ukuran batch yang berbeda (3.50.500.1000.5000) dan menemukan bahwa ukuran batch 500 tampaknya optimal.

Perhatikan apakah Anda menggunakan scan_iter() atau keys() metode, operasi tidak atom dan bisa gagal di tengah jalan.

Jelas HINDARI MENGGUNAKAN XARGS PADA COMMAND-LINE

Saya tidak merekomendasikan contoh ini saya temukan diulang di tempat lain. Ini akan gagal untuk kunci unicode dan sangat lambat bahkan untuk jumlah kunci yang sedang:

redis-cli --raw keys "user:*"| xargs redis-cli del

Dalam contoh ini xargs membuat proses redis-cli baru untuk setiap kunci! itu buruk.

Saya membandingkan pendekatan ini menjadi 4 kali lebih lambat dari contoh python pertama di mana ia menghapus setiap kunci satu per satu dan 20 kali lebih lambat daripada menghapus dalam batch 500.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara membuat kunci terdistribusi dengan Redis?

  2. Redis Update Diurutkan Set pada Key Expire

  3. Bagaimana cara mendapatkan nilai dari Redis menggunakan kunci yang berisi spasi?

  4. Bagaimana cara kerja kegagalan ServiceStack PooledRedisClientManager?

  5. Apakah perintah redis incr dapat dibatasi untuk nomor tertentu?