将redis中的一个db库转移到另一个db库 python3 (持续更新)
redis添加不同类型数据127.0.0.1:6379> select 1OK127.0.0.1:6379[1]>mset name yingjian age 22 company feitian country china127.0.0.1:6379[1]> hset user name zhangsan127.0.0.1:6379[1]> lpush list1 123
·
- redis添加不同类型数据
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>mset name yingjian age 22 company feitian country china
127.0.0.1:6379[1]> hset user name zhangsan
127.0.0.1:6379[1]> lpush list1 123 456
127.0.0.1:6379[1]> sadd numbers 1 2 8 3 4 5 6 7 10 9
#获取数据
127.0.0.1:6379[1]> mget name age company country
1) "yingjian"
2) "25"
3) "feitian"
4) "china"
127.0.0.1:6379[1]> hget user name
"zhangsan"
127.0.0.1:6379[1]> lrange list1 0 1
1) "456"
2) "123"
127.0.0.1:6379[1]> SMEMBERS numbers
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "10"
- 脚本获取db库中的类型
[root@test_ssh scripts]# cat redis_type.py
#!/usr/bin/python3
import redis
src_redis = redis.Redis(host='192.168.233.133', port=6379, db=1, password="********",decode_responses=True)
type_list = []
for k in src_redis.keys():
t = src_redis.type(k)
if t not in type_list:
type_list.append(t)
print(type_list)
- 脚本迁移db1数据到db3
[root@test_ssh scripts]# cat redis_mv.py
import redis
src_redis = redis.Redis(host='192.168.233.133', port=6379, db=1, password="******",decode_responses=True)
#target_redis = redis.Redis(host='*******', port=6379, db=3, password='*****',decode_responses=True)
target_redis = redis.Redis(host='192.168.233.133', port=6379, db=3, password='********',decode_responses=True)
num = 0
errornum = 0
for k in src_redis.keys():
data_type = src_redis.type(k)
if data_type == 'string':
v1 = src_redis.get(k)
#print(v1)
num = num +1
target_redis.set(k, v1)
elif data_type == 'hash':
keys = src_redis.hkeys(k)
num = num +1
#print(keys)
for key in keys:
values = src_redis.hget(k, key)
#print(value)
target_redis.hset(k, key, values)
elif data_type == 'set':
num = num +1
values = src_redis.smembers(k)
values = str(values)
target_redis.sadd(k, values)
elif data_type == 'list':
num = num +1
values = src_redis.lrange(k, 0, -1)
values = str(values)
target_redis.lpush(k, values)
else:
print('not known type')
errornum = errornum + 1
print('total', num)
print('error rotal', errornum)
迁移前redis数据
执行脚本
迁移完成效果
本文参考:https://blog.csdn.net/qq_39595769/article/details/121810180
本文参考:https://blog.csdn.net/a1368783069/article/details/121111785
本文参考:https://my.oschina.net/ToFlySeif/blog/1805763
本文参考: https://blog.csdn.net/weixin_40612082/article/details/83958864
- 跨redis服务迁移时
注意修改redis逐出策略调整 (默认为noeviction)
逐出策略介绍
如果没有修改这个策略可能会导致key数量不一致
查看本地redis逐出策略
#查看当前逐出策略
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
#修改当前逐出策略
127.0.0.1:6379> CONFIG SET maxmemory-policy noeviction
本文参考:https://blog.csdn.net/ju_362204801/article/details/114441137
前言: 前面的迁移脚本没有判断是否存在过期时间的key
[root@iZwz9conqz5shxfx2gmnfkZ scripts]# cat redis_mv_v3.py
import redis
src_redis = redis.Redis(host='172.18.*.*', port=6379, db=0, password="*****",decode_responses=True)
target_redis = redis.Redis(host='172.18.*.*', port=6379, db=2, password='******',decode_responses=True)
num = 0
errornum = 0
var = 0
for k in src_redis.keys():
var = src_redis.ttl(k)
if var == -1:
data_type = src_redis.type(k)
if data_type == 'string':
v1 = src_redis.get(k)
#print(v1)
num = num +1
target_redis.set(k, v1)
elif data_type == 'hash':
keys = src_redis.hkeys(k)
num = num +1
#print(keys)
for key in keys:
values = src_redis.hget(k, key)
#print(value)
target_redis.hset(k, key, values)
elif data_type == 'set':
num = num +1
values = src_redis.smembers(k)
values = str(values)
target_redis.sadd(k, values)
elif data_type == 'list':
num = num +1
values = src_redis.lrange(k, 0, -1)
values = str(values)
target_redis.lpush(k, values)
else:
print('not known type')
errornum = errornum + 1
else:
data_type = src_redis.type(k)
if data_type == 'string':
v1 = src_redis.get(k)
#print(v1)
num = num +1
target_redis.set(k, v1)
target_redis.expire(k, 300)
elif data_type == 'hash':
keys = src_redis.hkeys(k)
num = num +1
#print(keys)
for key in keys:
values = src_redis.hget(k, key)
#print(value)
target_redis.hset(k, key, values)
target_redis.expire(k, 300)
elif data_type == 'set':
num = num +1
values = src_redis.smembers(k)
values = str(values)
target_redis.sadd(k, values)
target_redis.expire(k, 300)
elif data_type == 'list':
num = num +1
values = src_redis.lrange(k, 0, -1)
values = str(values)
target_redis.lpush(k, values)
target_redis.expire(k, 300)
else:
print('not known type')
errornum = errornum + 1
print('total', num)
print('error rotal', errornum)
上面的时间为300秒 视情况修改
本段参考:https://zhuanlan.zhihu.com/p/339751324
更多推荐
已为社区贡献3条内容
所有评论(0)