java架构师培训-Redis内存淘汰机制是什么

2021年04月06日 16:04

44

    Redis内存消除是指Redis可以主动从实例中删除用户存储的某些键,从而导致读取未命中的事实。那么,Redis为什么具有此功能?这是我们需要探索的设计的初衷。Redis的两种最常见的应用场景是缓存和持久性存储。首先要明确的一个问题是内存淘汰策略更适合于那种场景?是持久存储还是缓存?

part-00666-2712.jpg


    内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。


    作为Redis用户,我如何使用Redis提供的这个特性呢?看看下面配置


    #maxmemory<bytes>


    我们可以通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能,至于这个值有什么意义,我们可以通过了解内存淘汰的过程来理解它的意义:


    1.客户端发起了需要申请更多内存的命令(如set)。


    2.Redis检查内存使用情况,如果已使用的内存大于maxmemory则开始根据用户配置的不同淘汰策略来淘汰内存(key),从而换取一定的内存。


    3.如果上面都没问题,则这个命令执行成功。


    maxmemory为0的时候表示我们对Redis的内存使用没有限制。


    Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:


    ·noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。


    ·allkeys-lru:在主键空间中,优先移除最近未使用的key。


    ·volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。


    ·allkeys-random:在主键空间中,随机移除某个key。


    ·volatile-random:在设置了过期时间的键空间中,随机移除某个key。


    ·volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。


    这是对主密钥空间和具有到期时间设置的密钥空间的补充。例如,假设我们在Redis中存储了一批密钥,那么有一个哈希表用于存储这批密钥及其值,如果这批密钥是某些密钥设置了过期时间,那么这批密钥的键也将存储在另一个哈希表中。该哈希表中的值对应于密钥集的到期时间。为其设置了到期时间的密钥空间是主密钥空间的子集。


    我们了解了Redis大概提供了这么几种淘汰策略,那么如何选择呢?淘汰策略的选择可以通过下面的配置指定:


    #maxmemory-policynoeviction


    但是这个值填什么呢?为了解决这个问题,我们需要了解我们的应用程序如何请求访问Redis中存储的数据集以及我们的吸引力。同时,Redis还支持运行时来修改消除策略,这使我们能够实时调整内存消除策略,而无需重新启动Redis实例。


    下面看看几种策略的适用场景:


    ·allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。


    ·allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。


    ·volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。


    另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。


 推荐阅读:java架构师培训:java最佳测试框架JBehave的基本介绍


更多鲁班学院java高级培训免费课程试听地址https://www.lubanjava.com/course.html

鲁班学院java高级培训课程https://www.lubanjava.com/course/detail/519.html

加群即可领取鲁班学院最新Java高级培训课程资料学习包 群号:700541970


咨询(2)
免费试听
领取优惠
加群交流

扫一扫
加群领取架构师资料

售后反馈
返回顶部