Redis开发与运维读书笔记之八——键管理

按照单个键、遍历键、数据库管理三个维度对一些通用命令介绍。
一、单个键管理

针对单个键的命令,前面已经介绍过一部分了,例如type、del、object、exists、expire等,下面介绍剩余的几个重要命令。
1、键重命名:rename key newkey
如果在rename之前,newkey键已存在,那么它的值也将被覆盖
为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时才被覆盖
在使用重命名命令时,有两点需要注意:
由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性,这点不要忽视。
rename和renamenx中的key和newkey如果是相同的,在Redis3.2和之前版本返回结果略有不同。Redis3.2中会返回OK,Redis3.2之前的版本会提示错误。

2、随机返回一个键:randomkey

3、键过期
除了expire、ttl命令以外,Redis还提供了expireat、pexpire、pexpireat、pttl、persist等一系列命令。
• expire key seconds:键在secondes秒后过去
• expireat key timestamp:键在秒级时间戳timestamp后过期

ttl命令和pttl命令都可以查询键的剩余过期时间,但是pttl精度更高可以达到毫秒级别,有3种返回值:
大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)
-1:键没有设置过期时间
-2:键不存在

但无论是使用过期时间还是过期时间戳,秒级还是毫秒级,在Redis内部最终都是使用pexpireat,另外在使用Redis相关过期命令时,需要注意以下几点:
1)如果expire key的键不存在,返回结果为0
2)如果过期时间为复制,键会立即被删除,犹如使用del命令一下
3)persist命令可以将键的过期时间清除
4)对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视。
5)Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置
6)setex命令作为set+expire的组合,不但是原子执行,同时减少了一次网络通讯的时间。

4、迁移键
(1) move
move key db
如图所示:move命令用于在Redis内部进行数据迁移,Redis内部可以有多个数据库,彼此在数据库上是相互隔离的,move key db就是把指定的键从源数据库移动到目标数据库中,多数据库功能不建议在生产环境使用

 

 

 

 

 

 

 

 

 

 

 

(2)dump + restore
dump key restore key ttl value
dump和restore可以实现在不同的Redis实例之间进行数据迁移的功能,整个迁移的过程分为两步,如下图所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1)在源Redis上,dump命令去将键值序列化,格式采用的是RDB格式。
2)在目标Redis上,restore命令将上面序列化的值进行复原,其实ttl参数代表过期时间,如果ttl=0,代表没有过期时间。
有关dump+restore有两点需要注意:一,整个迁移过程并非原子性的,而是通过客户端分步完成的;第二,迁移过期是开启了两个客户端连接,所以dump的结果不是在源Redis和目标Redis之间进行传输。

(3)migrate
migrate host port key|”” destination-db timeout [copy] [replace] [keys key [key …]]
migrate 命令也是用于在Redis实例间进行数据迁移的,实际上migrate 命令就是将dump、restore、del三个命令进行组合,从而简化了操作流程。migrate 命令具有原子性,而且从Redis3.0.6版本以后已经支持迁移多个键的功能,有效地提高了迁移效率。

整个过程如下图所示:实现过程和dump+restore基本类似,但是有3点不太相同:第一,整个过长是原子执行的,不需要在多个Redis实例上开启客户端,只需要在源Redis上执行migrate命令即可。第二,migrate名的数据传输直接在源Redis和目标Redis上完成的。第三,目标Redis完成restore后会发送OK给源Redis,源Redis接受后会根据migrate对应的选项来决定是否在源Redis上删除对应的键。


下面对migrate的参数进行逐个说明:
·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”。

最后总结一下move、dump+restore、migrate三种迁移方式的异同点,建议使用migrate命令进行键值迁移。

命令

作用域

原子性

是否支持多个键

move

Redis实例内部

dump+restore

Redis实例之间

migrate

Redis实例之间

二、遍历键
Redis提供了两个命令遍历所有的键,keys和scan
1、全量遍历键
keys pattern
keys命令是支持pattern匹配的,pattern使用的是glob风格的通配符
• *代表匹配任意字符
• ?代表匹配一个字符
• []代表匹配部分字符
• \x用来做转移,例如要匹配星号、问号需要进行转义

由于Redis是单线程架构,为了避免Redis阻塞,一般生产环境禁止使用keys命令

2、渐进式遍历
scan采用渐进式遍历的方式来解决keys命令可能带来的阻塞问题,每次scan命令的时间复杂度是O(1),但是要真正实现key是的功能,需要执行多次scan。Redis存储键值对实际使用的是hashtable的数据结构,每次执行scan,可以想象成只扫描一个字典中的一部分键,直到将字典中的所有键遍历完毕。scan的使用方法如下所示:
scan cursor [match pattern] [count number]
• cursor是必须参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前右边的值,直到游标值为0,表示遍历结束。
• match pattern是可选参数,做模式匹配,和keys的模式匹配很像
• count number是可选参数,每次需要遍历的键的个数,默认值是10,可以适当增长

除了scan以外,Redis提供了面向哈希类型、集合类型、有序集合的扫描遍历命令,解决诸如hgetall、smembers、zrange可能产生的阻塞问题,对应的命令分别是hscan、sscan、zscan,用法和scan基本类似。

渐进式遍历可以有效的解决keys命令可能产生的阻塞问题,但是scan并非完美无瑕,如果在scan的过程中键如果有变化(增加、删除、修改),遍历效果可能碰到如下问题:新增的键可能没有遍历到,遍历除了重复的键等情况。

三、数据库管理
1、切换数据库
select dbIndex
Redis使用数字作为多个数据库的实现。Redis默认配置中是有16个数据库。
Redis的分布式实现Redis Cluster只允许使用0号数据库。
为什么废弃到这个功能主要有三点:
• Redis是单线程的。如果使用多个数据库,这些数据库使用的仍然是一个CPU,彼此之间还是会收到影响。
• 多数据库的使用方式,会让调试和运维不同业务的数据库变的困难,假如一个慢查询存在,会影响其他数据库,这样使的别的业务方定位问题非常困难。
• 部分Redis的客户端根据不支持这种方式。即使支持,在开发的时候来回切换数字形式的数据库,很容易弄乱。

建议如果需要使用多个数据库功能,完全可以在一台机器上部署多个Redis实例,彼此用端口来做区分。现在计算机或者服务器通常是多个CPU的,这样既保证了业务之间不受到影响,又合理地使用了CPU资源。

2、flushdb/flushall
flushdb/flushall命令用于清除数据库,两者的区别是flushdb是只清除当前数据库,flushall会清除所有数据库。
• flushdb/flushall可以非常方便的清理数据,但是有两个问题
• 会将所有数据清除,一旦误操作后果不堪设想,可以使用rename-command配置来规避这个问题
如果当前数据库键值数量比较多,存在阻塞Redis的可能性。

使用flushdb/flushall一定要小心谨慎。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