没有不值得去解决的问题,也没有不值得去学习的技术!

基于 Python 脚本,实现 Redis 数据迁移(自建 Redis 迁移至 腾讯云自带 Redis)

回退版本至 2.10.6 后,继续运行 python migrate.py。数据迁移成功。为何迁移了数据库 0 下的健的总数:53,原因在于自建 Redis 中的数据在变化中所导致。

1、参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/81434786 。通过程序 ( python 版本 2.x ) 实现。新建 migrate.py 文件。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
# 把redis里面一个数据库的东西,迁移到另外一个数据库里面
# 建立两个redis连接
# 获取到所有的key .keys()
# 判断key的类型 string\hash\list\set

import redis
#redis_from源数据,redis_to目标数据  redis_from——>redis_to
redis_from = redis.StrictRedis(host='ip',port=6379,password='',db=10)
redis_to = redis.StrictRedis(host='ip',port=6379,password='',db=0)
 
if __name__ == '__main__':
    cnt = 0
    scnt = 0
    lcnt = 0
    setcnt = 0
    hcnt = 0
    
    for k in redis_from.keys():
        # 循环keys里面每一个key
 
        data_type = redis_from.type(k)
        # 判断key的类型 string\hash\list\set
 
        if data_type == 'string':
            v = redis_from.get(k)
            t = redis_from.ttl(k)
            redis_to.set(k, v)
            if int(t) > 0:
                redis_to.expire(k,t)
 
            scnt = scnt + 1
 
        elif data_type == 'list':
            values = redis_from.lrange(k, 0, -1)
            t = redis_from.ttl(k)           
            redis_to.lpush(k, values)
            if int(t) > 0:
                redis_to.expire(k,t)
 
            lcnt = lcnt + 1
        elif data_type == 'set':
            values = redis_from.smembers(k)
            t = redis_from.ttl(k)
            redis_to.sadd(k, values)
 
            if int(t) > 0:
                redis_to.expire(k,t)
            setcnt = setcnt + 1
        elif data_type == 'hash':
            hcnt = hcnt + 1
            keys = redis_from.hkeys(k)                        
            for key in keys:
                value = redis_from.hget(k, key)
                t = redis_from.ttl(k)
                redis_to.hset(k, key, value)
                if int(t) > 0:
                    redis_to.expire(k,t)
 
        else:
            print 'not known type'
            print data_type
            file_object = open('/data/thefile.txt','a+')
            file_object.write(data_type)
            file_object.write('\n')
            file_object.close( )
 
 
 
        cnt = cnt + 1
 
    print 'total', cnt
    print 'string', scnt
    print 'list', lcnt
    print 'set', setcnt
    print 'hash', hcnt


2、在自建 Redis 的机器上,分别连接自建 Redis 与腾讯云自带 Redis。腾讯云自带 Redis 的 数据库 0 为空。计划以此数据库做为迁移目标。如图1

在自建 Redis 的机器上,分别连接自建 Redis 与腾讯云自带 Redis。腾讯云自带 Redis 的 数据库 0 为空。计划以此数据库做为迁移目标。
图1

3、查看 python 版本,Python 2.7.5。版本符合要求。如图2

查看 python 版本,Python 2.7.5。版本符合要求。
图2


[root@iz2zeeh3rrqalw11oajd6zz ~]# python
Python 2.7.5 (default, Nov 16 2020, 22:23:17)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>



4、连接自建 Redis ,查看数据库 0 下的健的总数:40。



[root@iz2zeeh3rrqalw11oajd6zz ~]# redis-cli -h 127.0.0.1 -p 6379 -a 2021Chinamcloud
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> dbsize
(integer) 40
127.0.0.1:6379>



5、运行 python migrate.py。导入报错:ImportError:没有名为redis的模块。如图3

运行 python migrate.py。导入报错:ImportError:没有名为redis的模块。
图3

[root@iz2zeeh3rrqalw11oajd6zz ~]# python migrate.py
Traceback (most recent call last):
  File "migrate.py", line 9, in 
    import redis
ImportError: No module named redis
[root@iz2zeeh3rrqalw11oajd6zz ~]#



6、安装 redis-py 后。继续运行 python migrate.py。



