1. 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"

  1. 脚本获取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)

在这里插入图片描述

  1. 脚本迁移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

  1. 跨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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