首页 > 数据库 >深入理解redis删除策略和淘汰策略

深入理解redis删除策略和淘汰策略

时间:2024-09-16 09:53:28浏览次数:3  
标签:策略 删除 过期 redis 内存 key 数据 CPU

1、redis的删除策略

Redis 是一种内存级数据库,数据都存在内存中,但是针对于已经过期的数据,reids 不 会立刻删除只是会存储在 expires 中,当执行删除策略的时候,才会从 expires 中寻找对应的数据存储的地址,在存储空间中找到对应的数据进行删除。数据删除其实就是内存和 CPU 占用之间寻找平衡,CPU 才能去处理事情,针对过期数据,要进行删除的时候,一般有三种策略 

深入理解redis删除策略和淘汰策略_数据库


2、三种删除策略


 (1)、定时删除

顾名思义,给Key设置一个时间,时间到了,定时器任务立即执行删除,相当于消 耗 CPU 来减少内存使用,拿时间换空间。

优点:节约内存,到时就删除,快速释放掉不必要的内存占用 缺点:CPU 压力大,无论 CPU 此时负载量多高,都会去占用 CPU 进行 key 的删除 操作,会影响 Redis 服务器响应时间和吞吐量,是一种比较低效的方式 结论:用 CPU 性能换取内存空间,时间换空间


(2)、惰性删除 

就是说,数据到达过期时间的时候,先不做处理,等到下次访问数据的时候,进行访问, 如未过期,返回数据,如过期,则删除。这就相当于节约了 CPU 但占用了内存,拿空间换 时间。

优点:不占用 CPU 节约 CPU 性能,只在获取访问 key 的时候才判断是否过期,过期 则删除,只会删除当前获取的这一个 key,其他的 key 还是保持原样

缺点:内存占用大,如果一直没有获取它,那么数据就会长期占用内存空间,当有大量 的 key 没有被使用到,也造成了大量内存浪费,对内存数据库来说,也不太友好 结论:空间换时间


(3)、定期删除 

前面说的两种方案 1.时间换空间,2.空间换时间都是两个极端方法,为避免前面方案带 来的问题,Redis 引入了定期删除策略(是他们的一个比较折中的方案)周期性轮询 Redis 库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除频度。在 Redis 服务器初始化时,读取 server.hz 的值,默认值为 10。定时轮询服务器,每秒钟执行 server.hz 次 serverCron() 函数。databaseCron() 在后台轮询处理 16 个 redis 数据库的操作,如这里的过期key 的处理activeExpireCycle(),对每个数据库的 expire 空间进行检测,每次执行250ms/server.hz 随机选取一批 expire 空间的 key(redis 有 16 个数据库,从 0 号数据库开始—15号数据库) 删除这批 key 中已过期的。如果这批 key 中已过期的占比超过 25%,那么再重复执行步骤一。(循环到小于 25%结束当前数据库的删除)如果这批 key 中已过期的占比 ≤ 25%,检测下一个数据库的 expire 空间(current_db++) 用 info 命令查看相关配置参数

深入理解redis删除策略和淘汰策略_数据库_02

 每秒钟执行 hz 次 serverCron(),对服务器进行定时轮询


3、三种策略对比 

1:定时删除: 节约内存,无占用, 不分时段占用 CPU 资源, 频度高,拿时间换空间 

2:惰性删除: 内存占用严重 延时执行, CPU 利用率高拿空间换时间

3:定期删除: 内存定期随机清理 每秒花费固定的 CPU 资源维护内存 随机抽查,重点抽查


4、淘汰/逐出策略 

在 Redis 中经常会进行数据的增删查改操作,那么如果在添加数据的时候遇到了内存不足,该怎么办?在前面用的删除策略可以避免出现这种情况吗? 实际上,在前面所说的删除策略,它针对的是 expire 命令进行的操作,也就是说那些具有时效性的数据(已经过期,并且还在占用内存的数据) 针对那些并没有过期,或者是内存中的数据没有一个带有有效期,全是永久性数据,这时候删除策略就不起作用了,所以这个时候内存满了我们再去插入数据到内存是怎么做?那就需要用到淘汰策略了。

redis 执行命令之前,都会用 freeMemoryIfNeeded()方法,检测这次内存是否充足,如果不满足加入新数据,则会执行淘汰策略(淘汰未过期的数据)

深入理解redis删除策略和淘汰策略_数据库_03


(1)、淘汰策略分类

检测带有时效性的数据进行淘汰(一般是有定时,会过期的数据的)

