当前位置:首页 > 内存 > 正文

redia内存淘汰机制

  • 内存
  • 2024-09-04 03:59:53
  • 806

一、redis的过期策略以及内存淘汰机制是什么?Redis内存弹出策略有很多选项,从“不弹出”到“LRU”、“LFU”、“易失性-lru”、“易失性-lfu”、“易失性-ttl”、“易失性-随机”、“allkeys”“-lru”、“allkeys-lfu”和“allkeys-random”其中noeviction策略是指当Redis内存满时,除了del、hdel和unlink操作之外,其他写操作将停止,读操作可以继续。其他策略包括驱逐Redis中的锁来控制每个用户请求触发的内存使用情况。最近使用的)算法侧重于“最近访问频率”,通过近似实现来减少内存消耗和性能影响,该实现包括暴露LRU时钟值来记录数据访问次数,随机选择一批数据进行比较。与要丢弃的数据组一起,丢弃空闲时间最长的数据,并由于Redis的惰性而同步或异步执行删除操作。删除配置。如果释放的内存不满足要求,则重复淘汰过程,直到满足条件。
选择Redis内存弹出策略很大程度上取决于应用场景的需求,比如对实时性能的敏感度、数据访问的频率等。合适的内存管理策略可以有效提高系统性能和稳定性。了解这些策略的实施和影响对于提高Redis应用程序的性能至关重要。
在技术面试中,能够详细解释这些内存消除策略的原理和应用,不仅能体现出对Redis的深刻理解,还能体现出综合解决问题的能力。因此,深入了解Redis内存管理机制对于开发者来说是非常有益的。
对于想要提高学习效率和面试准备的Java开发者,建议深入研究这些内存管理技术的实现细节,并应用到实践中,以提高技术能力和面试成绩。。同时,持续关注和学习Redis的最新特性和优化技术,有助于在技术领域不断进步。


二、Redis过期策略和回收策略它是一种被动策略,当客户端访问密钥时,它会检查返回密钥是否过期,如果过期则立即删除。
默认情况下,每秒返回扫描过期一百万次。
1.;
同时,为了保证演化不会陷入过多的过期周期和线程,算法还提高了伸缩时间的上限,不超过默认的25ms。
不会检查从库何时过期,从库会被动处理过期情况。当key过期时,主库会在AOF文件中添加一条del指令,并配置所有从库。从库会通过执行这个del命令来删除转义的key。
由于指令的同步是异步进行的,如果主库中的指令key与从库中的指令key没有及时匹配,就会导致主从库之间的数据不兼容。
返回过期策略为:定期删除+惰性删除。
所谓定期删除,是指默认情况下,随机选择一些key,每100吨时间到期时,检查它们是否过期,过期则删除。
假设返回有10万个key,并且设置了超时时间。如果你每隔几千秒寻找100,000个密钥,那么你的浏览器基本上就会死掉,CPU负载会很高,以至于你会用完密钥。请注意,所有按键不会每100毫秒就用完一次。事实上,它返回随机选择一些每100磅的键来检查和删除它们。
但是有可能发现很多key在经过的时间结束后还没有被删除,出现了定期删除的情况。于是就慢慢被毁掉了。这就是说,当你拿到key之后,如果有设定的时间段的话,你就返回检查一下key是否已经过期了?如果过期,本次将被删除,并且不会向您退款。
其实还是有问题的。如果常规删除漏掉了很多已完成的键,然后你没有及时检查它们,所以你不使用惰性删除,会发生什么。此时要做什么?如果内存中累积的key数量过多,导致返回一块内存被消耗,该怎么办?
答案是:采用内存消除机制。


三、缓存数据淘汰算法:LRU和LFULRU(最近最少使用)算法是一种常见的页面替换策略,选择最近最少使用的页面进行淘汰。例如,输入数据3后,3会被移动到队列的头部,添加新数据5后,尾部数据4被移动,形成新的队列5的头部;
LFU(最近使用)算法根据使用频率消除页面。输入数据2后,频率+1,添加数据5时更新时间,移除频率最小的节点,频率相同时移除时间最早的节点;
对比LRU和LFU,LRU剔除最近没有访问过的页面,LFU剔除访问量较少的页面。LRU的缺点是热数据可能会因为冷数据查询而被删除。
Redis提供了多种内存消除策略。根据LRU策略,最近没有访问过的数据会被移除,以将访问点数据保存在内存中,但在极端情况下,可能会导致大量访问相同数据的请求被移除,从而导致入口点被移除。性能瓶颈。根据LFU策略,去除很少使用的数据,更适合存储大量热点数据,避免由于频率相似而误删除接入点数据。
综上所述,当存在高并发、热点数据量较大时,建议使用Redis的LFU策略,科学合理地淘汰数据,保证系统稳定运行。当数据访问频率相同时,会根据访问时间淘汰数据,防止极端情况下误删除热点数据,必要时会采取保护措施,避免影响性能。


