Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Nhận tất cả các khóa trong cơ sở dữ liệu Redis bằng python

Sử dụng scan_iter()

scan_iter() vượt trội hơn so với keys() cho số lượng lớn các khóa vì nó cung cấp cho bạn một trình lặp để bạn có thể sử dụng thay vì cố gắng tải tất cả các khóa vào bộ nhớ.

Tôi có một bản ghi 1B trong redis của mình và tôi không bao giờ có đủ bộ nhớ để trả lại tất cả các khóa cùng một lúc.

CÁC CHÌA KHÓA QUÉT TỪ MỘT CHÌA KHÓA

Đây là đoạn mã python sử dụng scan_iter() để lấy tất cả các khóa từ cửa hàng khớp với một mẫu và xóa từng chiếc một:

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

KẾ HOẠCH TRONG TRẬN ĐẤU

Nếu bạn có một danh sách rất lớn các khóa cần quét - ví dụ:lớn hơn 100 nghìn khóa - sẽ hiệu quả hơn nếu quét chúng hàng loạt, như thế này:

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)

Tôi đã đánh giá điểm chuẩn cho tập lệnh này và nhận thấy rằng việc sử dụng kích thước lô 500 nhanh hơn gấp 5 lần so với việc quét từng phím một. Tôi đã thử nghiệm các kích thước lô khác nhau (3,50,500,1000,5000) và nhận thấy rằng kích thước lô 500 có vẻ là tối ưu.

Lưu ý rằng bạn có sử dụng scan_iter() hay không hoặc các phím keys() , hoạt động không phải là nguyên tử và có thể thất bại một phần.

HÃY TRÁNH SỬ DỤNG XARGS TRÊN DÒNG THÔNG DỤNG

Tôi không giới thiệu ví dụ này mà tôi đã tìm thấy lặp lại ở những nơi khác. Nó sẽ không thành công đối với các khóa unicode và cực kỳ chậm đối với số lượng khóa vừa phải:

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

Trong ví dụ này, xargs tạo một quy trình redis-cli mới cho mọi khóa! thật tệ.

Tôi đánh giá phương pháp này chậm hơn 4 lần so với ví dụ python đầu tiên trong đó nó xóa từng khóa một và chậm hơn 20 lần so với xóa hàng loạt 500.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Không thể nhận được kết nối Jedis khi sử dụng SSL với Redis và Spring Data Redis

  2. Làm thế nào để sử dụng redis để lưu trữ dữ liệu phân cấp?

  3. Node.js Kue làm thế nào để khởi động lại các công việc không thành công

  4. ServiceStack Redis hoạt động như thế nào trong việc truy xuất dữ liệu

  5. Spring Boot redisTemplate tự động tạo không thành công