Redis内存回收机制

Redis的内存回收主要围绕以下两个方面:

1.Redis过期策略:删除过期时间的key值

2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据

Redis的过期策略和内存淘汰策略不是一件事,实际研发中不要弄混淆了,下面会完整的介绍两者。

Redis过期策略

过期策略通常有以下三种:

1.定时过期

每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

2.惰性过期

只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

3.定期过期

每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

Redis中同时使用了惰性过期和定期过期两种过期策略。

Redis淘汰策略

1.简介

Redis的内存淘汰策略,是指当内存使用达到maxmemory极限时,需要使用LAU淘汰算法来决定清理掉哪些数据,以保证新数据的存入。

2、LRU算法

Redis默认情况下就是使用LRU策略算法。

LRU算法(least RecentlyUsed),最近最少使用算法,也就是说默认删除最近最少使用的键。

但是一定要注意一点!redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。

那么3这个数字也是可以可以设置采样的大小,如果设置为10,那么效果会更好,不过也会耗费更多的CPU资源。对应位置是配置文件中的maxmeory-samples。

3.缓存清理配置

maxmemory用来设置redis存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用LRU算法清理掉部分数据。

对于64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;,但是对于32 bit的机器,有一个隐式的闲置就是3GB

4.Redis数据淘汰策略

maxmemory-policy,可以设置内存达到最大闲置后,采取什么策略来处理。

对应的淘汰策略规则如下:

1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。

3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。

5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。


5.缓存清理的流程

1)客户端执行数据写入操作

2)redis server接收到写入操作之后,检查maxmemory的限制,如果超过了限制,那么就根据对应的policy清理掉部分数据

3)写入操作完成执行。

总结

redis的内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,内存淘汰策略的选取并不会影响过期的key的处理。过期策略用于处理过期的缓存数据。

你可能也喜欢:

  1. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
  2. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别
  3. Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解
  4. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解
  5. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解
  6. Redis系列教程(七):Redis并发竞争key的解决方案详解

Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解相关推荐

  1. Redis的内存回收机制和数据过期淘汰策略

    本文来说下Redis的内存回收机制和数据过期淘汰策略 文章目录 概述 为什么需要内存回收 过期删除策略 定时删除 惰性删除 定期删除 删除策略比对 过期删除策略原理 redisDb结构体定义 expi ...

  2. Redis的淘汰策略详解

    接上一篇Redis的过期策略详解 Redis的过期策略详解 所谓的淘汰策略就是: 我们redis中的数据都没有过期,但是内存有大小,所以我们得淘汰一些没有过期的数据!! 那么怎么去淘汰了,我们上一篇讲 ...

  3. 【REACT NATIVE 系列教程之四】刷新组件RENDER(重新渲染)的三种方式详解

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2242.html ...

  4. SpringBoot2.x系列教程(七十)Spring Boot Actuator集成及自定义Endpoint详解

    前言 曾经看到Spring Boot Actuator这个框架时,一直在想,它到底有什么作用呢?虽然知道它提供了很多端点,有助于应用程序的监控和管理,但如果没有直接的实践案例,还是很难有说服力的. 直 ...

  5. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  6. Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解

    在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务.分布式锁等.那具体什么是分布式锁,分布式锁应用在哪些业务场景.如何来实现分布式锁呢?今天来探讨分布式锁这个话题. ...

  7. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  8. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

    前一篇文章高并发架构系列:Redis为什么是单线程.及高并发快的3大原因详解谈了Redis高并发快的3个原因,本篇主要谈Redis的高可用,两篇合起来就可以把redis的高并发和高可用搞清楚了. 谈到 ...

  9. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

    Java相关的面试都会问到缓存的问题:史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等,除此之外还会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等不常见的问题,但却是非 ...

最新文章

  1. 打破认知:程序设计 #x3D; 算法 + 数据结构?
  2. smark和openfire即时通信代码
  3. Java数据库查询简介
  4. Gitlab搭建安装及使用中遇到的问题。
  5. ESFramework介绍之(14)-- AS与FS通信方案
  6. 日语学习-多邻国-平假名
  7. axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
  8. linux c取网卡名称,在Linux下用c编程肿么获取网卡序列号和硬盘序列号
  9. TCP/IP笔记 三.运输层(3)——TCP超时重传算法
  10. ubuntu安装配置ssmtp
  11. 通俗讲解比特币的原理及运作机制
  12. bing的翻译API 国际化
  13. 二合一笔记本电脑的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 工作用oracle18c还是11g,Oracle 18c体验
  15. python--step-01
  16. 图解 OSPF :什么是 LSA ?
  17. Python过去计算机用户名,Django:如何获取客户端计算机用户名视图.py
  18. 研究了下maphack,顺便做了个1.22版的
  19. React DDD 会是未来的趋势吗?
  20. 不学编程都能看懂的@Transactional()事务

热门文章

  1. 关于Linux内核代码不使用typedef的讨论?
  2. 在git上push代码时缺少Change-Id
  3. 【Pytorch神经网络理论篇】 24 神经网络中散度的应用:F散度+f-GAN的实现+互信息神经估计+GAN模型训练技巧
  4. 【Pytorch神经网络理论篇】 17 循环神经网络结构:概述+BP算法+BPTT算法
  5. 三、案例:留言板 url.parse()
  6. LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)
  7. LeetCode 325. 和等于 k 的最长子数组长度(哈希表记录第一次出现的状态)
  8. LeetCode 1150. 检查一个数是否在数组中占绝大多数(二分查找)
  9. LeetCode 1005. K 次取反后最大化的数组和
  10. A*搜索算法--游戏寻路