美文网首页redis学习
Redis 如何高效安全删除大 Hash Key

Redis 如何高效安全删除大 Hash Key

作者: Aaaaaaaron | 来源:发表于2018-08-05 00:40 被阅读1次

使用 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。

参考

如何优雅地删除Redis大键
如何有效删除Redis中比较大的Hash Key

相关文章

网友评论

    本文标题:Redis 如何高效安全删除大 Hash Key

    本文链接:https://www.haomeiwen.com/subject/slevvftx.html