Redis命令之KEYSMIGRATE
KEYS pattern
查找所有符合给定模式 pattern 的 key 。
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。
MIGRATE host port key destination-db timeout [COPY] [REPLACE]
将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。
这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。
命令的内部实现是这样的:它在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE 对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 key 。
timeout 参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 数。
MIGRATE 命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误: IOERR 。
当 IOERR 出现时,有以下两种可能:
key 可能存在于两个实例
key 可能只存在于当前实例
唯一不可能发生的情况就是丢失 key ,因此,如果一个客户端执行 MIGRATE 命令,并且不幸遇上 IOERR 错误,那么这个客户端唯一要做的就是检查自己数据库上的 key 是否已经被正确地删除。
如果有其他错误发生,那么 MIGRATE 保证 key 只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和 key 同名的键,不过这和 MIGRATE 命令没有关系)。
可选项:
COPY :不移除源实例上的 key 。
REPLACE :替换目标实例上已存在的 key 。
先启动两个 Redis 实例,一个使用默认的 6379 端口,一个使用 7777 端口。
$ ./redis-server &
[1] 3557...$ ./redis-server --port 7777 &
[2] 3560
…
然后用客户端连上 6379 端口的实例,设置一个键,然后将它迁移到 7777 端口的实例上:
$ ./redis-cliredis 127.0.0.1:6379> flushdb
OKredis 127.0.0.1:6379> SET greeting "Hello from 6379 instance"
OKredis 127.0.0.1:6379> MIGRATE 127.0.0.1 7777 greeting 0 1000
OKredis 127.0.0.1:6379> EXISTS greeting # 迁移成功后 key 被删除
(integer) 0
使用另一个客户端,查看 7777 端口上的实例:
$ ./redis-cli -p 7777redis 127.0.0.1:7777> GET greeting
"Hello from 6379 instance"
最后需要注意的是,在同一台服务器新建redis实例的时候,新建的redis实例会继承服务期内所有实例的key值,在进行此处测试的时候注意,KEY值重复会报错。所以在新建的实例先flushdb一下
再次新建一个8888端口的实例
127.0.0.1:6379> migrate 127.0.0.1 8888 greeting 0 10
(error) ERR Target instance replied with error: ERR Target key name is busy.
127.0.0.1:6379>
Redis命令之KEYSMIGRATE相关推荐
- Redis 命令整理
Redis 命令整理 一.从大而全的方向看,完整的命令查看文档地址: http://doc.redisfans.com/ 二.Redis 键(key) 常用 案例 三.Redis 字符串(Stri ...
- redis命令_Redis 命令执行过程(下)
点击上方"程序员历小冰",选择"置顶或者星标" 你的关注意义重大! 在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命 ...
- Redis 命令参考
Redis 命令参考 本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版, 阅读这个文档可以帮助你了解 Redis 命令的具体使用方法, ...
- 不到 10 个提升逼格的 Redis 命令
keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺.这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行key ...
- linux连接redis 命令_在Docker中使用Redis
1. 简介 本文章将介绍如何使用 Docker 探索 Redis.我们可以在 Docker for Windows .Docker for mac 或者 Linux 模式下运行 Docker 命令. ...
- Redis命令参考简体中文版
Redis命令参考简体中文版 本文是huangz1990对<Redis Command Reference>的简体中文翻译版. 原文:http://redis.readthedocs.or ...
- linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
1.打开官网https://redis.io/download.官网有安装命令 2.以下是我的执行过程截图 执行完官网给的命令以后,再执行 make PREFIX=/usr/local/redis ...
- Redis命令:SETNX key value(SET if Not eXists)
起始版本:1.0.0 时间复杂度:O(1) 将key设置值为value,如果key不存在,这种情况下等同SET命令. 当key存在时,什么也不做.SETNX是"SET if Not eXis ...
- Lua 脚本内部执行 Redis 命令
Lua 脚本内部允许通过内置函数执行 Redis 命令: redis.call() redis.pcall() 两者非常相似,区别在于: 若 Redis 命令执行错误,redis.call() 将错误 ...
最新文章
- Neo4j-Cypher语言语法
- SanFeng-Clound
- 为什么你的应用程序需要崩溃
- vue组件详解(一)——组件与复用
- Spark 报错 DROP TABLE IF EXISTS should not show AnalysisException
- 敏捷外包工程系列之一:序言(敏捷外包工程,敏捷开发,CMMI,软件外包,政府项目,银行项目,电信项目)...
- 堪比“震网”:罗克韦尔PLC严重漏洞可导致攻击者在系统中植入恶意代码
- qt中实现左右分割线_一种快速刷新richedit中内嵌动画的方法的实现
- python微软产品一般都一个25位的序列号_Python易错点6
- matlab插值函数截断误差,插值及其误差
- 深入浅出vuejspdf下载_vue下载pdf
- 计算机学院学位证发放仪式,新征程,新梦想--计算机学院举办2019届毕业生学位授予仪式...
- 《17.Deep Pyramidal Residual Networks》
- 分类刷题:A1008乘电梯
- mySql | Error: ER_DATA_TOO_LONG: Data too long for column 'base_info' at row 1
- vim 全局替换_有一说一,Intellij IDEA 自带的 Vim 插件真心不错!
- 关于PTR的说明【转】
- 两地三中心是什么意思
- Burp Suite使用介绍(四)
- 网络安全——黑客攻击的步骤和防范