搜索
首页数据库RedisRedis删除策略和逐出策略

Redis删除策略和逐出策略

Aug 28, 2020 pm 05:19 PM
redis

本文知识点 过期数据概念 数据删除策略 逐出算法

前言

咔咔整理了一个路线图,打造一份面试宝典,准备按照这样的路线图进行编写文章,后期发现没有补充到的知识点在进行添加。也期待各位伙伴一起来帮助补充一下。评论区见哦!

在这里插入图片描述
在这里插入图片描述

过期数据

先来看三个key值,分别为sex、name、age。

这三个值设置的指令为 set name kaka setex age 100 24 setex sex 10 1

在这里插入图片描述在redis中我们可以使用ttl来获取某个key的状态,下面我们来使用ttl分别获取一下上边name、age、sex的状态

可以看到出来了三个值,分别为 -1  775   -2

那么这三个值给出的信息是什么呢!

  • -1 表示永久有效的数据
  • 775 这个值是设置在age上,使用的指令为setex age 1000 24,表示为剩余有效时间
  • -2 表示已经过期的数据,或者是被删除的数据,或者说是么有定义的数据在这里插入图片描述

过期数据的存储结构

  • 当我们设置一个带有时效性的name时,redis存储的是一个内存地址0x10101
  • 然后redis会再开辟一个空间用来存储带有时效性的key
  • 但是存储方式是key对应的内存地址  和  过期时间在这里插入图片描述那么今天我们所说的redis删除策略,就是删除的这部分数据。

定时删除

定时删除就是写一个定时器,然后当key的时间过期后,定时器任务立即对过期的key进行删除

优点:可想而知key到期就删,肯定对内存时最友好的,节约内存

缺点:redis单线程的特性是所有的命令都在按照一定的顺序进行执行。key值到期就删cpu的压力就会变大,会直接影响到redis服务器响应时间和IO

定时删除就是用时间来换取空间

当执行完定时删除后,key值对应的数据会被删除,同时在过期的内存区里边也会直接删除。在这里插入图片描述

惰性删除

在来看这个图当key值过期后不会直接删除,那是什么时候删除呢!继续往下看在这里插入图片描述

当我们使用惰性删除时,数据到期了也不会自动删除,那么他的删除方式是,在下一次在获取这个key值时,会做一个判断,判断这个key是否过期,如果过期了在执行删除。

也就是说当再次执行get name时  会走一个函数expirelfNeeded()  这个函数就是判断此key是否过期的。过期的返回nil,然后从内存在进行删除

在这里插入图片描述优点:会减少一定的CPU性能,只有到必须要删的时候才会删除

缺点:那肯定就是内存压力大了,例如一些热点新闻,热点过了就基本没人访问了,没有人访问这个key就一直存在,就会出现长期占用一定的内存空间

也就说这种方式是用空间换时间

定期删除

在上文中我们提及了俩种删除方式,一种是定时删除,一种是惰性删除。一个是用空间换时间。一个是用时间换空间。俩种方案都是比较极端的方式。那么接下来我们在来看看定期删除的实现方案。

先来看一下redis的存储空间,一共有默认为16个,在redis.conf里边有一个配置参数database这个参数控制的。每个数据库都有自己的过期分区,里边存储就是数据地址  和  数据过期时间。

在这里插入图片描述实现方式

redis在启动时,会取读取server下的hz的值,默认为10。这个值直接在终端使用info server就可以查看的到

在这里插入图片描述然后会每秒钟执行server下hz次  进行serverCron()轮询

继续使用databasesCron对redis的16个库进行挨个访问信息

访问时候会再执行activeExpireCycel对每个expires[*]逐一进行检测,每个执行的时间为250ms / server hz这个参数

在对每个expirs[*]逐一检测时,会随机拿出ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC个可以进行检测

  • 如果key超时,直接删除key
  • 一轮中删除的key数量>ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC*25%继续循环该过程
  • 如果一轮中删除的key数量<=ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC25% ,检查下一个expires[]

那么现在问题来了,我们的250ms / hz这个时间执行完了,但是把expires的16个数据库没有循环完怎么办呢!  下次来在循环那个库呢!  其实这个值是有存的,就是current_db这个值。这个值会记录activeExpireCycel 下次进入那个expires[*]执行在这里插入图片描述特点1:CPU使用没有高峰值,检测频率自定义设置

特点2:内存压力不会很大, 长时间占用的内存会被持续的清理

逐出算法

在上文中我们说了三种删除策略,但是这三种策略都是相对于设置了有效期的key才会有效。

那现在我们的redis使用的内存不足了,就会使用逐出策略来保证redis的正常使用。

redis在每次执行命令前会调用freeMemorylfNeeded()检测内存是否充足,当不充足时就会清理一些key,这种清除数据的策略称为逐出策略。

