当前位置:   article > 正文

【Redis专题】批量快速删除指定前缀的key_redis 前缀 删除 scan

redis 前缀 删除 scan

参考博文:Redis如何找出并快速删除亿级指定前缀的key_FeelTouch-CSDN博客        

        由于Redis的单线程服务模式,命令keys *会阻塞正常的业务请求,不建议生产环境使用该命令进行查询,可能会使服务器卡顿而出现事故。

        但是如果业务写入数据时未对其设置过期时间,且这些数据不再使用,需要释放内存存储其他业务数据,这时候建议使用Redis提供的SCAN命令

        Redis本身是基于Request/Response协议的,客户端发送一个命令,等待Redis应答,Redis在接收到命令,处理后应答。其中发送命令加上返回结果的时间称为(Round Time Trip)RRT-往返时间。如果客户端发送大量的命令给Redis,那就是等待上一条命令应答后再执行再执行下一条命令,这中间不仅仅多了RTT,而且还频繁的调用系统IO,发送网络请求。常规方式的删除10W个key需耗时68.7秒,对于百万甚至亿级数据,删除效率很低。

        Pipeline(流水线)功能极大的改善了上面的缺点。Pipeline能将一组Redis命令进行组装,然后一次性传输给Redis,再将Redis执行这组命令的结果按照顺序返回给客户端,极大的提高了数据删除的效率。

代码

  1. # encoding: utf-8
  2. """
  3. author: yangyi@youzan.com
  4. time: 2018/3/9 下午8:35
  5. func:
  6. """
  7. import redis
  8. import random
  9. import string
  10. import rediscluster
  11. import time
  12. # 安装第三方集群库
  13. # pip install redis-py-cluster
  14. # 单点redis
  15. # pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, password='xxx')
  16. # r = redis.Redis(connection_pool=pool)
  17. # 集群主节点
  18. startup_nodes = [{"host": "127.0.0.1", "port": 6379},{"host": "127.0.0.1", "port": "6380"},{"host": "127.0.0.1", "port": 6420}]
  19. redis_store = rediscluster.RedisCluster(startup_nodes=startup_nodes, password="xxxxx", decode_responses=True, max_connections=200)
  20. # 生成随机数方法
  21. # def random_str():
  22. # return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(7))
  23. # 写入随机key
  24. # def init_keys():
  25. # start_time = time.time()
  26. # for i in xrange(0, 20):
  27. # key_name = 'dba_' + str(i)
  28. # value_name = random_str()
  29. # r.set(key_name, value_name)
  30. # print 'initial keys successfully,use time:', time.time() - start_time
  31. # 不用流水线的方法删除key
  32. # def del_keys_without_pipe():
  33. # start_time = time.time()
  34. # result_length = 0
  35. # for key in r.scan_iter(match='dba_*', count=2000):
  36. # r.delete(key)
  37. # result_length += 1
  38. # print "normal ways end at:", time.time() - start_time
  39. # print "normal ways delete numbers:", result_length
  40. # 用流水线的方法删除key
  41. def del_keys_with_pipe():
  42. start_time = time.time()
  43. result_length = 0
  44. pipe = redis_store.pipeline()
  45. for key in redis_store.scan_iter(match='SN:*', count=2000):
  46. # print key
  47. pipe.delete(key)
  48. result_length += 1
  49. if result_length % 2000 == 0:
  50. pipe.execute()
  51. pip_time = time.time()
  52. print "use pipeline scan time ", time.time() - start_time
  53. pipe.execute()
  54. print "use pipeline end at:", time.time() - pip_time
  55. print "use pipeline ways delete numbers:", result_length
  56. def main():
  57. del_keys_with_pipe()
  58. if __name__ == '__main__':
  59. main()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/503453
推荐阅读
相关标签
  

闽ICP备14008679号