键重命名
#重命名
#注意:如果newkey本身存在,这种重命名会覆盖存在的key
rename key newkey
#确保只有newkey不存在时候才被覆盖
renamenx key newkey
注意:
- 于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性
- 如果rename和renamenx中的key和newkey如果是相同的,在Redis3.2之后(返回OK)和之前版本返回结果(报错:“(error) ERR source and destination objects are the same”)略有不同。
随机返回一个键
#随机返回一个键
randomkey
键过期
#设置过期时间
expire key seconds
#键在milliseconds毫秒后过期
pexpire key milliseconds
#键在毫秒级时间戳timestamp后过期
pexpireat key milliseconds-timestamp
#查询键的剩余过期时间:大于等于0的证书:键剩余的过期时间;-1键没有设置过期时间;-2键不存在
ttl key
#查询键的剩余过期时间,精度key达到毫秒级别
pttl key
#键在seconds秒后过期
expire key seconds
#键在秒级时间戳timestamp后过期
expireat key timestamp
注意:
- 如果expire key的键不存在,返回结果为0
- 如果过期时间为负值,键会立即被删除,犹如使用del命令一样
- persist命令可以将键的过期时间清除
- 对于字符串类型键,执行set命令会去掉过期时间
- Redis不支持二级数据结构(如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置
- setex命令作为set+expire的组合,不但是原子执行,同时减少了一次网络通讯的时间。
迁移键
move
#把指定的键从源数据库移动到目标数据库中,不推荐在生产环境上用 move key db
dump+restore
#dump+restore可以实现在不同的Redis实例之间进行数据迁移的功能 #源Redis上,dump命令会将键值序列化,格式采用的是RDB格式 dump key #目标Redis上,restore命令将上面序列化的值进行复原,其中ttl参 数代表过期时间,如果ttl=0代表没有过期时间 restore key ttl value
注意:
第一,整个迁移过程并非原子性的,而是通过客户端分步完成的。
第二,迁移过程是开启了两个客户端连 接,所以dump的结果不是在源Redis和目标Redis之间进行传输。
migrate
#用于在Redis实例间进行数据迁移的,实际上migrate命 令就是将dump、restore、del三个命令进行组合,从而简化了操作流程 #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 host port key|"" destination-db timeout [copy] [replace] [keys key[key...]]
注意:
第一,整个过程是原子执行的,不需要在多个Redis实例上开启客户端的,只需要在源Redis上执行migrate命令即可。
第二,migrate命令的 数据传输直接在源Redis和目标Redis上完成的。
第三,目标Redis完成restore 后会发送OK给源Redis,源Redis接收后会根据migrate对应的选项来决定是否 在源Redis上删除对应的键。
遍历键
全量遍历键
#执行keys命令很可能会造成Redis阻塞,所以一般建议不要在生 产环境下使用keys命令
keys pattern
#使用场景
1、在一个不对外提供服务的Redis从节点上执行,这样不会阻塞到客户端的请求,但是会影响到主从复制
2、如果确认键值总数确实比较少,可以执行该命令。
3、使用下面要介绍的scan命令渐进式的遍历所有键,可以有效防止阻塞。
渐进式遍历
#cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。
#match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像。
#count number是可选参数,它的作用是表明每次要遍历的键个数,默认 值是10,此参数可以适当增大。
scan cursor [match pattern] [count number]
注意:
渐进式遍历key有效的解决keys命令可能产生的堵塞问题,在scan使用过程中如果有键的变化(增加、删除、修改),那么遍历效果可能会碰到如下问题:新增的键可能没有遍历到,遍历出了重 复的键等情况,也就是说scan并不能保证完整的遍历出来所有的键。
除了scan以外,Redis提供了面向哈希类型、集合类型、有序集合的扫 描遍历命令,解决诸如hgetall、smembers、zrange可能产生的阻塞问题,对 应的命令分别是hscan、sscan、zscan
数据库管理
切换数据库
#切换数据库
select dbIndex
flushdb/flushall
#清除当前数据库
flushdb
#清除所有数据库
flushall
带来的问题:
- flushdb/flushall命令会将所有数据清除
- 如果当前数据库键值数量比较多,flushdb/flushall存在阻塞Redis的可能性