天天看点

Redis的OBJECT命令(翻译)

查看原文请点击这里

OBJECT subcommand [arguments [arguments …]]

2.2.3及以上版本可用

时间复杂度:O(1).

OBJECT命令允许你从内部查看给定的Redis对象。它对查错很有帮助,同时也让你了解某个key使用了何种编码类型,这对节省存储空间很有帮助。当使用Redis作为缓存时,你可以依据OBJECT命令获取的信息制定key的淘汰策略。

OBJECT命令支持多个子命令:

  • OBJECT REFCOUNT :返回特定key对应值的引用计数。这个命令主要用于调试。
  • OBJECT ENCODING :返回特定key对应值的内部编码方式。
  • OBJECT IDLETIME :返回特定key的空闲时间(既没有被读,也没有被写)(译者注:每当该key被读/写时,idletime会重新从0开始计数。),以秒为单位。虽然返回值以秒为单位,但这个计时器的实际精度是10秒级别,当然这点在未来的版本中有可能改变。只有当maxmemory-policy被设置为LRU或noeviction时,该子命令才可以使用。

对象可以有多种编码方式(译者注:redis中的值都是以内部对象的形式进行存储的,不同的编码方式即不同的存储对象类型):

  • 字串(String)编码方式为raw(常规的字串编码方式)或int(为了节省空间,如果一个字串是整数并可以用64位有符号整形来表示,那么这个字串将以这种方式编码)。(译者注:string还有一种编码方式为embstr,用于存储39字节以下的字串。)
  • 链表(List)对应的编码方式为ziplist或者linkedlist。当链表较小时会以ziplist方式编码以节省存储空间。
  • 集合(Set)对应的编码方式为intset或者hashtable。当集合较小且只由整数组成时使用intset编码。
  • 哈希表(Hashe)对应的编码方式为ziplist或者hashtable。当哈希表较小时使用ziplist存储。
  • 有序集合(Sorted Set)对应的编码方式为ziplist或者skiplist。ziplist编码可以用于较小的有序集合。skiplist编码可以用于任何大小的有序集合。

如果你的操作使用得Redis不再能够使用节省空间的编码方式(译者注:比如字串变得很长,集合变得很大。),Redis会自动将其转化为通用编码方式。

返回值

不同的子命令有不同的返回值。

  • refcount与idletime的返回值是整数。
  • encoding返回相应的编码类型。

    如果查看的对象不存在,返回值为空(nil)。

例子

redis> lpush mylist "Hello World"
(integer) 4
redis> object refcount mylist
(integer) 1
redis> object encoding mylist
"ziplist"
//10秒后执行
redis> object idletime mylist
(integer) 10           

复制

一旦当前编码类型对应的存储空间不够,redis将转换编码类型。下面的例子对此进行了展示。

redis> set foo 1000
OK
redis> object encoding foo
"int"
redis> append foo bar
(integer) 7
redis> get foo
"1000bar"
redis> object encoding foo
"raw"           

复制