Q:OBJECT只是返回key对应的底层类型,并没有占用大小呀 Redis 的 OBJECT 命令主要是用来获取指定 key 的底层编码方式,可以通过指定 ENCODING 子命令来获取不同的编码信息。例如,使用 OBJECT ENCODING 命令可以获取指定 key 的编码方式,如 "string"、"hash"、"list"、"set" 等等。而 OBJECT 命令并没有直接提供获取 key 占用内存大小的功能。因此,如果你想要获取 Redis 中每个 key 的内存占用大小,可以使用 MEMORY USAGE 命令。如果你需要了解 Redis 中每个 key 的底层编码方式,可以使用 OBJECT 命令。
127.0.0.1:6379> DEBUG object user:1 Value at:0x7f380147bdc0 refcount:1 encoding:ziplist serializedlength:32 lru:8586802 lru_seconds_idle:788429
这段 Redis 调试信息的意思是:
- Value at:0x7f380147bdc0:表示该 key 的值存储在内存地址 0x7f380147bdc0 中。
- refcount:1:表示该 key 的引用计数为 1,即有 1 个客户端正在使用该 key。
- encoding:ziplist:表示该 key 的底层编码方式为 ziplist,即压缩列表。
- serializedlength:32:表示该 key 的序列化长度为 32 字节。
- lru:8586802:表示该 key 上次访问的时间戳为 8586802。
- lrusecondsidle:788429:表示该 key 距离上次被访问已经过去了 788429 秒。
这些调试信息可以帮助你了解 Redis 中每个 key 的底层编码方式、占用空间大小、访问时间等信息,对于性能优化和问题排查非常有用。
Q:但是8586802不是个时间戳吧?
A:你是对的,8586802 不是一个标准的时间戳。在 Redis 中,LRU 时间戳(LRU timestamp)实际上是以秒为单位的整数,表示该 key 上次被访问的时间距离 Redis 服务器启动时间的秒数。因此,LRU 时间戳可以用于比较不同 key 被访问的时间先后顺序,但不能直接用于表示具体的日期和时间。
在 DEBUG 命令的调试信息中,LRU 字段的值是 Redis 内部使用的 LRU 时间戳,表示该 key 上次被访问的时间距离 Redis 服务器启动时间的秒数,而不是标准的时间戳。
1.127.0.0.1:6379> INFO memory
# Memory
used_memory:893560
used_memory_human:872.62K
used_memory_rss:5976064
used_memory_rss_human:5.70M
used_memory_peak:1228752
used_memory_peak_human:1.17M
used_memory_peak_perc:72.72%
used_memory_overhead:851144
used_memory_startup:809824
used_memory_dataset:42416
used_memory_dataset_perc:50.65%
.....
2.127.0.0.1:6379> SCAN 0 COUNT 1000
1) "0"
2) 1) "name2"
2) "key"
3) "user:1"
4) "name1"
5) "name"
127.0.0.1:6379> object encoding name
"embstr"
127.0.0.1:6379> MEMORY USAGE name
(integer) 54
- 解析每个 key 的内存占用情况,将数据保存到文件中。
📋 Copy code> my_analysis.txt
4.使用 SORT 命令对数据进行排序,找出占用内存较大的 key。
📋 Copy codeSORT my_analysis.txt BY *->size DESC
这样,就可以使用 Redis 的 OBJECT 命令来获取每个 key 的内存占用情况,然后使用 SCAN、 OBJECT 和 SORT 命令获取每个 key 的内存占用情况,并找出占用内存较大的 key。