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

Redis里怎么查和设定可用内存,搞清楚内存探索那些事儿

要搞清楚Redis的内存,首先得知道从哪里看起,Redis自己就提供了一个非常强大的命令来查看内存的总体情况,那就是INFO MEMORY命令(来源:Redis官方文档),你只需要在连接到Redis服务器后,在命令行里输入这个命令,它就会返回一大堆关于内存使用的信息,这就像是你想了解自己家的财务状况,先去看一份详细的资产负债表。

INFO MEMORY返回的信息里,有几个关键的数字你需要特别留意,第一个是used_memory,这个值直接告诉你Redis当前已经使用了多少字节的内存,这是最直观、最重要的一个指标,它反映了你的Redis实时的内存消耗量,第二个是used_memory_human,这个值非常贴心,它把used_memory自动转换成了一个人类更容易读懂的格式,比如显示成多少MB、多少GB,你就不用自己再去计算那一长串字节数了。

Redis里怎么查和设定可用内存,搞清楚内存探索那些事儿

除了已经用了多少,你还需要知道总共被允许用多少,这就涉及到另一个关键设置:最大内存限制,这个限制是通过配置文件里的maxmemory参数来设定的(来源:Redis官方文档),你可以把它想象成你为Redis划定的一个“内存预算”,如果used_memory接近甚至达到了maxmemory,那么Redis就可能要开始采取一些行动了,因为内存快不够用了。

如何设定这个“内存预算”呢?主要有两种方式,第一种是直接修改Redis的配置文件,通常叫redis.conf,你可以在文件里找到maxmemory这一行,默认情况下这一行可能是被注释掉的,意味着没有内存限制,Redis会一直使用直到耗尽宿主机的可用内存,这显然是很危险的,所以你通常需要取消注释,并设置一个值,maxmemory 2gb 或者 maxmemory 1024mb,修改完配置文件后,需要重启Redis服务才能生效。

Redis里怎么查和设定可用内存,搞清楚内存探索那些事儿

第二种方式是在Redis运行时动态地进行配置,不需要重启服务,这通过CONFIG SET命令来实现(来源:Redis官方文档),你想把最大内存限制设置为1GB,可以直接在命令行里输入 CONFIG SET maxmemory 1gb,这个命令会立即生效,非常灵活,适合在需要临时调整或者不方便重启服务的情况下使用。

设定好了最大内存,接下来一个很自然的问题就是:当内存用满了怎么办?Redis不会直接报错崩溃,而是会根据你设定的maxmemory-policy(最大内存策略)来决定如何释放内存(来源:Redis官方文档),这个策略就像是内存满了之后的“清理规则”,常见的策略有几种:比如volatile-lru,它会尝试淘汰那些设置了过期时间的键中最近最少使用的键;allkeys-lru则是在所有键中淘汰最近最少使用的,不管有没有设置过期时间;还有volatile-ttl,它会优先淘汰过期时间更近的键,你可以根据自己数据的特性来选择最合适的策略,这个策略同样可以在配置文件里用maxmemory-policy参数设定,或者用CONFIG SET maxmemory-policy命令动态修改。

Redis里怎么查和设定可用内存,搞清楚内存探索那些事儿

光知道总量还不够,有时候你需要更细致地了解到底是哪些数据占用了大量内存,这时候INFO MEMORY就显得有点笼统了,Redis提供了另一个强大的内存分析工具——MEMORY USAGE命令(来源:Redis官方文档),这个命令需要你指定一个键的名字,MEMORY USAGE mybigkey,它会返回这个键及其值所占用的内存字节数,这对于排查哪些“大Key”拖慢了系统非常有帮助,因为如果一个键存储的值非常大(比如一个包含几百万元素的列表或集合),不仅占用内存多,在操作时也可能导致Redis阻塞一段时间。

如果想对整个数据库进行一个更全面的内存分析,你可以使用MEMORY STATS命令(来源:Redis官方文档),这个命令会给出比INFO MEMORY更详细的内存分类统计,比如分别统计字符串类型的数据用了多少内存、哈希类型用了多少、等等,它能帮你从宏观上了解不同类型数据的内存分布情况。

还有一个进阶的工具是redis-cli自带的--bigkeys选项(来源:Redis官方文档),这个不是在Redis命令行里执行的,而是在你系统本身的命令行里,使用Redis的客户端工具,命令类似这样:redis-cli --bigkeys,它会扫描整个数据库,并给出每种数据类型中最大的那个键的信息,这是一个非常有用的发现大Key的辅助手段,但要注意,在生产环境执行这种扫描命令可能会对性能有短暂影响,最好在业务低峰期进行。

查看和设定Redis内存,核心是INFO MEMORY看总体,maxmemory设上限,maxmemory-policy定清理规则,而要深入探索内存细节,则要借助MEMORY USAGEMEMORY STATS--bigkeys这些工具,把这些命令和配置结合起来用,你就能对Redis的内存使用情况有一个比较清晰的把握,从而更好地进行容量规划和性能优化,定期检查内存使用情况,防患于未然,是保证Redis稳定运行的关键。