当前位置: 首页 > 科技观察

Redis5.0数据淘汰策略详解

时间:2023-03-19 21:01:46 科技观察

作为内存数据库,Redis在内存空间不足的时候会选择一定的数据淘汰策略来保证命中率。本文主要讲解几种常见的内存消除策略。类似于我们操作系统中的页面置换算法。1、参数设置我们的redis数据库的最大缓存、主键失效、淘汰机制等参数都是通过配置文件来配置的。这个文件就是我们的redis.config文件。我们的redis安装在/usr/local/redis目录下,所以配置文件也在这里。首先说明一下,我用的redis是5的,也是最新的版本。1.最大内存参数的关键配置在最下面,我们可以设置多少字节。默认关闭。2.内存淘汰策略与之前版本不同。Redis5.0为我们提供了八种不同的内存替换策略。很久以前提供了6种类型。(1)volatile-lru:从设置过期时间的数据集中选择最近最少使用的数据进行淘汰。(2)volatile-ttl:从设置过期时间的数据集中选择将要过期的数据进行淘汰。(3)volatile-random:从设置过期时间的数据集中随机选择数据淘汰。(4)volatile-lfu:从设置过期时间的数据集中选择使用频率最低的数据淘汰。(5)allkeys-lru:从数据集中选择最近最少使用的数据进行淘汰(6)allkeys-lfu:从数据集中选择最近最少使用的数据进行淘汰。(7)allkeys-random:从数据集(server.db[i].dict)中随机选择数据淘汰(8)no-enviction(驱逐):禁止数据淘汰,也是默认策略。意思是当内存不足以容纳新的数据时,新的写操作会报错,请求可以继续,在线任务不能继续。no-enviction策略可以保证数据不会丢失。这八种大致可以分为4种,lru、lfu、random、ttl。二、淘汰机制的实现1、由于删除无效主键是淘汰,所以需要删除数据,保存新的数据。Redis删除无效主键的方法主要有两种:(1)被动方式,如果访问时发现主键无效,则将其删除。Redis在执行GET、MGET、HGET、LRANGE等与读取数据相关的命令时,会调用expireIfNeeded。它存在的意义是在读取数据前检查是否无效,无效则删除。expireIfNeeded函数中调用的另一个函数propagateExpire,用于正式删除过期的主键,广播告诉其他地方有两个目的地:AOF文件,将删除过期的主键,标准命令格式为DELKey.向下;另一种是发送给当前Redis服务器的所有Slave,删除无效主键的操作也会以DELKey的标准命令格式通知这些Slave删除各自的无效主键。(2)主动方式是定期检测,检测失败则删除。negative方法的缺点是如果key长时间不访问会占用大量内存空间,所以有了positive方法。(3)主动删除:当内存超过maxmemory的限制时,触发主动清理策略。该策略由启动参数的配置决定。主键的具体过期时间都在expires字典表中维护:2.既然淘汰数据量是淘汰数据,那么淘汰多少合适呢?为了避免频繁触发淘汰策略,每次都会淘汰一批数据。淘汰数据的大小实际上是由替换的大小决定的。如果被替换的数据量很大,就会被淘汰。也很多。3.替换策略是如何工作的了解替换策略是如何执行的非常重要,例如:(1)客户端执行一条新命令,导致数据库添加数据(如设置键值)(2)Redis会检查内存使用情况,如果内存使用量超过了maxmemory,就会根据替换策略删除一些key。(3)新命令执行成功。OK,redis数据淘汰策略先到这里,版本用的是最新的5。可能和3不一样。