键管理

单个键管理

键重命名

rename key newkey 

如果在 rename 之前, 键已经存在, 那么它的值也将被覆盖

Redis提供了 renamenx 命令, 确保只有 newKey 不存在时候才被覆盖 :

renamenx key newkey 

随机返回一个键

randomkey

键过期

设置键的过期时间

键在 seconds 秒后过期

expire key seconds

键在秒级时间戳 timestamp 后过期

expireat key timestamp

Redis2.6版本后提供了毫秒级的过期方案:

键在milliseconds毫秒后过期

pexpire key milliseconds

键在毫秒级时间戳timestamp后过期

pexpireat key milliseconds-timestamp
查询键的剩余过期时间

ttl 命令和 pttl 都可以查询键的剩余过期时间, 但是 pttl 精度更高可以达到毫秒级别, 有3种返回值:

  • 大于等于0的整数: 键剩余的过期时间(ttl是秒, pttl是毫秒) 。

  • -1: 键没有设置过期时间。

  • -2: 键不存在。

将键的过期时间清除
persist key 

Tips:

  1. 对于字符串类型键, 执行set命令会去掉过期时间

  2. Redis不支持二级数据结构(例如哈希、 列表) 内部元素的过期功能, 例如不能对列表类型的一个元素做过期时间设置。

  3. setex命令作为set+expire的组合, 不但是原子执行, 同时减少了一次网络通讯的时间 。

迁移键

Redis 内部数据迁移

move key db 

把指定的键从源数据库移动到目标数据库中

不同 Redis 实例之间数据迁移

dump+restore
dump key

在源 Redis 上, dump 命令会将键值序列化, 格式采用的是RDB格式

restore key ttl value 

在目标 Redis 上, restore 命令将上面序列化的值进行复原, 其中ttl参数代表过期时间, 如果 ttl=0 代表没有过期时间。

migrate
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key]] 
  • host: 目标Redis的IP地址。

  • port: 目标Redis的端口。

  • key|””: 在Redis3.0.6版本之前, migrate只支持迁移一个键, 所以此处是要迁移的键, 但Redis3.0.6版本之后支持迁移多个键, 如果当前需要迁移多个键, 此处为空字符串””。

  • destination-db: 目标Redis的数据库索引 。

  • timeout: 迁移的超时时间(单位为毫秒) 。

  • [copy]: 如果添加此选项, 迁移后并不删除源键。

  • [replace]: 如果添加此选项, migrate不管目标Redis是否存在该键都会正常迁移进行数据覆盖。

  • [keys key[key…]]: 迁移多个键, 例如要迁移key1、 key2、 key3, 此处填写“keys key1 key2 key3”。

migrate命令也是用于在Redis实例间进行数据迁移的, 实际上migrate命令就是将dump、 restore、 del三个命令进行组合, 从而简化了操作流程。migrate命令具有原子性, 而且从Redis3.0.6版本以后已经支持迁移多个键的功能, 有效地提高了迁移效率 。

实现过程和dump+restore基本类似, 但是有3点不太相同:

  1. 整个过程是原子执行的, 不需要在多个Redis实例上开启客户端的, 只需要在源Redis上执行migrate命令即可。

  2. migrate命令的数据传输直接在源Redis和目标Redis上完成的。

  3. 目标Redis完成restore后会发送OK给源Redis, 源Redis接收后会根据migrate对应的选项来决定是否在源Redis上删除对应的键 。

eg.

migrate 127.0.0.1 6380 hello 0 1000migrate 127.0.0.1 6380 "" 0 5000 keys key1 key2 key3

遍历键

全量遍历键
keys pattern 

pattern 使用的是 glob 风格的通配符:

  • *代表匹配任意字符。

  • ·代表匹配一个字符。

  • []代表匹配部分字符, 例如[1, 3]代表匹配1, 3, [1-10]代表匹配1到10的任意数字。

  • \x用来做转义, 例如要匹配星号、 问号需要进行转义。

如果 Redis 包含了大量的键, 执行keys命令很可能会造成Redis阻塞, 所以一般建议不要在生产环境下使用keys命令

渐进式遍历

scan采用渐进式遍历的方式来解决keys命令可能带来的阻塞问题, 每次scan命令的时间复杂度是O(1) , 但是要真正实现keys的功能, 需要执行多次scan。

那么每次执行scan, 可以想象成只扫描一个字典中的一部分键, 直到将字典中的所有键遍历完毕。

scan cursor [match pattern] [count number]
  • cursor 是必需参数, 实际上cursor是一个游标, 第一次遍历从0开始, 每次scan遍历完都会返回当前游标的值, 直到游标值为0, 表示遍历结束。

  • match pattern 是可选参数, 它的作用的是做模式的匹配, 这点和keys的模式匹配很像。

  • count number 是可选参数, 它的作用是表明每次要遍历的键个数, 默认值是10

eg.

现有一个Redis有26个键(英文26个字母) , 现在要遍历所有的键, 使用scan命令效果的操作如下。 第一次执行scan0, 返回结果分为两个部分: 第一个部分6就是下次scan需要的cursor, 第二个部分是10个键:

127.0.0.1:6379> scan 01) "6"2) 1) "w"2) "i"3) "e"4) "x"5) "j"6) "q"7) "y"8) "u"9) "b"10) "o"

使用新的cursor=”6″, 执行scan6:

127.0.0.1:6379> scan 61) "11"2) 1) "h"2) "n"3) "m"4) "t"5) "c"6) "d"7) "g"8) "p"9) "z"10) "a" 

这次得到的cursor=”11″, 继续执行scan11得到结果cursor变为0, 说明所有的键已经被遍历过了:

127.0.0.1:6379> scan 111) "0"2) 1) "s"2) "f"3) "r"4) "v"5) "k"6) "l" 

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

数据库管理

查询数据库大小

dbsize

返回数据库中 key 的数量

切换数据库

select dbIndex 

与关系型数据库用字符来区分不同数据库名不同, Redis 只是用数字作为多个数据库的实现。 Redis 默认配置中是有16个数据库

假设 databases=16select 0 操作将切换到第一个数据库,select 15 选择最后一个数据库, 但是0号数据库和15号数据库之间的数据没有任何关联, 甚至可以存在相同的键

当使用 rediscli-h{ip}-p{port} 连接Redis时, 默认使用的就是0号数据库, 当选择其他数据库时, 会有 [index] 的前缀标识, 其中 index 就是数据库的索引下标 。

清除数据库

清除当前数据库
flushdb
清除所有数据库
flushall

在任意数据库执行 flushall 会将所有数据库清除

参考资料:《Redis 开发与运维》