使用 SCAN 和 Pipeline 命令刪除
Redis 的大 Key 刪除操作會導致 Redis 線程阻塞,網上關于如何刪除大 Key 也有一些不少,只有通過 SCAN 掃出 Key 后一個個刪除。
這里結合 pipeline 介紹更加高效的操作方法,通過 pipeline 來批量刪除。
下面以每次掃出1000個 field 為例子,每次通過 pipeline 刪除1000個 field 來刪除一個大 Hash Key。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import redis
# 每次 SCAN 和刪除 field 的數量,可以根據實際調高以提高效率
COUNT = 1000
# Redis 連接
conn = redis.StrictRedis(host='127.0.0.1', port=6379)
# 要刪除的 Key 的名字
key_to_be_deleted = 'key_to_be_deleted'
# 參考函數
def del_key(redis_conn, hash_key, del_count):
cursor = '0'
while cursor != 0:
pl = redis_conn.pipeline()
cursor, data = redis_conn.hscan(hash_key, cursor=cursor, count=del_count)
for item in data.items():
pl.hdel(hash_key, item[0])
pl.execute()
def main():
del_key(conn, key_to_be_deleted, COUNT)
if __name__ == '__main__':
main()
使用 UNLINK 命令刪除
如果你的 Redis 版本是 4.0 以上,可以直接使用 UNLINK 命令非阻塞刪除大 Key。