[root@iz2zeeh3rrqalw11oajd6zz ~]# python migrate.py
Traceback (most recent call last):
  File "migrate.py", line 39, in 
    redis_to.lpush(k, values)
  File "/usr/lib/python2.7/site-packages/redis/client.py", line 1961, in lpush
    return self.execute_command('LPUSH', name, *values)
  File "/usr/lib/python2.7/site-packages/redis/client.py", line 900, in execute_command
    conn.send_command(*args)
  File "/usr/lib/python2.7/site-packages/redis/connection.py", line 725, in send_command
    self.send_packed_command(self.pack_command(*args),
  File "/usr/lib/python2.7/site-packages/redis/connection.py", line 775, in pack_command
    for arg in imap(self.encoder.encode, args):
  File "/usr/lib/python2.7/site-packages/redis/connection.py", line 120, in encode
    "bytes, string, int or float first." % typename)
redis.exceptions.DataError: Invalid input of type: 'list'. Convert to a bytes, string, int or float first.
[root@iz2zeeh3rrqalw11oajd6zz ~]#



7、分别查看 Redis 版本。自建 Redis 的版本号:3.2.12。腾讯云自带 Redis 的版本号:2.8.23。版本号不一致。如图4、图5

自建 Redis 的版本号:3.2.12。
图4

 

腾讯云自带 Redis 的版本号:2.8.23。
图5


[root@iz2zeeh3rrqalw11oajd6zz ~]# redis-cli -h 127.0.0.1 -p 6379 -a 2021Chinamcloud
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-1160.11.1.el7.x86_64 x86_64




RDM Redis Console
连接中...
已连接。
腾讯云(公司开发环境):0>info
"# Server
redis_version:2.8.23
run_id:0a99b4d4dac9744a76075aa77a978a2dfcdf1ba6
uptime_in_seconds:74995115
uptime_in_days:867
hz:10
lru_clock:8808554


8、python 查看 redis 安装版本。新建文件 python_redis.py,查看到版本为 3.5.3。如图6

python 查看 redis 安装版本。新建文件 python_redis.py,查看到版本为 3.5.3。
图6

import redis

print redis.VERSION


9、执行命令:pip install redis==2.10.6。回退版本至 2.10.6。如图7

执行命令:pip install redis==2.10.6。回退版本至 2.10.6。
图7

10、回退版本至 2.10.6 后,继续运行 python migrate.py。数据迁移成功。为何迁移了数据库 0 下的健的总数:53,原因在于自建 Redis 中的数据在变化中所导致。如图8

回退版本至 2.10.6 后,继续运行 python migrate.py。数据迁移成功。为何迁移了数据库 0 下的健的总数:53,原因在于自建 Redis 中的数据在变化中所导致。
图8

[root@iz2zeeh3rrqalw11oajd6zz ~]# python python_redis.py
(2, 10, 6)
[root@iz2zeeh3rrqalw11oajd6zz ~]# python migrate.py
total 53
string 25
list 3
set 0
hash 25



11、查看腾讯云自带 Redis 中的数据库 0 下的数据。总数:53。确认迁移成功。当腾讯云自带 Redis 为 4.0 版本时,同样能够迁移成功。如图9

查看腾讯云自带 Redis 中的数据库 0 下的数据。总数:53。确认迁移成功。当腾讯云自带 Redis 为 4.0 版本时,同样能够迁移成功。
图9

Linux 服务器运维、部署与线上故障排查

如果你的网站或后端服务部署在 Linux 服务器上,遇到访问异常、Nginx 配置问题、MySQL / Redis 异常、Docker 服务不可用、磁盘占满、CPU / 内存过高等问题,可以联系我做一次远程排查。

适合以下场景:
✅ 网站打不开或访问不稳定
✅ Nginx / PHP-FPM 配置异常
✅ MySQL / Redis 性能或连接问题
✅ Docker 服务部署与维护
✅ 服务器迁移与环境配置
✅ CPU / 内存 / 磁盘异常排查

服务内容:
✅ Linux 环境检查
✅ 网站部署与迁移
✅ Nginx / PHP-FPM / MySQL / Redis 排查
✅ Docker 配置与维护
✅ 服务器性能分析
✅ 长期远程运维支持

如需咨询,请联系我,并注明:Linux 运维咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理