我们在使用 Redis 时,往往想要查看单个指定 key 的内存所占大小,以此来进一步判断如何更合理地存储比较大的键。
解决方法
redis 在 4.0 版本开始,提供了允许查看特定 key 大小的命令 MEMORY USAGE
命令,具体示例如下:
redis_host:6379> set knowledge dict
OK
redis_host:6379> memory usage knowledge
(integer) 59
返回指定 key 的内存占用字节数。
如果要查看的 key 是内嵌类型(除 string 之外的集合类型),可以使用 SAMPLES
选项来可以指定采样的元素个数。
假设,键 knowledgedict 是哈希(hash)类型,它有 10000 个元素,那么预估该键的占用大小,可以通过 SAMPLES
选项来指定采样元素个数,进行抽样平均计算后预估总大小,示例如下:
redis_host:6379> MEMORY USAGE knowledgedict SAMPLES 100
(integer) 617977753
redis_host:6379> MEMORY USAGE knowledgedict SAMPLES 1000
(integer) 624950853
可以看出,抽样的个数不一样,会导致预估大小的变化,主要是因为抽样及平均算法导致。
抽样是使用 LRU 采样方式,默认抽样 5 个元素,计算抽样个数的平均占用大小,然后根据总元素个数算出总大小,所以计算是近似值。
这是使用抽样求平均的算法,要想获取 key 较精确的内存值,就指定更大 SAMPLES 个数。但并不是越大越好,因为越大,命令占用 cpu 时间分片就大。
此外,memory usage不包含 key 本身字符串的内存占用,也不包含 key expire 的内存占用。
查看 memory usage 更多信息参见 MEMORY USAGE 命令详解