键重命名
 | 
 | 
如果在重命名之前新的键名已经存在将会对其值进行覆盖,为了防止被强制rename,可以使用renamenx命令,确保只有新的key不存在时才会覆盖。 在rename的时候还有以下两点需要注意:
- rename会执行del命令删除旧的key,如果value比较大,存在阻塞Redis进程的可能
 - rename或者renamenx如果旧key和新key一样,在3.2版本之前会返回OK,后3.2之后会报错
 
键过期
 | 
 | 
expire和expireat都是基于秒级的,expire在seconds秒后过期,expireat在秒级时间戳timestamp后过期
 | 
 | 
在2.6版本之后通过perpire和perpireat命令可以设置毫秒级别,pexpire在milliseconds毫秒后过期,pexpireat在毫秒级时间戳milliseconds-timestamp后过期
 | 
 | 
ttl和pttl可以查询key的剩余过期时间,其中pttl可以精确到毫秒,返回值大于0则是剩余过期时间,-1表示没有设置过期时间,-2表示key不存在
注意事项:
- 当过期时间设置为负值key会被立即删除
 - persist命令可以取消过期时间配置
 - 对于字符串类型,set命令会移除过期时间,需注意。
 - Redis不支持二级数据结构,例如对List列表中的元素设置过期时间
 
迁移键
当我们想把部分数据由一个Redis迁移到另一个Redis,可以通过move、dump+restore、migrate三种迁移方式。
(1)move
move用于Redis内部数据库之间进行迁移的。由于Redis内部具有多个数据库,数据库之间是相互隔离的,move命令可以在多个数据库之间迁移数据。
 | 
 | 
(2)dump+restore
dump+restore可以实现在不同Redis实例之间进行数据迁移,整个过程可以分为两步:
- 在源端,dump命令会将键值序列化,格式采用的是RDB格式
 - 在目标端,restore命令可以将上面序列化的值进行复原,其中ttl代表过期时间,不想过期可以设置ttl=0
 
源端dump
 | 
 | 
目标端
 | 
 | 
(3)migrate
migrate命令也是作用于Redis实例之间数据迁移的,实际上migrate就是将dump、restore、del三个命令结合,其具有原子性。
 | 
 | 
- host:目标端IP地址
 - port:目标端redis端口
 - key|"" :在redis3.0.6之前migrate只支持迁移一个键,后续可以迁移多个键,如果需要迁移多个键就设置"“字符串
 - destination-db:目标redis数据库索引
 - timeout:迁移超时时间
 - copy:如果设置则迁移完成后源端不删除键
 - replace:如果设置则不管目标端是否已经存在都会进行覆盖
 - keys key:设置要迁移的键
 
遍历键
keys命令可以用于遍历查找key,同时它也支持pattern匹配的。
 | 
 | 
- *代表匹配任意字符
 - ?代表匹配一个字符
 - []代表匹配部分字符,例如[a,b]就代表匹配a,b
 - \x用来转义
 
但需要注意的是Redis是单线程的,如果Redis包含大量键,执行keys将会是一个非常耗时的操作,造成Redis进程阻塞,因此不建议在生产环境使用该命令。
Redis在2.8版本中引入了scan命令,它能有效解决keys命令带来的问题。scan命令通过渐进式遍历的方式,每次scan命令的时间复杂度为O(1),满足keys功能需要执行多次scan
 | 
 | 
- cursor:游标第一次遍历从0开始,每次遍历之后返回当前游标的值,直到游标为0则表示遍历结束
 - match pattern是可选参数,它的作用是做模式匹配
 - count number是可选参数,作用是每次要遍历的键个数,默认为10,可根据情况增加
 
除了scan外,Redis还提供了针对hash(hscan),集合(sscan)、有序集合(zscan)的遍历命令,用于解决hgetall、smembers、zrange可能产生的阻塞问题。