Redis数据迁移

版权声明:如需转载本文章,请保留出处! https://blog.csdn.net/xc_zhou/article/details/90550221

键迁移

有时候我们想将一个redis的数据迁移到另一个redis中,redis提供了三种方式来满足数据迁移的需求,分别是move、dump+restore、migrate

move key db

Redis支持多数据库,多数据库之间彼此在数据上是隔离的。move key db就是把指定的键从源数据库迁移到目标数据库中。由于多数据库在生产环境中不建议使用,所以此命令很少使用到。

192.168.8.52:6379[9]> select 11
OK
192.168.8.52:6379[11]> keys *
(empty list or set)
192.168.8.52:6379[11]> select 10
OK
192.168.8.52:6379[10]> keys *
1) "333"
2) "222"
3) "search_news:start_urls"
4) "111"
192.168.8.52:6379[10]> move 111 11
(integer) 1
192.168.8.52:6379[10]> keys *
1) "333"
2) "222"
3) "search_news:start_urls"
192.168.8.52:6379[10]> select 11
OK
192.168.8.52:6379[11]> keys *
1) "111"

dump+restore

  • 命令:

源REDIS: dump key 目标redis:restore key ttl value 其中ttl代表过期时间,单位:毫秒。0代表不过期

  • 实现原理:

dump+restore可以实现redis不同实例之间的数据迁移。

(1)在源Redis上,dump命令会将键值序列化,格式采用RDB格式。

(2)在目标Redis上,restore命令会将上面序列化的值进行复原,其中ttl代表过期时间,如果ttl为0,则表示没有过期时间

  • 注意事项:

(1)整个迁移过程并非原子性的,而是通过客户端分布完成的。

(2)迁移过程是开启了两个实例的redis客户端,将源REDIS序列化后的值放到目标REDIS实例客户端进行操作,并不是在源Redis和目标Redis之间进行传输

192.168.8.52:6379[11]> dump 111
"\x00\xc0o\a\x000\xfc\xf01\xb7k*\xee"

47.104.17.125:6379[10]> keys *
1) "444"
2) "333"
47.104.17.125:6379[10]> restore 111 0 "\x00\xc0o\a\x000\xfc\xf01\xb7k*\xee"
OK
47.104.17.125:6379[10]> keys *
1) "444"
2) "111"
3) "333"
  • 代码方式实现
# -*- coding:utf-8 -*-
import redis

'''
redis 键迁移功能
'''
redis_server1 = redis.Redis(host='192.168.8.22', port=6379, db=10, password='333333',decode_responses=False)
dump=redis_server1.dump(name='search_news:start_urls')

#decode_responses=True的话会报编码错误
redis_server2 = redis.Redis(host='192.168.8.33', port=6379, db=10, password='333336',decode_responses=False)
redis_server2.restore(name='search_news:start_urls', ttl=0, value=dump)

#把某个键移到某个db,只能在同一个redis下进行
# redis_server2.move(name='11',db=1)

migrate

migrate命令具有原子性,只需要在源redis实例上执行migrate命令即可。Migrate的命令传输直接在源redis和目标redis实例之间进行。

命令:migrate host port key |’’ destination-db timeout [copy] [replace][keyskey[key…]]

  • host:目标redis的IP地址
  • Port:目标redis的端口号
  • key|’’:在Redis3.06版本之前,migrate只支持迁移一个键,所以此处是要迁移的键。Redis3.06版本之后支持迁移多个键,如果迁移多个键则此处填写空字符串’’
  • destination-db:目标数据库索引,例如要迁移到0号数据库,这里就写0 - timeout:迁移的超时时间(单位毫秒)
  • [copy]:添加此选项后迁移后并不删除源键 - [replace]:添加此选项后,不管目标redis是否存在该键,都会正常迁移进行数据覆盖

- [keys key[key…]]:迁移多个键,例如要迁移k1k2 k3,此处填写keys key1 key2 key3,当所有的key在源实例上不存在时返回nokey

例如:(redis 没有密码的情况下,是操作成功的,有密码操作失败)

migrate 10.3.34.101 6378  0 10000 copy keys mi aa

将mi aa两个元素迁移到10.3.34.101 6378实例的0号数据库上,源实例mi aa两个键仍然保留。

migrate异常NOAUTH Authentication required.

当redis cluster集群设置密码的时候,使用migirate需要加上密码,否则会报如下异常:

(error) ERR Target instance replied with error: NOAUTH Authentication required.

redis在3.0之前是不支持migrate带有password的,在3.0之后可以在migrate中加入auth参数来做权限校验

127.0.0.1:6380> migrate 192.168.0.33 6380 "" 0 2000 auth mypassword keys user:{info}:age user:{info}:id
OK

注意不要把auth password放到最后面,否则migrate会将会auth mypassword都当做key,结果报出如下错误,该错误是说migrate要迁移的多个key不在同一个slot中

(error) CROSSSLOT Keys in request don't hash to the same slot

注意:看到上面的解决方法时,本人进行了测试,结果并没有用,下边是测试过程

47.104.17.125:6379[10]> migrate 192.168.8.52 6379 '' 9 10000 auth 884456 copy keys 111
(error) IOERR error or timeout connecting to the client

参考:https://blog.csdn.net/sunhuiliang85/article/details/74352446 https://blog.csdn.net/sanchan/article/details/77719363 https://blog.csdn.net/u012062455/article/details/87568899 https://www.jianshu.com/p/908403dfc319 https://redis.io/commands/migrate

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏强仔仔

请停止使用select *from查询

1. 会不会是因为数据库索引是昨天刚加进去的,可能索引没生效?但是仔细一想,如果索引没生效应该查询全部数据都是一样的慢,但是为了以防万一,我还是使用了sql命令...

22910
来自专栏强仔仔

数据库设计---PowerDesigner(物理模型和概念模型)

4、建立好各个实体之间的关系之后,我们就可以转换成物理模型了:工具-generatePDM

14710
来自专栏强仔仔

java 避免出现NullPointerException(空指针)的方法总结

Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的...

22710
来自专栏强仔仔

Redis和Mongodb应用场景研究

现在的分布式项目基本都会用到redis和mongodb,可是redis和mongdb到底有什么不同呢,今天我就基于我们公司的项目来具体介绍一下redis和mon...

19310
来自专栏强仔仔

通过AOP和自定义注解实现请求日志收集功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

28510
来自专栏强仔仔

MySQL隔离级别

(1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:

29710
来自专栏强仔仔

利用redis实现每日签到功能

基于上述的分析,这边我们可以用redis来实现每日签到的功能。如果签到过往数据不需要保留的话,可以给redis的key值设置过期时间,好了我们来看看具体的代码:

25610
来自专栏强仔仔

史上最简单的druid开启AOP事务教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

34130
来自专栏SnailTyan

Mysql碰到的一些命令与错误

原因: Mysql有个叫SQL_SAFE_UPDATES的变量,为了数据库更新操作的安全性,此值默认为1。

10510
来自专栏强仔仔

经典项目应用场景分享-上

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

21110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励