当前位置:首页 > 问答 > 正文

Redis里怎么查key的大小啊,size到底咋看才能知道?

MEMORY USAGE 命令看内存大小(字节数)

如果你最关心的是一个key到底吃了多少内存,那最对症的命令就是 MEMORY USAGE,这个命令是专门为查看内存使用情况设计的。

怎么用呢?很简单,打开你的Redis客户端(比如用 redis-cli),然后输入:

MEMORY USAGE your_key_name

你有一个key叫 user:1000:profile,你想知道它多大,就输入:

MEMORY USAGE user:1000:profile

命令执行后,它会返回一个数字,这个数字就是你这个key所占用的内存大小,单位是字节(bytes),这个数字包括了Redis为了管理这个key所需要的一些元数据( overhead)的开销,所以它反映的是这个key在Redis内存中的真实成本。

举个例子,如果返回 152,就说明这个key大概占了152个字节的内存,你可以用这个数字来比较不同key的内存占用,或者监控哪些key是“内存大户”。

一点小提示(根据Redis官方文档的说明):使用 MEMORY USAGE 命令的时候,如果这个key的值比较大,命令可能会稍微耗费一点时间来计算,因为它需要遍历整个值来精确计算大小,不过对于日常使用来说,通常速度都很快。

看元素多少:用 TYPE...SIZE 系列命令

你关心的“大小”不是占了多少字节,而是这个key里面装了多少个“东西”,对于一个List(列表),你可能想知道里面有多少条记录;对于一个Hash(哈希表),你可能想知道有多少个字段。

这时候,你需要分两步走:

  • 第一步:先用 TYPE 命令看看这个key是什么类型。 因为不同类型的key,查看元素数量的命令是不一样的,输入:

    TYPE your_key_name

    它会返回这个key的数据类型,string, list, hash, set, zset 等。

  • 第二步:根据类型,选择对应的统计命令。

    • 如果是 String(字符串):String类型就是一个值,没什么“元素”可言,所以你看它的“大小”,基本就是指它的内存占用,也就是用前面说的 MEMORY USAGE,或者你也可以用 STRLEN 命令看它值的长度(字符数),但这和内存大小不是完全一回事,特别是如果字符串不是纯ASCII字符的话。
    • 如果是 List(列表):用 LLEN 命令。LLEN 是 List LENgth 的缩写,它会直接返回这个列表里有多少个元素。
      LLEN your_list_key
    • 如果是 Hash(哈希表):用 HLEN 命令。HLEN 是 Hash LENgth 的缩写,它会返回这个哈希表里有多少个字段(field)。
      HLEN your_hash_key
    • 如果是 Set(集合):用 SCARD 命令。SCARD 是 Set CARDinality(基数)的缩写,它会返回这个集合里有多少个不重复的成员。
      SCARD your_set_key
    • 如果是 Sorted Set(有序集合):用 ZCARD 命令。ZCARD 是 Sorted Set CARDinality 的缩写,它会返回这个有序集合里有多少个成员。
      ZCARD your_zset_key

如果你发现一个key是Hash类型,然后用 HLEN 命令查出来它有1000个字段,那你就能直观地知道这个key的“规模”很大,即使它可能因为每个字段的值都很小而不太占内存。

想批量看或者找大Key?用 redis-cli--bigkeys 选项

上面说的都是针对单个key的操作,如果你接手一个Redis实例,想知道里面有没有那种特别大的key(我们常说的“大Key”),一个个用 MEMORY USAGE 去查就太累了,这时候,Redis自带了一个非常方便的工具。

你可以在操作系统的命令行里(不是在Redis客户端里),使用 redis-cli 命令并加上 --bigkeys 选项,像这样:

redis-cli -h your_redis_host -p your_redis_port --bigkeys

(如果Redis就在本机默认端口,直接写 redis-cli --bigkeys 就行)

这个命令会扫描整个Redis数据库,然后给你一份报告,列出每种数据类型中最大的那个key,以及它的大小(对于非String类型,大小是用元素数量-即LLEN/HLEN等的结果来表示的)。

非常重要的一点:根据Redis官方文档的说明,--bigkeys 这个操作是通过扫描(SCAN)数据库来完成的,所以它不会阻塞Redis的服务,你可以在生产环境下谨慎使用,但它毕竟会消耗一定的CPU和网络资源,最好在业务低峰期进行。

  • 想知道一个key吃了多少内存,用 MEMORY USAGE 命令,看字节数。
  • 想知道一个key里面有多少个元素(比如列表有几项、哈希表有几个字段),先用 TYPE 看类型,然后用对应的 LLENHLENSCARDZCARD 命令。
  • 全局找出哪些是“大Key”,用 redis-cli --bigkeys 来扫描,最省事。

下次再问“key的大小咋看”,你先想清楚,你是想知道它有多“重”(占内存),还是想知道它有多“满”(元素多),然后选对命令就行了,希望这个直接的解释能帮到你。

Redis里怎么查key的大小啊,size到底咋看才能知道?