Redis OBJECT 命令允许从内部查看指定 key 的 Redis 对象信息。它通常用在调试,或者了解相关 key 是否使用特殊编码的数据类型来节省空间等。此外,当 Redis 作为缓存时,你也可以通过 OBJECT 命令中的信息,决定 key 的淘汰策略。
命令格式
OBJECT subcommand [arguments [arguments ...]]
可用版本:>=2.2.3
时间复杂度:O(1)
命令参数
OBJECT 命令支持多个子命令:
OBJECT REFCOUNT <key>
:返回指定 key 引用所储存的值的次数。此命令主要用于调试。OBJECT ENCODING <key>
:返回指定 key 所储存的值所使用的内部表现形式(或者叫编码情况)。OBJECT IDLETIME <key>
:返回指定 key 自储存以来的空闲时间(没有被读取也没有被写入),以秒为单位。虽然该命令返回以秒为单位,但是实际的时间粒度是 10 秒,以后会对实现有所变化。该子命令对淘汰策略设置 LRU 或者没有设置时有用。OBJECT FREQ <key>
:返回指定 key 所存储的值的访问频率对数。该子命令对淘汰策略设置 LFU 时有用。OBJECT HELP
:返回帮助文档。
针对对象的编码方式(encode)有多种方式:
- 字符串可以被编码为 raw(一般字符串)或 int(为了节省内存,Redis 会将字符串表示的 64 位有符号整数编码为整数来进行储存)。
- 列表可以被编码为 ziplist 或 linkedlist。ziplist 是为节省大小较小的列表空间而作的特殊表示。
- 集合可以被编码为 intset 或者 hashtable。intset 是只储存数字的小集合的特殊表示。
- 哈希表可以编码为 zipmap 或者 hashtable。zipmap 是小哈希表的特殊表示。
- 有序集合可以被编码为 ziplist 或者 skiplist。ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。
一旦执行使 Redis 无法保留节省空间的编码的操作(比如,将一个只有 1 个元素的集合扩展为一个有 100 万个元素的集合),所有特殊编码类型将自动转换为常规类型。
命令返回值
不同的子命令有不同的返回值。
- REFCOUNT 和 IDLETIME 返回整数值。
- ENCODING 返回相应的编码类型。
示例
redis> SET mystring hello
OK
redis> LPUSH mylist world
(integer) 1
redis> GET mystring
"hello"
redis> OBJECT REFCOUNT mystring
(integer) 1
redis> OBJECT ENCODING mystring
"embstr"
redis> OBJECT ENCODING mylist
"quicklist"
redis> OBJECT IDLETIME mylist
(integer) 95