千家信息网

【Redis】用python操作redis集群

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,https://blog.csdn.net/bitcarmanlee/article/details/51852126密码不能写到列表中去:有密码 就是这样 redisconn = StrictRed
千家信息网最后更新 2025年02月01日【Redis】用python操作redis集群

https://blog.csdn.net/bitcarmanlee/article/details/51852126

密码不能写到列表中去:

  1. 有密码 就是这样 redisconn = StrictRedisCluster(startup_nodes=redis_nodes,password=password)


结合上一篇文章,改进脚本后操作redis-cluster
  1. [root@ip-172-31-47-226 tmp]# more /root/get_nottl.py
  2. # encoding: utf-8
  3. """
  4. author: yangyi@youzan.com
  5. time: 2018/4/26 下午4:34
  6. func: 获取数据库中没有设置ttl的 key
  7. """
  8. import redis
  9. import argparse
  10. import time
  11. import sys
  12. import rediscluster

  13. class ShowProcess:
  14. """
  15. 显示处理进度的类
  16. 调用该类相关函数即可实现处理进度的显示
  17. """
  18. i = 0 # 当前的处理进度
  19. max_steps = 0 # 总共需要处理的次数
  20. max_arrow = 50 # 进度条的长度

  21. # 初始化函数,需要知道总共的处理次数
  22. def __init__(self, max_steps):
  23. self.max_steps = max_steps
  24. self.i = 0

  25. # 显示函数,根据当前的处理进度i显示进度
  26. # 效果为[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100.00%
  27. def show_process(self, i = None):
  28. if i is not None:
  29. self.i = i
  30. else:
  31. self.i += 1
  32. num_arrow = int(int(self.i) * int(self.max_arrow) / int(self.max_steps)) # 计算显示多少个'>'
  33. num_line = self.max_arrow - num_arrow # 计算显示多少个'-'
  34. percent = self.i * 100.0 / self.max_steps # 计算完成进度,格式为xx.xx%
  35. process_bar = '[' + '>' * num_arrow + ' ' * num_line + ']'+ '%.2f' % percent + '%' + '\r' # 带输出的字符串,'\r'表示不换行回到最左边
  36. sys.stdout.write(process_bar) # 这两句打印字符到终端
  37. sys.stdout.flush()

  38. def close(self, words='done'):
  39. print ''
  40. print words
  41. self.i = 0


  42. def check_ttl(redis_conn, no_ttl_file, dbindex):
  43. start_time = time.time()
  44. no_ttl_num = 0
  45. allkey = redis_conn.dbsize()
  46. keys_num = sum(list(set(allkey.values())))
  47. print "key分布如下:",allkey
  48. print "there are {num} keys in db {index} ".format(num=keys_num, index=dbindex)
  49. process_bar = ShowProcess(keys_num)
  50. with open(no_ttl_file, 'a') as f:

  51. for key in redis_conn.scan_iter(count=10):
  52. process_bar.show_process()
  53. if redis_conn.ttl(key) == -1:
  54. no_ttl_num += 1
  55. if no_ttl_num < 10000:
  56. f.write(key+'\n')
  57. else:
  58. continue

  59. process_bar.close()
  60. print "cost time(s):", time.time() - start_time
  61. print "no ttl keys number:", no_ttl_num
  62. print "we write keys with no ttl to the file: %s" % no_ttl_file


  63. def main():
  64. parser = argparse.ArgumentParser()
  65. parser.add_argument('-p', type=int, dest='port', action='store', help='port of redis ')
  66. parser.add_argument('-a', type=str, dest='password', action='store', help='password of redis ')
  67. parser.add_argument('-d', type=str, dest='db_list', action='store', default=0, help='ex : -d all / -d 1,2,3,4 ')
  68. args = parser.parse_args()
  69. port = args.port
  70. pwd = args.password
  71. if args.db_list == 'all':
  72. db_list = [i for i in xrange(0, 16)]
  73. else:
  74. db_list = [int(i) for i in args.db_list.split(',')]

  75. for index in db_list:
  76. try:
  77. startup_nodes = [{"host": "172.31.47.226", "port": port,"db":index}]
  78. r = rediscluster.StrictRedisCluster(startup_nodes=startup_nodes, password=pwd)
  79. except Exception, e:
  80. print e
  81. else:
  82. no_ttl_keys_file = "/tmp/{port}_{db}_no_ttl_keys.txt".format(port=port, db=index)
  83. check_ttl(r, no_ttl_keys_file, index)


  84. if __name__ == '__main__':
  85. main()





0