Redis的过期策略和内存淘汰机制,LRU算法?

redis 的过期策略都有哪些?内存淘汰机制都有哪些?

[LRU算法](https://blog.csdn.net/kuizhu7142/article/details/81115750)

常见的有两个问题:

• 往 redis 写入的数据怎么没了?

可能有同学会遇到,在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿可能就没了。我的天,同学,你问这个问题就说明 redis 你就没用对啊。redis 是缓存,你给当存储了是吧?
啥叫缓存?用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个 G 的内存,但是可以有几个 T 的硬盘空间**。redis 主要是基于内存来进行高性能、高并发的读写操作的**。
那既然内存是有限的,比如 redis 就只能用 10G,你要是往里面写了 20G 的数据,会咋办?当然会干掉 10G 的数据,然后就保留 10G 的数据了。那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据,保留常用的数据了。

• 数据明明过期了,怎么还占用着内存?

这是由 redis 的过期策略来决定。

面试题剖析

redis 过期策略

redis 过期策略是:定期删除+惰性删除。
所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。
假设 redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上的灾难。实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。
获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。
但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?
答案是:走内存淘汰机制。

内存淘汰机制

redis 内存淘汰机制有以下几个:
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个开源的键值对存储数据库。它使用内存作为主要的数据存储介质,因此在处理大量数据时,需要考虑内存的使用和管理问题。Redis通过实现一些内存淘汰机制来解决这个问题。本文将对Redis内存淘汰机制进行详细解析。 一、Redis内存淘汰机制概述 Redis内存淘汰机制用于在内存使用超过预设阈值时,删除一些不常用的键值对,以释放内存空间。Redis提供了多种内存淘汰机制,包括: 1. noeviction(默认):当内存不足以容纳新写入数据时,新写入操作会报错。 2. allkeys-lru:在所有的键中,最近最少使用的键会被优先移除。 3. volatile-lru:在设置了过期时间的键中,最近最少使用的键会被优先移除。 4. allkeys-random:从所有的键中随机移除键。 5. volatile-random:从设置了过期时间的键中随机移除键。 6. volatile-ttl:从设置了过期时间的键中,根据键值对的ttl(time-to-live)值,移除最近将要过期的键。 其中,noeviction是Redis的默认策略,表示当内存不足以容纳新写入数据时,新写入操作会报错。而其他五种策略则是在内存不足时,用于删除一些键值对以释放内存空间的策略。 二、allkeys-lru淘汰策略 allkeys-lru策略是基于最近最少使用(LRU算法内存淘汰机制。它会在所有的键中,选择最近最少使用的键进行淘汰。 这个算法的实现依赖于Redis记录键的访问时间。当一个键被访问时,Redis会记录下当前时间,并将该时间戳与键的访问时间进行比较。当内存不足以容纳新写入数据时,Redis会选择访问时间最早的键进行淘汰。 allkeys-lru策略的优点是可以保证数据的热度。它会优先保留经常访问的数据,而淘汰不常用的数据。这样可以避免一些冷数据占用过多的内存空间,从而提高Redis的性能。 三、volatile-lru淘汰策略 volatile-lru策略是基于LRU算法内存淘汰机制,但它只会在设置了过期时间的键中选择最近最少使用的键进行淘汰volatile-lru策略的实现方式与allkeys-lru相同,只是在选择淘汰键的时候,只考虑设置了过期时间的键。 volatile-lru策略的优点是可以在保证数据热度的同时,避免长期不使用的过期键占用过多的内存空间。 四、allkeys-random淘汰策略 allkeys-random策略是一种随机淘汰算法,它会从所有的键中随机选择一个键进行淘汰。 这种算法的实现方式比较简单,只需要在选择淘汰键时,从所有的键中随机选择一个即可。它的优点是可以避免一些冷数据占用过多的内存空间,但缺点是无法保证数据的热度。 五、volatile-random淘汰策略 volatile-random策略是一种随机淘汰算法,它会从设置了过期时间的键中随机选择一个键进行淘汰。 这种算法的实现方式与allkeys-random相似,只是在选择淘汰键时,只考虑设置了过期时间的键。它的优点是可以避免长期不使用的过期键占用过多的内存空间,但缺点是无法保证数据的热度。 六、volatile-ttl淘汰策略 volatile-ttl策略是根据键值对的ttl值,选择将要过期的键进行淘汰。 这种算法的实现方式比较简单,只需要在选择淘汰键时,从设置了过期时间的键中选择将要过期的键即可。它的优点是可以在保证数据热度的同时,避免长期不使用的过期键占用过多的内存空间。 七、Redis内存淘汰机制配置 Redis内存淘汰机制可以通过配置文件进行设置。在Redis的配置文件redis.conf中,可以设置maxmemory和maxmemory-policy两个参数。 maxmemory参数用于设置Redis使用的最大内存大小。当Redis使用的内存超过这个值时,就会触发内存淘汰机制。 maxmemory-policy参数用于设置Redis内存淘汰机制策略。它可以设置为noeviction、allkeys-lruvolatile-lru、allkeys-random、volatile-random和volatile-ttl中的任何一个值。 例如,以下是Redis配置文件中的maxmemory和maxmemory-policy参数设置: ``` maxmemory 1gb maxmemory-policy allkeys-lru ``` 这表示Redis最大使用1GB的内存,当内存使用超过1GB时,会使用allkeys-lru策略进行内存淘汰。 八、总结 Redis内存淘汰机制通过实现一些内存淘汰算法,可以在内存使用超过预设阈值时,删除一些不常用的键值对,以释放内存空间。其中,Redis提供了多种内存淘汰机制,包括noeviction、allkeys-lruvolatile-lru、allkeys-random、volatile-random和volatile-ttl。不同的策略有不同的优点和缺点,应该根据实际需求进行选择。在配置Redis内存淘汰机制时,需要设置maxmemory和maxmemory-policy两个参数,以控制Redis的最大内存使用量和内存淘汰策略

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值