使用 SCAN 和 Pipeline 命令删除
Redis 的大 Key 删除操作会导致 Redis 线程阻塞,网上关于如何删除大 Key 也有一些介绍,只有通过 SCAN 扫出 Key 后一个个删除,如参考中列出的文章。
但是实际中往往我们需要更加高效的方法,因此可以通过建议 pipeline 来批量删除。但 pipeline 设置每次删除多少个 field 才合适呢,设置多了同样会阻塞服务,设置少了效率很低。一般来说可以添加个操作时间统计,如果超过安全值(比如超过0.1秒),则调整每次操作的命令数。
下面以每次扫出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。
网友评论