请选择 进入手机版 | 继续访问电脑版

Redis中国用户组(CRUG)论坛

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 1699|回复: 0

Python通过pipe生成pipe格式的文件备份redis的key和value

[复制链接]

该用户从未签到

1

主题

1

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2017-5-24 11:46:14 | 显示全部楼层 |阅读模式
Python通过pipe生成pipe格式的文件备份redis的key和value
  1. import os

  2. import redis

  3. #构建redis-pipe文件
  4. import time

  5. def set_redis_file_key_value(key, value, file_name):
  6.     # file_path = "redis-data/" + str(file_name) + ".txt"
  7.     file_path =file_name
  8.     try:
  9.         file_object = open(file_path, 'a')
  10.         # pipe协议的字符串  for python 3.0+
  11.         file_object.write('*3\r\n$3\r\nset\r\n$%d\r\n%s\r\n$%d\r\n%s\r\n' % (
  12.         len(bytes(key, 'utf-8')), key, len(bytes(value, 'utf-8')), value))
  13.         file_object.close()
  14.     except Exception as err:
  15.         print(err)

  16. def do_redis_bak(host, port, db):
  17.     total_key=0
  18.     file_date = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
  19.     if os.path.exists("redis-data-bak") == False:
  20.         os.mkdir("redis-data-bak")
  21.     redis_file ="redis-data-bak/redis"+ str(file_date) + ".txt"
  22.     # 判断文件是否存在,如果存在则先删除
  23.     if os.path.exists(redis_file) == True:
  24.         os.remove(redis_file)

  25.     pool = redis.ConnectionPool(host=host, port=port, db=db)
  26.     r = redis.Redis(connection_pool=pool)

  27.     pipe = r.pipeline()
  28.     pipe_size = 200000

  29.     len = 0
  30.     key_list = []

  31.     keys = r.keys()

  32.     for key in keys:
  33.         total_key+=1
  34.         key_list.append(key)
  35.         pipe.get(key)
  36.         if len < pipe_size:
  37.             len += 1
  38.         else:
  39.             for (k, v) in zip(key_list, pipe.execute()):
  40.                 # print( k.decode(), v.decode())
  41.                 set_redis_file_key_value(k.decode(), v.decode(),redis_file)
  42.             len = 0
  43.             key_list = []

  44.     for (k, v) in zip(key_list, pipe.execute()):
  45.         # print(k.decode(), v.decode())
  46.         set_redis_file_key_value(k.decode(), v.decode(), redis_file)
  47.     return  total_key

  48. if __name__=="__main__":
  49.     start=time.time()
  50.     total_key=do_redis_bak(host='10.0.0.1', port=6379, db=6)
  51.     print("导出Key总量"+str(total_key)+"耗时"+str(time.time()-start)+"s")
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Redis中国用户组 ( 京ICP备15003959号

GMT+8, 2019-10-19 18:13 , Processed in 0.091788 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表