您现在的位置是:首页 >技术杂谈 >Redis 内存管理机制网站首页技术杂谈

Redis 内存管理机制

PP_2022 2024-10-07 00:01:03
简介Redis 内存管理机制

Redis作为一个内存数据库,内存资源非常珍贵。因此,Redis引入了3种内存管理机制来释放不必要的内存,包括定期删除、惰性删除和内存淘汰机制。

定期删除

定期删除是Redis内存管理机制的一种,它用于删除过期的键值对。Redis每隔 100ms (可修改)时间就会随机选择一些键值对,将过期的键值对删除。而不是每次遍历所有的键值对,避免因为遍历所有的键值对并判断是否过期而消耗大量的性能。
定期删除可以通过设置过期时间(expire)来实现,但是存在一个问题:如果一个键值对很少被访问,即使它已经过期,也不会被删除,因为Redis使用随机算法选择一些键值对,并判断该键值对是否过期,而不会主动遍历这个键值对。

惰性删除

Redis还实现了一种基于惰性删除的内存回收机制,也就是说,当一个键值对过期之后,并不会立即从内存中删除。相反,Redis会等到下次访问这个键值对时,才会将其删除。这种惰性删除机制可以保证内存的高效利用,将一些过期的但是又没有被 Redis 遍历到的数据删除,避免因过期键值对带来的空间浪费,提高Redis的性能和效率。

内存淘汰机制

虽然 Redis 的内存管理机制很高效,但是当内存不足时,Redis 必须采取一些措施来决定哪些键值对需要被删除。这时就需要使用内存淘汰机制。Redis 提供了8种内存淘汰策略:

1. 全局淘汰:

        1)allkeys-lru:淘汰范围是所有 keys,淘汰最久未使用的 key

        2)allkeys-lfu:淘汰范围是所有 keys,淘汰使用频次最少的

        3)allkeys-random:淘汰范围:所有 keys,随机淘汰 key

2. 淘汰 expire :

        1)volatile-lru:淘汰范围:所有设置了 expire 时间的 keys,淘汰最久未使用的 key

        2)volatile-lfu:淘汰范围:所有设置了 expire 时间的 keys,淘汰使用频次最少的 key

        3)volatile-random:淘汰范围:所有设置了 expire 时间的 keys,随机淘汰 key

        4)volatile-ttl:淘汰范围:所有设置了 expire 时间的 keys,淘汰 ttl 剩余时间最少的 key

3. 不淘汰:

        1)noeviction:不淘汰,意味着达到限制时,将无法存储

需要注意的是,Redis的内存淘汰机制仅在内存不足时才会启动,因此在使用 Redis 时,应该保证足够的内存资源,以避免不必要的内存回收和性能损失。

总而言之,以上三种内存管理机制都是Redis内部为了更好地管理内存而实现的。它们可以让Redis更高效地利用内存,减少空间浪费,并提高性能。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。