首页 > 数据库 >Redis的内存回收原理,及内存过期淘汰策略详解

Redis的内存回收原理,及内存过期淘汰策略详解

时间:2023-12-03 18:11:49浏览次数:41  
标签:策略 过期 写入 Redis 详解 内存 key

Redis内存回收机制

Redis的内存回收主要围绕以下两个方面
1Redis过期策略:删除过期时间的key值
2Redis淘汰策略:内存使用到达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的机器,如果maxmemorv设置为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:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的kev优先移除

5.缓存清理的流程
1)客户端执行数据写入操作
2)redis server接收到写入操作之后,检查maxmemory的限制,如果超过了限制,那么就根据对应的policy清理掉部分数据
3)写入操作完成执行。
总结
redis内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,内存淘汰策略的选取并不会影响过期的key的外理。过期策略用于处理过期的缓存数据。

标签:策略,过期,写入,Redis,详解,内存,key
From: https://www.cnblogs.com/haoming-1/p/17873502.html

相关文章

  • JMeter基础 — JMeter中BeanShell断言详解
    JMeter中的BeanShell断言,可以使用BeanShell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用BeanShell语。1、BeanShell简介Beanshell是一种类似JAVA的脚本语言,通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。......
  • 【C语言】浮点数在内存中的存储
    常⻅的浮点数:3.14159、1E10等,浮点数家族包括:float、double、longdouble类型。 浮点数表⽰的范围:float.h中定义我们先通过一道题目来了解:#include<stdio.h>intmain(){intn=9;float*pFloat=(float*)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",......
  • CentOS中安装redis源码包
    下载地址#将redis压缩包上传到服务器/home/software,并解压tar-zxvfredis-6.0.6.tar.gz#安装gccyuminstallgcc-c++-y#查看版本gcc-v#进入解压目录#编译make#安装(默认安装到/usr/local/bin,不建议默认安装)#makeinstall#指定安装路径安装(......
  • redis哨兵
    妈耶,哨兵数=主从数。主从复制就三台了,六台我开不来。按尚硅谷的教程先把哨兵文件配在6379端口上的那台机器了哨兵文件中的<quorum>代表确认客观下线的最少的哨兵数量先启动哨兵redis-sentinel/export/database/myredis/sentinel.conf--sentinelps-ef|grepredisroot......
  • Django连接Redis
    1、安装redis库pipinstalldjango-redis2、配置django中的settings.py#redis配置CACHES={"default":{"BACKEND":"django_redis.cache.RedisCache","LOCATION":"redis://127.0.0.1:6379......
  • 极语言3-8绘制区类、快捷键类、系统信息类、版本信息类、进程信息类、内存信息类——
    中文名字英文名称长度作用解释绘制区类PAINTSTRUCT64包含用来绘制它所拥有的窗口客户区所需要的信息的结构体。绘制区类——成员表设备hdc整数用于绘制的句柄。擦除fErase整数如果为非零值则擦除背景,否则不擦除左边rcPaint.left整数要绘制矩形的左边位置顶部rcPaint.top整数要绘制......
  • 在Docker中安装Redis
    拉取Redis镜像:首先,你需要从DockerHub上拉取Redis的镜像。你可以使用以下命令来完成这个操作1:dockerpullredis:latest创建数据目录和配置文件:在你的宿主机上创建一个目录来存放Redis的配置文件和数据。你还需要为这个目录设置适当的权限1:mkdir-p/root/docker/redis/datamk......
  • Redis的持久化和复制
    今天,我们将探讨Redis的两个重要特性:持久化和复制。一、持久化:Redis提供了两种持久化方法,分别是RDB(RedisDataBase)和AOF(AppendOnlyFile)。RDB:此方法是通过创建数据快照来实现持久化。你可以设置Redis在特定的时间间隔内,将数据写入一个磁盘文件。例如,你可以设置Redis每60秒创建一个......
  • Windows 下安装和配置 Redis (图文教程)
    ......
  • 基于社区电商的Redis缓存架构-写多读多场景下的购物车缓存架构
    社区电商的购物车缓存架构在购物车中的功能主要有这几个:商品加入购物车、查看购物车列表、删除购物车商品、选中购物车商品进行结算这里购物车的场景和之前用户信息以及菜谱分享信息还不同,如果在举办了大型购物活动时,购物车可能需要面临写多读少或者写多读多的场景,面临高并发的读和......