volatile-lru:挑选最近最少使用的数据淘汰

volatile-lfu:挑选最近使用次数最少的数据淘汰

volatile-ttl:挑选将要过期的数据淘汰

volatile-random:任意选择数据淘汰

检测全库的数据进行淘汰

allkeys-lru:挑选最近最少使用的数据淘汰

allkeLyRs-lfu:挑选最近使用次数最少的数据淘汰

allkeys-random:任意选择数据淘汰,相当于随机

标签:策略,删除,过期,redis,内存,key,数据,CPU
From: https://blog.51cto.com/u_14585161/12030091

相关文章

  • 深入理解Redis锁与Backoff重试机制在Go中的实现
    目录Redis锁的深入实现Backoff重试策略的深入探讨结合Redis锁与Backoff策略的高级应用具体实现结论在构建分布式系统时,确保数据的一致性和操作的原子性是至关重要的。Redis锁作为一种高效且广泛使用的分布式锁机制,能够帮助我们在多进程或分布式环境中同步访问共享资源。本文将深......
  • 02策略模式
    1.案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费**-正常原价收费-八折收费-满300返1002.策略模式结构-抽象策略类(Stategy):声明算法的方法,抽象层的设计使上下文类可以无差别的调用不同的具体策略的方法enumCashType{NORMAL=0,RE......
  • redis主从环境搭建
    准备系统环境:Linuxubuntu4.15.0-62-generic下载redis-6.2.4.tar.gz(官网下载即可)解压编译redistar-xvfredis-6.2.4.tar.gzcdredis-6.2.4make环境准备三个redis服务,一主二从(安装在本地所以用127.0.0.1,此版本从服务器用replica):127.0.0.1:6379master127.......
  • 编程日记 后端使用redis
    编程日记后端使用redis问题:在写伙伴匹配系统的时候,要使用redis存储数据,需要在xml文件中设置spring.session.tore-type=redis但是3.x版本的spring不再有这个参数。那么怎么设置是否使用redis存储呢?只要导入了org.springframework.session包那就启用,不导入就不启用https://www.......
  • 【webpack4系列】webpack构建速度和体积优化策略(五)
    目录速度分析:使用speed-measure-webpack-plugin体积分析:使用webpack-bundle-analyzer使用高版本的webpack和Node.js多进程/多实例构建资源并行解析可选方案使用HappyPack解析资源使用thread-loader解析资源多进程并行压缩代码方法一:使用parallel-uglify-plugin插件方法......
  • 一张图精通多种搜索算法的选择策略(经验篇)
    在探索数据的海洋中,搜索算法是指引我们找到目标的灯塔。从简单的线性搜索到高效的二分搜索,再到深度优先与广度优先的图搜索,每种算法都以其独特的方式优化着搜索过程。无论是在数组、树结构还是散列表中,正确的搜索算法能显著提升查找效率。本文将带你一探线性搜索、二分搜索、深度优......
  • 一、redis简介
    redis是当今使用最广泛的分布式缓存。官网是:https://redis.io/。还有其他的缓存中间件,比如memcache,GuavaCache等。那么redis的优势在哪呢?redis是内存数据库,数据主要在内存中。redis可通过持久化策略将数据保存到文件中。redis有丰富的数据类型:string,最常用的类型list,可......
  • Redis 管道技术
    概述Redis是基于请求/响应协议的TCP服务。在客户端向服务器发送一个查询请求后,需要监听Socket的返回结果,该监听过程一直阻塞,直到服务器有结果返回。如果一次请求延迟20ms,则多次请求的网络延迟会不断累加。也就是说,Redis的性能瓶颈主要体现在网络延迟上Redis的管道技术指......
  • AbortPolicy(默认策略)
    1.AbortPolicy(默认策略)特点:当任务无法被线程池执行时,会抛出一个RejectedExecutionException异常。使用场景:适用于对任务丢失敏感的场景,当线程池无法接受新任务时,希望立即知道并处理该异常。示例代码:importjava.util.concurrent.*;publicclassAbortPolicyDemo{  publicsta......
  • 微信聊天记录删除了如何恢复
    网上很多关于恢复微信聊天记录教程,大部分都是复制粘贴,很多免费的方法,如在微信搜索输入:recovery,或者把聊天记录同步到电脑端等,这些方法只能是修复聊天记录和备份聊天记录,对恢复聊天记录没有任何帮助。还有很多通过手机安装APP来恢复聊天记录的,这些基本上也不可能,根据数据恢复原理......