前言
这是基础篇(对于好哥哥们来说都是简简单单的,对于我来讲还是有难度的)的最后一篇了,好哥哥们应该把基础的数据结构都掌握了吧。
有一说一,掌握这几个数据结构还是很有必要的,毕竟平时开发的时候用的最多的就是这些东西。后面会分享一些比较高级的东西,慢查询、Pipeline,只要你想的到的都会有(没有的可以留个言我偷偷的加进去),好哥哥们给我等着吧。
这篇的话就是关于对键(key)的管理(别想歪了,此键非彼 jian)。let’s get it
概述
关于键管理将按照单个键、遍历键、数据库管理三个维度对一些通用命令进行介绍。在 Redis 系列第三篇 Reids 的数据结构、线程模型与全局命令 里面已经拿了一部分像 type、del、exists、expire 出来说了。其实还是挺简单的,好哥哥们动手操作起来。
1 单个键管理
1.1 键重命名
如果在 rename 之前,键 java 已经存在,那么它的值也将被覆盖。另外重命名键期间会执行 del 命令删除旧的键,如果键对应的值比较大,会存在阻塞 Redis 的可能性,好哥哥们不要忽略这个哦。
## 格式。如果在rename之前,键java已经存在,那么它的值也将被覆盖
rename key newkey
## 将php键名称改成java
rename php java
## 格式。 为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey,不存在时候才被覆盖
renamenx key newkey
1.2 随机返回一个键
## 格式。随机返回数据库中的一个键
randomkey
1.3 键过期
需要注意的是:
- 如果过期时间为负值,键会立即被删除,犹如使用 del 命令一样
- 对于字符串类型键,执行 set 命令会去掉过期时间。
- Redis 不支持二级数据结构(例如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置。
- setex 命令作为 set+expire 的组合,不但是原子执行,同时减少了一次网络通讯的时间
## 格式。这个在第三篇已经说了,就给个格式吧。键在seconds秒后过期
expire key seconds
## 格式。键在秒级时间戳timestamp后过期。
expireat key timestamp
1.4 内部数据迁移
## 格式。Redis还是那一台,只是数据库换了(Redis不是默认区分了16个db吗),不建议在生产上使用
move key db
## 将test 转移到第二个库
move test 2
1.5 跨库迁移-dump 与 restore
注意点:
- 整个迁移过程并非原子性的,而是通过客户端分步完成的。
- 迁移过程是开启了两个客户端连接,所以 dump 的结果不是在源 Redis 和目标 Redis 之间进行传输。
## 格式。实际上拆分成了两个步骤
## 1.把对应key dump下来,格式采用的是RDB格式
dump key
## 2.restore命令将上面序列化的值进行复原,其中ttl参数代表过期时间,如果ttl=0代表没有过期时间。
restore key ttl value
## 在源Redis将test以RDB格式dump下来,会返回一个文件如\x00\x05world\x06\x00\x8f<T\x04%\xfcNQ
dump test
## 在新的目标数据库重新加载test
restore test 0 x00\x05world\x06\x00\x8f<T\x04%\xfcNQ
1.6 跨库迁移-migrate
migrate 命令就是将 dump、restore、del 三个命令进行组合,从而简化了操作流程。另外 migrate 命令具有原子性,而且从 Redis3.0.6 版本以后已经支持迁移多个键的功能,有效地提高了迁移效率,migrate 在 10.4 节水平扩容中起到重要作用。
注意点:
- 整个过程是原子执行的,不需要在多个 Redis 实例上开启客户端的,只需要在源 Redis 上执行 migrate 命令即可。
- migrate 命令的数据传输直接在源 Redis 和目标 Redis 上完成的。
- 目标 Redis 完成 restore 后会发送 OK 给源 Redis,源 Redis 接收后会根据 migrate 对应的选项来决定是否在源 Redis 上删除对应的键。
参数:
- host:目标 Redis 的 IP 地址。
- port:目标 Redis 的端口。
- key|"":在 Redis3.0.6 版本之前,migrate 只支持迁移一个键,所以此处是要迁移的键,但 Redis3.0.6 版本之后支持迁移多个键,如果当前需要迁移多个键,此处为空字符串""。
- destination-db:目标 Redis 的数据库索引,例如要迁移到 0 号数据库,这里就写 0。
- timeout:迁移的超时时间(单位为毫秒)。
- [copy]:如果添加此选项,迁移后并不删除源键。
- [replace]:如果添加此选项,migrate 不管目标 Redis 是否存在该键都会正常迁移进行数据覆盖。
- [keys key[key…]]:迁移多个键,例如要迁移 key1、key2、key3,此处填写“keys key1 key2 key3”。
## 格式。直接一条命令,一看就是给萌男用的
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key
## 将test 转移到第二个库并且替换新库值
migrate 127.0.0.1 6379 test 2 1000 replace
1.7 move、dump+restore、migrate 对比
放一张猛男看的懂图片
2 键遍历
2.1 全量遍历键
## 格式。pattern是一个通配符,举个栗子好哥哥们就知道了。同样不建议使用这个命令,如果存在大量key是就会阻塞Redis
keys pattern
## 查找java开头的key
keys java*
2.2 渐进式遍历
scan 采用渐进式遍历的方式来解决 keys 命令可能带来的阻塞问题,每次 scan 命令的时间复杂度是 O(1),但是要真正实现 keys 的功能,需要执行多次 scan。还提供了像 hgetall、smembers、zrange 可能产生的阻塞问题,对应的命令分别是 hscan、sscan、zscan。需要注意的是使用 scan 可能会出现新增的键可能没有遍历到,遍历出了重复的键等情况。
参数:
- cursor 是必需参数,实际上 cursor 是一个游标,第一次遍历从 0 开始,每次 scan 遍历完都会返回当前游标的值,直到游标值为 0,表示遍历结束。
- match pattern 是可选参数,它的作用的是做模式的匹配,这点和 keys 的模式匹配很像。
- count number 是可选参数,它的作用是表明每次要遍历的键个数,默认值是 10,此参数可以适当增大
## 格式。参数见上
scan cursor [match pattern] [count number]
## 查找java开头的key
scan 10 java*
3 数据库管理
3.1 切换数据库
## 格式。Redis 数据库默认是0-15
select dbIndex
## 切换到第三个库
select 2
3.1 清除数据库
## 格式。清除当前库
flushdb
## 格式。清除所有库。真.删库跑路(好哥哥们可别再生产完)
flushall
本期就到这啦,有不对的地方欢迎好哥哥们评论区留言,另外 求 关 注 、 求 点 赞 \color{#FF0000}{求关注、求点赞} 求关注、求点赞