上次在《??Redis 数据过期了会被立马删除么???》中说过,如果过期数据太多,无法通过定期删除完全删除(每次删除超过25%的过期键),这些键永远不会被请求客户端再次。如果不能延迟删除,内存满了怎么办?答案是使用内存淘汰机制。故事始于一个官方职位,叫做Redis帝国……在Redis帝国中,整个帝国的国法、家法、军法都记录在redis.conf中,控制着整个帝国的运行。公务员占用国土资源的大小上限是由司法官员设定的,名称为“maxmemory”。实现方式有两种:使用CONFIGSETmaxmemory4gb指定运行时朝廷官员的最大土地资源为4GB;将maxmemory4gbdecree记录到redis.conf中的“code”中,在empire运行中指定用这个“code”运行。请注意,如果maxmemory为0,则64位“空间”没有限制,而32位“空间”有3GB的隐式限制。Redis内存淘汰策略对帝国官位的资源进行了限制。每年选新人的时候没有资源可以用怎么办?如何选拔部分公务员淘汰?Redis4.0时代一共有6种淘汰策略,后来又增加了2种策略。一般来说,我们可以根据是否需要淘汰分为两类:无淘汰策略,noeviction;其他7种策略根据不同规则淘汰。noevictionno-retirementpolicy默认不淘汰超过maxmemory值的资源,不允许新人加入。关系户,这里是皇亲国戚,永久vip你好。随着官方人员的加入,因为不会被淘汰,资源容量迟早会被用完。满了以后,当有“新人”要进来的时候,Redis直接返回错误罢工。秀,真是任性。各种淘汰策略剩下的7种策略也可以根据淘汰的候选集和淘汰范围分为两类:淘汰已设置过期时间的员工,未设置过期时间的员工不被淘汰,淘汰策略如下:volatile-lru:淘汰最近工作最少的人员;volatile-lfu:4.0后的新策略,淘汰工作次数最少的人员;volatile-random:随机淘汰,为新人腾出坑一个;volatile-ttl:淘汰任期设定的公务员,离任期最近的先淘汰。淘汰各类人员,无论是永久贵宾皇亲国戚还是有期限的人员。allkeys-lru:剔除至少最近工作过的员工;allkeys-lfu:剔除至少最近工作过的公务员;allkeys-random:随机淘汰员工,为新员工腾出空间。故事到此结束。接下来,“码哥”将与大家分享在实际的Redis中如何选择合适的淘汰策略和设置最优的缓存大小。淘汰执行流程如下图所示:redis-eviction客户端向服务端发送一条新命令;服务端收到客户端命令,Redis检查内存使用情况,如果大于maxmemory限制,则根据策略逐出数据。执行新命令。allkeys-lru使用场景如果你的应用有明显的冷热数据差异,我们建议你根据经验使用该策略,充分利用LRU算法保留最近访问的数据,使用有限的内存来提高访问表现。allkeys-random使用场景如果冷热数据没有明显差异,所有数据分布查询比较均衡,会随机查询这些数据,然后使用allkeys-random策略随机选择和淘汰数据。volatile-lru使用场景业务场景有一些数据是不能删除的,比如热门新闻、视频。这个时候我们不给这些数据设置一个过期时间,这样数据就不会被删除,策略会根据LRU算法进行淘汰。设置了过期时间的数据和最近最少访问的数据。需要注意的一点是设置key的过期时间执行expire会消耗一些内存,所以使用allkeyds-lru会提高内存效率。对于需要保存不可删除数据的业务系统和可以消去所有数据的业务系统,使用不同的Redis实例集群是一个更好的方案。对于一些数据不能删除的业务场景,使用volatile-lru策略,其他类型可以使用allkyes-lru或者allkeys-random。缓存的Redis容量设置的合适大小并不是越大越好,老板想以最小的成本获得最大的收益。数据访问本地化,根据“二十八原则”:通常20%的数据可以支持80%的访问请求。那么是否可以将缓存容量设置为总数据量的20%呢?当然也不能这么绝对,这是最理想的状态。由于可能存在一些个性化的需求,不同用户访问的数据可能差异很大,“八分之二原则”并不能完全满足。我们应该根据实际的访问特点和成本进行综合评估。根据经验,建议将容量设置为总数据量的15%~30%。马哥,其他的淘汰规则比较简单,volatile-lru和volatile-lfu比较复杂。他们的算法是什么?volatile-lru使用LRU算法剔除最近最少使用的数据。volatile-lfu采用LFU算法,在LRU算法的基础上兼顾了数据的时效性和访问频率,访问最少的key会被删除。至于具体算法的细节,我们下次再细说。如果一次太多,大家很容易在知识的海洋里窒息。