四、Redis数据丢失问题前段时间有朋友问我,为什么我们生产环境中的redis经常丢失一些数据?一旦写入,一段时间后它可能会消失。
天啊,你问这个问题,说明你对redis没啥用。Redis是一个缓存,你把它当成存储吧?
什么是缓存?使用内存作为缓存。内存有限制吗?相反,内存宝贵且有限,磁盘廉价且丰富。一台机器可能有几十GB的内存,但它可能有几TB的硬盘空间。Redis严重依赖内存来执行并发、高性能的读写操作。
由于内存有限,redis只能使用10G,如果往里面写入20G的数据你会怎么做?当然,10G的数据会被销毁,然后10G的数据会被保留。那么哪些数据应该被删除呢?保留哪些数据?当然,我们应该剔除不常用的数据,保留常用的数据。
所以这是缓存最基本的概念数据会过期。
例如:setkeyvalue过期时间(1小时)
设置的key在1小时后消失,失效
(1)设置过期时间
在设置锁的时候,我们可以给一个过期时间,比如过期时间就是过期时间。10分钟?这非常有帮助。我们可以指定缓存过期时就过期。
如果假设一批key只能维持1小时,那么redis如何在下一小时后删除这批key呢?
答案是:频繁删除+惰性删除
所谓频繁删除,是指redis默认情况下,每隔100ms随机选择一些key,设置过期时间,并检查如果它们已过期,如果过期则将其删除。
假设redis中有10万个key,并且设置了过期时间。如果你每几百毫秒检查100,000个键,那么Redis基本上就会死掉,CPU负载会非常高。在较高级别上,它将通过检查过期密钥来使用。
这里请注意,不要每100毫秒迭代一次过期时间的所有键,这将是性能灾难。实际上,redis每隔100毫秒随机选择一些key来检查并删除它们。
但问题是频繁删除会导致很多过期的key到了时间还没有被删除。于是就懒得删了。延迟删除是指当你收到一个key时,redis会检查这个key是否过期,是否设置了过期时间?如果过期,此时将被删除,并且不会向您返还任何内容。
所以并不是key超时就被删除而是当你查询key的时候redis会懒惰的检查它。
通过以上两种方法,保证过期的key会被销毁。
很简单,就是你的过期密钥没有被正常删除删除。它保留在内存中并占用您的内存,除非您的系统检查锁定,将其删除。通过redis。
但实际上,这仍然是一个问题。如果频繁删除错过了很多过期的键,然后你没有及时签入,所以不使用惰性删除,会发生什么情况?此时发生?如果内存中积累了大量过期key,导致Redis内存块耗尽怎么办?
答案是:使用内存弹出机制。
(2)逐出内存
如果redis占用内存过多,此时会进行逐出内存。有如下几种策略:
1)noeviction:当内存不足以容纳新写入的数据时,新的写入操作会报错。一般来说,没有人用这个,真是恶心
2)allkeys。-lru:当内存不足以容纳新写入的数据时,在键空间中,删除最近最少使用的键(这是最常用的键)
3)allkeys-random:当内存不足时不足以容纳新数据导入数据时,会从密钥空间中随机删除某个密钥。一般情况下没有人使用此密钥。为什么是随机的?/>
4)易失性-lru:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,删除最近最少使用的键(这通常不合适)
5)易失性-随机:当内存不足以容纳新写入的数据时,随机删除密钥空间中的一个密钥,并设置过期时间
6)易失性-ttl:当内存不足时足以容纳新写入的数据导入数据时,在设置了过期时间的键空间中,会先删除之前过期时间的键
例如:redis中有10个键,现在内存已满,设置的按键将被丢弃。策略是allkeys-lru和redis需要删除一些key来保证可以继续写入。这10个键中,1个键在最近1分钟被查询100次,1个键在最近10分钟被查询50次,1个键在最近1小时被查询1次。当然,最近最少使用的那些已经被杀死了。
为什么redis中存储的数据有时会丢失?
非常简单。您写入的数据过多、内存已满或触发了某些条件,例如redisallkeys-lru内存清除策略,它会自动为您最近的数据清理一些很少使用的数据。