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

Redis里那个size其实能调,设置大小啥的也不是特别难搞懂

你提到Redis那个size能调,设置大小不难搞懂,这个感觉是对的,这事儿说白了,就是告诉Redis:“哥们儿,我这服务器硬盘就那么大,你别可劲儿造,给你划个地盘,你就在这个圈里玩儿。” 这个“划地盘”的动作,就是设置最大内存。

(来源:Redis官方文档关于maxmemory配置项的说明)

最核心的那个参数就叫maxmemory,你可以在Redis的配置文件里找,通常叫redis.conf,用文本编辑器打开它,里面像个大字典,啥配置都有,你搜一下“maxmemory”,可能会发现它默认是被注释掉的,前面有个号,注释掉的意思就是“没启用”,Redis就会看你系统有多少空闲内存,它差不多就用到哪儿,不太会自己主动刹车,这对于新手或者开发测试环境没问题,但放到正式服务器上,这就有点危险了,万一它把系统内存吃光了,整个服务器可能都得卡死。

所以第一步,就是把maxmemory这个配置项放开注释,然后给它一个值,比如你有一台8G内存的服务器,你打算分给Redis 4个G,那你就写成 maxmemory 4gb,这里的单位挺灵活的,除了gb,还能用mb(兆字节)、kb(千字节),你写maxmemory 4096mb也是一样的,这就相当于给Redis的 memory usage 设了个硬顶,到了这个线,它就不能再往里塞新数据了。

(来源:Redis官方文档关于内存单位的规定)

Redis里那个size其实能调,设置大小啥的也不是特别难搞懂

但光设个顶还不够,关键问题是:顶到了之后,怎么办?新数据来了,是直接拒之门外,还是把老数据踢掉给新数据腾地方?这就引出了另一个关键设置,叫“内存淘汰策略”,配置项叫maxmemory-policy

(来源:Redis官方文档关于maxmemory-policy配置项的详细解释)

这个策略才是调size的精髓所在,它决定了Redis在内存满了之后的行为,有好几种策略可选,你根据你的业务场景挑一个合适的就行,一点儿也不复杂:

  1. noeviction:这是默认策略,意思就是“不淘汰”,内存满了?对不起,所有会占用更多内存的命令(比如写入新key、给现有key增加数据)直接报错,简单粗暴,能保证已有的数据绝对安全,但你的服务可能会因为写不进去数据而出问题,适合你把这些数据当宝贝,宁可写不进去也不能丢的场景。

    Redis里那个size其实能调,设置大小啥的也不是特别难搞懂

  2. allkeys-lru:这是最常用的一种策略之一,LRU是“最近最少使用”的缩写,这个策略就是说,当内存不够时,Redis会看所有key的访问情况,把那个最长时间没被访问过的key踢掉,不管这个key有没有设置过期时间,这很适合那种“热点数据”场景,比如用户最近浏览的商品、热搜榜,最近没人看的自然就被淘汰了。

  3. volatile-lru:这个和上面的有点像,但范围小了点,它只会在那些设置了过期时间的key里面,挑一个最近最少使用的踢掉,那些没设过期时间的key是“免死金牌”,不会被动淘汰,适合你的数据里有一部分是临时缓存(如短信验证码),另一部分是重要的基础数据,你想保护基础数据不被误删。

  4. allkeys-random:随机删,内存满了就随便挑一个key干掉,管你是谁,这个策略听起来有点随意,但在所有key访问概率都差不多的情况下,也挺公平的。

  5. volatile-random:和上面类似,但只在设置了过期时间的key里随机删。

    Redis里那个size其实能调,设置大小啥的也不是特别难搞懂

  6. volatile-ttl:这个策略挺有意思的,TTL是“剩余生存时间”,它会在设置了过期时间的key里,找那个最快就要过期的key淘汰掉,反正你马上就要死了,不如提前送你走,给新来的腾个地儿,这特别适合给缓存系统用,因为快过期的缓存本身价值也在降低。

你看,这几个策略一说,是不是挺好理解的?你根本不需要去深究LRU算法底层是怎么实现的,你只需要知道“最近最少使用”这个大概意思,就能做出选择了,比如你的Redis主要当缓存用,丢了数据可以从数据库再取,那就用allkeys-lru;如果你的数据有些重要有些不重要,就给不重要的设上过期时间,然后用volatile-lruvolatile-ttl

(来源:基于Redis常见使用模式的最佳实践建议)

设置完了maxmemorymaxmemory-policy,重启一下Redis服务,你的配置就生效了,之后你就可以高枕无忧了,Redis会像个自动化的仓库管理员,严格按照你划定的地盘和规则来管理数据,满了就按你的指示清理,不会再出现内存爆炸把服务器拖垮的情况。

有时候你可能还想知道现在Redis用了多少内存,离你设的顶还有多远,这个也很简单,用Redis自带的命令行工具redis-cli连上去,然后输入命令info memory,会出来一大堆信息,你找used_memorymaxmemory这两行,一看就知道现在用了多少,上限是多少,心里就有数了。

(来源:RedisINFO命令的输出说明)

所以总的来说,调Redis的size这事儿,核心就两步:第一步,用maxmemory告诉它最多能用多少内存;第二步,用maxmemory-policy告诉它内存满了之后按什么规矩办事,这两步设置好了,基本上就齐活了,剩下的就是根据你业务的实际情况,微调一下策略的选择,比如是更注重缓存命中率还是更保证数据留存,但这个选择的过程本身也是基于业务逻辑的思考,并不涉及深奥的技术概念,多试几次,看看哪种策略下你的应用跑得最顺畅,慢慢就有手感了。