0%

Redis Key管理

键重命名

1
rename key newkey

如果在重命名之前新的键名已经存在将会对其值进行覆盖,为了防止被强制rename,可以使用renamenx命令,确保只有新的key不存在时才会覆盖。
在rename的时候还有以下两点需要注意:

  • rename会执行del命令删除旧的key,如果value比较大,存在阻塞Redis进程的可能
  • rename或者renamenx如果旧key和新key一样,在3.2版本之前会返回OK,后3.2之后会报错

键过期

1
2
expire key seconds
expireat key timestamp

expire和expireat都是基于秒级的,expire在seconds秒后过期,expireat在秒级时间戳timestamp后过期

1
2
pexpire key milliseconds
pexpireat key milliseconds-timestamp

在2.6版本之后通过perpire和perpireat命令可以设置毫秒级别,pexpire在milliseconds毫秒后过期,pexpireat在毫秒级时间戳milliseconds-timestamp后过期

1
2
ttl key
pttl key

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命令可以在多个数据库之间迁移数据。

1
move key db

(2)dump+restore

dump+restore可以实现在不同Redis实例之间进行数据迁移,整个过程可以分为两步:

  • 在源端,dump命令会将键值序列化,格式采用的是RDB格式
  • 在目标端,restore命令可以将上面序列化的值进行复原,其中ttl代表过期时间,不想过期可以设置ttl=0

源端dump

1
2
127.0.0.1:6379> dump hello
"x00\x05world\x06\x00\x8f<T\x04%\xfcNQ"

目标端

1
2
3
4
127.0.0.1:6379> restore hello 0
"x00\x05world\x06\x00\x8f<T\x04%\xfcNQ"
127.0.0.1:6379>get hello
"world"

(3)migrate

migrate命令也是作用于Redis实例之间数据迁移的,实际上migrate就是将dump、restore、del三个命令结合,其具有原子性。

1
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]
  • host:目标端IP地址
  • port:目标端redis端口
  • key|”” :在redis3.0.6之前migrate只支持迁移一个键,后续可以迁移多个键,如果需要迁移多个键就设置””字符串
  • destination-db:目标redis数据库索引
  • timeout:迁移超时时间
  • copy:如果设置则迁移完成后源端不删除键
  • replace:如果设置则不管目标端是否已经存在都会进行覆盖
  • keys key:设置要迁移的键

遍历键

keys命令可以用于遍历查找key,同时它也支持pattern匹配的。

1
keys pattern
  • *代表匹配任意字符
  • ?代表匹配一个字符
  • []代表匹配部分字符,例如[a,b]就代表匹配a,b
  • \x用来转义

但需要注意的是Redis是单线程的,如果Redis包含大量键,执行keys将会是一个非常耗时的操作,造成Redis进程阻塞,因此不建议在生产环境使用该命令。

Redis在2.8版本中引入了scan命令,它能有效解决keys命令带来的问题。scan命令通过渐进式遍历的方式,每次scan命令的时间复杂度为O(1),满足keys功能需要执行多次scan

1
scan cursor [match pattern] [count number]
  • cursor:游标第一次遍历从0开始,每次遍历之后返回当前游标的值,直到游标为0则表示遍历结束
  • match pattern是可选参数,它的作用是做模式匹配
  • count number是可选参数,作用是每次要遍历的键个数,默认为10,可根据情况增加

除了scan外,Redis还提供了针对hash(hscan),集合(sscan)、有序集合(zscan)的遍历命令,用于解决hgetall、smembers、zrange可能产生的阻塞问题。