redis-port支持前缀迁移
一、介绍
redis-port是一款redis数据迁移工具,用来将数据从一个redis迁移到另一个redis实例/redis集群中 ,以下是官方地址:
https://github.com/CodisLabs/redis-port
使用也是非常的简单:
/redis-port sync -f 127.0.0.1:6379 -t 127.0.0.1:6380 -n 8
上述命令将127.0.0.1:6379这个redis实例的数据迁移到 127.0.0.1:6380 中。
我们在生产上迁移了多个redis集群的数据,运行非常稳定。
最近有这么一个场景:只迁移指定前缀的key,因为一个redis集群有好几个应用在用,如果全部都迁,时间太长,占的内存也比较大。
二、改造过程
我们先整理下redis-port的工作流程:
1、伪装一个从,向主redis 发起同步请求;
2、主redis将当前数据以rdb发送给redis-port;
3、redis-port解析rdb文件,然后1条1条的向目标redis写入数据;
4、接收主redis发送过来的增量命令,发往目标redis。
所以如果要改造的话,需要修改3和4两处,当然了还得增加参数解析的代码,具体步骤如下:
1、先修改cmd/flags.go 增加前缀的参数:
type Flags struct {
Source, Target string
//过滤前缀,即只迁移这个前缀的key
SourcePrefixs []string
AofPath string
TmpFile struct {
Path string
Size int64
}
ExpireOffset time.Duration
}
其中SourcePrefixs为新加的字段,类型为一个字符串数组,因为前缀可能有多个。
2、修改cmd/flags.go解析参数函数parseFlagsFromArgs
for _, key := range []string{"--sourcePrefix"} {
var prefix string
if s, ok := d[key].(string); ok && s != "" {
prefix = s
}
//通过,分隔
flags.SourcePrefixs = strings.Split(prefix, ",")
}
3、修改cmd/libs.go,增加判断key是否包含指定前缀的函数
func strHasPrefix(key string, sourcePrefix []string) bool{
if len(sourcePrefix) < 1 {
return true
}
var hasPrefix bool
hasPrefix = false
for i := 0; i < len(sourcePrefix); i++{
if (strings.HasPrefix(key, sourcePrefix[i])) {
hasPrefix = true
break
}
}
return hasPrefix
}
4、修改cmd/libs.go处理rdb文件的函数genRestoreCommands增加相应逻辑
//过滤非前缀的key
if (strHasPrefix(e.Key.String(), sourcePrefix) != true) {
log.Debug(e.Key.String() + " has no prefix: ignore it")
return
}
doRestoreDBEntry增加sourcePrefix参数
func doRestoreDBEntry(entryChan <-chan *rdb.DBEntry
, targetPrefix string, sourcePrefix []string, addr, auth string, on func(e *rdb.DBEntry) bool) {
5、修改cmd/libs.go回放aof文件函数doRestoreAoflog
func doRestoreAoflog(reader *bufio2.Reader, targetPrefix string, sourcePrefix []string, addr, auth string, on func(db uint64, cmd string) bool) {
//省略一些代码
//如果前缀不为空,则判断是否为这个前缀
if (len(r.Array) > 1) {
var key= string(r.Array[1].Value)
if strHasPrefix(key, sourcePrefix) != true {
continue
}
}
//后续逻辑处理
}
6、在入口cmd/sync.go增加参数声明
Options:
-n N, --ncpu=N Set runtime.GOMAXPROCS to N.
-m MASTER, --master=MASTER The master redis instance ([auth@]host:port).
-t TARGET, --target=TARGET The target redis instance ([auth@]host:port).
--sourcePrefix=SP filter source key use prefix, separte with, .
--db=DB Accept db = DB, default is *.
--tmpfile=FILE Use FILE to as socket buffer.
再make编译下,可以试下效果:
开两个redis实例,实例A为6379端口,实例B为6380端口,实例A数据如下:

执行redis-sync:

可以看到只有order前缀的数据才迁移过来了。
更多精彩文章,请关注公众号:

redis-port支持前缀迁移的更多相关文章
- 用redis实现支持优先级的消息队列
http://www.cnblogs.com/tianqiq/p/4309791.html http://www.cnblogs.com/it-cen/p/4312098.html http://ww ...
- Redis删除相同前缀的key
如何优雅地删除Redis set集合中前缀相同的key? Redis中有删除单条数据的命令DEL,却没有批量删除特定前缀key的指令,但我们经常遇到需要根据前缀来删除的业务场景 ...
- Redis01——Redis究竟支持哪些数据结构
Redis已经越来越多地应用到互联网技术中,而关于Redis的相关问题,也成为面试中必不可少的一部分,本文开始将会逐渐把我了解到的关于Redis的一些面试问题整理出来,供各位参考,如有不对之处,烦请指 ...
- php redis 获取指定前缀的所有key
php redis 获取指定前缀的所有key 以laravel框架为例: $key = $this->redis->keys('db:shipping:shippingId:' . &qu ...
- Redisson使用起来很方便,但是需要redis环境支持eval命令
Redisson使用起来很方便,但是需要redis环境支持eval命令,否则一切都是悲剧,比如me.结果还是要用RedisCommands去写一套.例子就如下,获得一个RLock锁对象,然后tryLo ...
- 从ASM迁移到ARM(1):平台支持的迁移服务
Azure上的ARM模式为用户带来更好的管理,更多新的特性,更好的体验,因此目前正在使用经典模式(ASM)的用户,在了解和使用了ARM之后,也在考虑如何将原来基于ASM模式的虚拟机,存储,网络等IAA ...
- Redis所支持的数据结构
1.启动Redis2.Redis所支持的数据结构 2.1.Redis常用操作 2.2.String类型及操作 2.3.Hash类型及操作 2.4.List类型及操作 2.5.Set类型及操作 2.6. ...
- Android 支持库迁移到AndroidX
一.背景 Android系统版本在不断更新,从最初的Android 1.0到现在Google和各大手机厂商正在推的Android 10,平均下来每个年头都有一个大的版本更新.但用户正在用的手机上的An ...
- redis不支持多个数据库实例但是支持多个字典
Redis多个数据库 注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念. Redis是一个字典结构的存储服务器,而实际上一个Redi ...
随机推荐
- ios 创建sdk与demo同一个工程
思路摘要: 步骤1:创建一个文件夹用来放该项目 步骤2:设置工程工作区间 步骤3: 创建广告sdk项目 步骤4:创建广告sdkDemo项目 步骤5:配置一些文件 步骤6:将sdk导入到demo中进行 ...
- Android 重写物理返回键,在h5页面中返回上一个界面
实现:Activity中放置webview,跳转到h5界面,点击返回键,不退出h5界面,而是返回上一个h5界面 /** * 改写物理按键--返回的逻辑,希望浏览的网页后退而不是退出浏览器 * @par ...
- 开发APP遇到的问题
1.代码尽量复用 2.调用高德地图,直辖市等,省字段一定有值,市可能为空(pro:'北京市',city:[]) 3.支付密码不用组件 <template> <view> < ...
- java基础-01:dos命令
进入cmd方式 win + r 输入 cmd 随便进入一个文件夹 在导航栏输入cmd,回车即进入命令行 命令 盘符切换:直接输入 E: ,回车即可 查看文件夹下所有目录:dir 切换目录: cd 跨盘 ...
- failed to find romfile "efi-virtio.rom"
问题:failed to find romfile "efi-virtio.rom" 解决:apt-get install ipxe-qemu
- Java多线程_线程池
作用我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为 ...
- mac安装conda后,终端的用户名前面有一个(base),最佳解决方案
mac安装了conda后,前面会有一个(base),很烦人,终于找到最佳解决方案了: $ conda config --set auto_activate_base false 原因: 安装conda ...
- 23种设计模式 - 对象性能(Singleton - Flyweight享元)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象性能 面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价.对于通常情 ...
- 【亲测】手把手教你如何破解pycharm(附安装包和破解文件)
此教程支持最新的2019.3版本的Pycharm,并兼容之前的版本. 一.准备工作: 1.下载Pycharm 有条件的可以自行去官网下载,这里我提供了我下载的版本,已上传到百度网盘,链接在下方. 2. ...
- Arbitrary-Oriented Object Detection with Circular Smooth Label(ECCV2020,旋转目标检测)
论文链接:https://arxiv.org/abs/2003.05597 code:https://github.com/Thinklab-SJTU/CSL_RetinaNet_Tensorflow ...