redis最大可使用内存的参数为:maxmemory  默认为0   指的是占用物理内存的比例   一般设置50%就可以了

每次选取待删除key的个数:maxmemory-samples

删除策略:maxmemory-policy

「下面我们来着重说明删除策略」

  • 检测易失数据(也就是我们设置了有效期,但是还没有到期的数据,就是上文expires[*])
    • volatile-lru:挑选最近少使用的数据
    • volatile-lfu:挑选最近使用次数最少的数据
    • volatile-ttl:挑选将要淘汰的数据
    • volatile-random:随机选择

接下来看一幅图

  • 9s就是现在的时间

  • 距离9s最长的一个key就是age

  • 使用次数最少的就是gender这个key

  • 如果按照volatile-lru就会把age删除掉

  • 如果按照volatile-lfu就会把gender删除掉在这里插入图片描述

  • 检测全部数据

    • allkeys-lru:挑选最近少使用的数据
    • allkeys-lfu:挑选最近使用次数最少的数据
    • allkeys-random:全库随机删除
  • 放弃数据驱逐

    • no-enviction  : 数据不会进行任何的删除,直到内存用完,引发oom错误。

总结

以上就是redis对数据的删除策略和逐出策略。

这里就一个注意点就是在逐出策略中,易失数据指的是设置了过期时间的key,并非永久性的值。

全库是指的全部的值,设置了过期时间和永久数据。

坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我们下期再见。

推荐:《redis教程

以上是Redis删除策略和逐出策略的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
redis高可用什么意思redis高可用什么意思Apr 10, 2025 pm 04:33 PM

Redis 高可用性是指 Redis 集群能在故障或中断时仍能提供服务,保证数据完整和可用。实现 Redis 高可用性的方法有:主从复制:创建多个 Redis 从节点,由主节点负责写入和复制数据。哨兵:监控 Redis 主从节点健康状态,当主节点故障时,自动将从节点提升为主节点。Redis 集群:分布式架构,将数据分片存储在多个 Redis 节点上。当主节点故障时,从节点会自动接管主节点的角色。高可用性 Redis 集群的好处包括:服务不中断、数据完整性、扩展性、灾难恢复。

redis过期时间什么意思redis过期时间什么意思Apr 10, 2025 pm 04:30 PM

Redis过期时间允许为键设置一个持续时间,在该时间之后键及其值将被删除。(1)通过EXPIRE或PEXPIRE命令设置过期时间。(2)过期时间有助于释放存储空间、避免数据过时以及管理队列。(3)可以使用TTL命令获取过期时间,PERSIST命令取消过期时间。

怎样查看redis日志怎样查看redis日志Apr 10, 2025 pm 04:27 PM

Redis 日志文件通常位于/var/log/redis/redis-server.log或/<redis 安装目录>\redis.log。您可以使用命令行工具(如 tail -f redis-server.log)查看日志。默认日志级别为 "verbose",可通过修改 redis.conf 配置文件进行更改。Redis 也支持日志分离,允许将日志记录到多个文件中。

redis怎样连接redisclientredis怎样连接redisclientApr 10, 2025 pm 04:24 PM

RedisClient 连接 Redis 数据库有三种方式:使用 RedisClient 类直接连接、使用连接字符串连接和使用连接池连接。

redis集群怎样重启redis集群怎样重启Apr 10, 2025 pm 04:21 PM

要重启 Redis 集群,可以采用滚动重启的方式:关闭所有从节点关闭主节点重新启动主节点逐个启动从节点检查集群状态

redis缓存击穿怎么解决redis缓存击穿怎么解决Apr 10, 2025 pm 04:18 PM

Redis缓存击穿的解决方案:加互斥锁:在查询数据库之前获取分布式锁,防止并发查询。异步更新缓存:将缓存更新操作放入队列中异步执行,避免并发更新。热点数据永不过期:设置热点数据较长的过期时间或永不过期,防止缓存击穿。限流:控制访问数据库的请求数量,防止并发访问导致数据库压力过大。使用布隆过滤器:快速判断值是否存在,存在则返回缓存数据,不存在则查询数据库。

redis怎么快速删除keyredis怎么快速删除keyApr 10, 2025 pm 04:15 PM

Redis 提供多种快速删除 Key 的方法:使用 DEL 命令删除单个 Key。使用 UNLINK 命令删除多个 Key。使用 KEYS 命令和 EVAL 命令根据模式删除 Key。使用 Lua 脚本提高删除大量 Key 的性能。使用 Redis Streams 根据时间删除数据。

如何查看 Redis 服务器版本如何查看 Redis 服务器版本Apr 10, 2025 pm 04:12 PM

Redis 版本查看方法:1. INFO 命令:redis-cli INFO;2. CONFIG GET 命令:redis-cli CONFIG GET redis_version;3. 服务器响应:redis-cli -h localhost -p 6379 -v。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用