Redis的内存策略(未完成)

news2024/11/27 20:37:11

过期Key处理:

1)Redis之所以性能强大,最主要的原因就是基于内存来存储,然而单节点的Redis内存不宜设置的过大,否则会影响持久化或者是主从复制的性能,可以通过修改配置文件来设置redis的最大内存,通过maxmemory 1gb,但是当内存达到上限的时候,就无法存储更多数据了

2)在之前学习Redis缓存的时候,可以通过expire命令来给Redis的key设置TTL过期时间

3)可以发现,当key的ttl过期之后,再一次访问name的时候返回的是nul,说明这个key已经不存在了,对应的内存也就释放了,从而起到了内存回收的目的

4)Redis本身是一个典型的key-value键值对的内存存储的数据库,因此所有的key和value都是保存在之前学习过的Dict结构中,但是在database结构体中有两个Dict,一个是用来记录key-value,一个用来记录key-ttl;

 

在设置键的过期时间的同时,设置一个定时器,当键过期了,定时器马上把该键删除

定时删除对内存来说是友好的,因为它可以及时清理过期键,但对CPU是不友好的,如果过期键太多,删除操作会消耗过多的资源

在过期 key 比较多的情况下,删除过期 key 这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期 key 上,无疑会对服务器的响应时间和吞吐量造成影响

Redis采用的是 惰性删除 + 定期删除 的策略

一)惰性删除:顾名思义就是说并不是在TTL到期之后就立即删除,而是在访问一个Key的时候(增删改查),检查该Key的存活时间,如果过期了才执行删除;

当查询数据的时候,首先根据key查询对应的expires,检查是否过期,如果过期就返回null,并删除对应的数据和expires,如果不过期,就返回数据

假设给一个key设置了过期时间,但是永远不会访问这个key,那么这个key就永远也不会被删除,这样就会导致内存占用过多的状况

这种方式看似很完美,在访问的时候检查key的过期时间,不会占用太多的额外CPU资源但是如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源,并且删除的目标仅限于当前处理的 key不会在删除其他无关的过期 key 上花费任何 CPU 时间

二)周期删除:顾名思义就是设置一个定时任务,周期性的抽样部分过期的key,然后执行删除,执行周期有两种:

定期删除是定时删除和惰性删除的一个折中方案,每隔一段时间来删除过期键,可以根据实际场景自定义这个间隔时间,在CPU资源和内存资源上作出权衡

2.1)Redis初始化会设置一个定时任务serverCron(),按照server.hz(1s中最多执行1次)的频率来执行过期的key的清理,模式为slow,过期的key,早晚会被抽到,执行时间长,执行的频率比较低;

2.2)Redis初始化后的1ms去执行

2.3)serverCron的返回值是完成serverCron再隔多少毫秒之后执行此定时任务(100ms)

2.4)getLRUClock时钟是更新lruclock到当前时间,为后期的LRU和LFU做准备,并且接下来会调用atomicSet方法设置到server.lruclock里面,lruclock是redis内部维护的一个时钟,是以微秒为单位的,每隔一个周期会进行记录一次,每隔100ms会更新一次,每调用一次serverCron方法lruclock是不断的会发生变化的

2.5)开始执行数据库的数据清理,例如说过期的key的清理;

2.2)Redis的每一个事件循环前会调用beforeSleep()函数,执行过期的key清理,模式为FAST,执行频率比较高,执行的时间非常短,不超过1ms

1)redis服务一进行启动,先调用initserver()函数,完成各种各样的注册,创建ServerSocket以及eventpoll,将ServerSocket对应的fd挂到红黑树上面;

2)接下来会执行aemain来进行事件循环,开启一个事件循环,会不断的调用beforesleep,再来调用aeapipoll,相当于是epoll_wait,等待事件就绪,如果事件就绪了,就进行对应的Socket的读写,处理IO事件;

3)最后会调用serverCron()进行定时任务的清理,但是除了redis在初始化之后1ms调用serverCron之外,以后的serverCron执行完成之后都会返回一个1000/server.sz,返回的就是100ms,默认就是下一次aeApiPoll执行的时间,所以当while循环执行的时候程序会进行检查serverCron()执行的时间到了没有,如果时间到了才执行,确保每隔100ms执行一次,时间不到就不执行serverCron函数了,因为while循环速度非常快,如果在每一次循环中都去调用serverCron()函数,那么这个函数执行的频率就会非常高了,但是再beforeSleep模式中,Fast模式清理是随着循环而进行的,每一次执行while循环,都会执行fast回收;

4)因为fast执行的模式是非常快的,清理速度也是非常快的,一次执行的速度会控制在1ms以内,而slow模式可能执行一次可能是消耗几十毫秒,如果serverCron()每循环一次都要执行,每一次主线程执行while循环都需要卡顿几十毫秒,那么主线程执行性能将会非常低,所以slow模式并不是在每一次循环都执行,而是每隔100ms之后执行,避免主线程阻塞;

slow模式属于是低频,长时间的清理,清理效果会更好一点,可以清理更多的Key

fast模式属于高频,少量清理,耗时时间非常的短,最长不超过1ms

但是他们都是为了在不阻塞主线程的情况下,尽可能过多的清理过期的key

slow模式规则:低频高时长的执行

1)执行频率受server.hz影响,默认是10,即每一秒执行10次,每一个执行周期是100ms

2)执行清理key的耗时不超过一次执行周期的25%;

3)逐个遍历db,逐个遍历db中的bucket,抽取20个key查看他们是否过期,直到把所有的buket都遍历到,如果发现过期的key就直接干掉;

4)如果没有达到时间上线25ms况且过期key的比例超过10%,那么再次进行一次抽样,否则结束;

fast模式规则:过期key的比例小于10%不执行,高频低时长

1)执行频率受beforesleep()函数调用的影响,但是两次fast模式执行的间隔不应该低于2ms,fast模式每一次执行前都会判断上一次fast到现在的时间,如果不足2ms就会跳过;

2)执行清理的耗时不超过1ms

3)遍历整个db,逐个遍历db中的bucket,抽取20个key判断是否过期

4)如果没有达到时间上限1ms,况且过期key的比例超过10%,那么在进行一次抽样否则结束

Redis 中,flushall 和 flushdb 都是清空当前数据库的操作,但是两者有很大的区别:

1)flushall 清空数据库并执行持久化操作,也就是 rdb 文件会发生改变,变成 76 个字节大小(初始状态下为 76 字节),所以执行 flushall 之后数据库真正意义上清空了
2)flushdb 清空数据库,但是不执行持久化操作,也就是说 rdb 文件不发生改变。而 Redis 的数据是从 rdb 快照文件中读取加载到内存的,所以在 flushdb 之后,如果想恢复数据库,则可以直接 kill 掉 redis-server 进程,然后重新启动服务,如此 Redis 重新读取 rdb 文件,数据恢复到 flushdb 操作之前的状态;
3)注意:要直接 kill 掉 redis-server 服务,因为 shutdown 操作会触发持久化,lsof -i:6379命令查看 redis-server 的进程号,然后 kill 即可

redis的内存淘汰策略:

redis的过期策略可以将redis中一些过期的key直接删除,但是在一些庞大的项目中,因为数据量非常的多,请求不断地向redis中进行存储数据,很有可能仅仅淘汰过期的key也很难满足内存的使用,此时内存也有可能达到上限;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么数字化转型就应该选择低代码?一文详解

数字化转型在这几年被反复提及,我们听得耳朵都快起茧子了。数字化在当前经济社会发展中扮演着越来越重要的角色,可以帮助企业更好地理解消费者和市场需求,更好地应对市场竞争,同时也可以提高企业效率,促进经济发展。 究…

WICC · 出海嘉年华倒计时!精彩不容错过,「指南」一手掌握

6.2 广州 WICC出海嘉年华 精彩不容错过 指南一手掌握 -高端峰会 圆桌会议- 超 有 料 话题剧透 如何在巨头林立的热门赛道成功突围? 如何在迅猛发展的新兴市场深挖价值? 如何在复杂合规政策下实现应用增长? 如何利用好底层技术优化本地化…

pip安装库提示Read timed out更换下载源

在使用pip install xx安装库的时候提示 Read timed out. 一般解决方案就两种: 1.延长timeout时间,治标不治本,谁知道到底该延长多少时间才能百分百每次安装都成功。 使用方式: pip --default-timeout1000 install 需要安装的库…

强化学习笔记-07 n-step Bootstrapping 多步TD时分学习

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考。 上一节介绍了TD算法,其采用了Bootstrapping方法,当前过去的预估以及即期收益来更新累积收益函数: 前…

通过期待已久的帕丽斯·希尔顿人物化身系列,成为元宇宙的偶像

5,555 个以帕丽斯希尔顿为主题的独特人物化身将于 5 月 31 日推出,每个人物化身均可在 The Sandbox 中使用。 我们与帕丽斯希尔顿及全球流行文化中心的下一代娱乐公司 11:11 Media 合作,很高兴宣布帕丽斯希尔顿的人物化身系列即将推出! 作为对…

Word导出PDF时图片质量下降问题的解决方法

Word导出PDF时图片质量下降问题的解决方法 ⭐️ 最近,在使用Word写完论文以后,另存为“PDF”文件时,发现文档中的图像质量明显下降。本文介绍的方法可以将Word保存为图片无压缩的带有标签的高质量PDF文件,建议仅在定稿时进行以下…

2023系统分析师下午案例分析真题

真题1 阅读以下关于软件系统分析与建模的叙述,在纸上回答问题1至3. 说明: 某软件公司拟开发一套汽车租赁系统,科学安全和方便的管理租赁公司的各项业务,提高公司效率,提升利率。注册用户在使用系统镜像车辆预约时需执行以下操作: (a) 用户登录系统 (b) 查询车辆信息 (c) …

业务安全情报第16期 | 大促8成优惠券竟被“羊毛党”抢走!?

目录 八成秒杀账户是羊毛党 羊毛党风险分析 安全防护及产品组合建议 近期,某电商小程序举办美食节营销活动,提供高额折扣券,并允许用户进行秒杀。然而,羊毛党团伙利用作弊手段,抢购囤券,然后倒卖变现&am…

释放 AI 的力量|2023 年 8 款最佳 AI 图像生成器

1973 年,Harold Cohen 设计的 AARON 系统创造了第一件人工智能生成的艺术品。黑白涂鸦远非所谓的美术,但它们为 DALLE-2 和 Midjourney 等一些出色的 AI 图像生成器奠定了基础。 在过去的 50 年里,AI 图像生成器变得更加智能。通过分析和学习…

线程的概念

文章目录 1. Linux线程概念1.1 什么是线程 2. 页表3. 线程的优点4. 线程的缺点5. 线程用途6.进程和线程7. 线程异常 1. Linux线程概念 1.1 什么是线程 线程是CPU调度的基本单位,它是在进程内部运行的执行流,线程比进程粒度更细,调度成本更低…

(2022,实体迁移)GAN 的通用 one-shot 域自适应

Generalized One-shot Domain Adaptation of Generative Adversarial Networks 公众号:EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 基础 4. 方法 4.1 总览 4.2 风格固定与范例重建 4.3 内部分布学习(Internal distribution learning&#xff0…

计算机硬件(1)

1.4 计算机硬件 电脑硬件是计算机系统中最基本的部分,可理解成看得见、摸得着的实物。一台电脑是由许多的零部件组成,只有这些零部件组合在一起协调工作,才能称之为电脑。一般计算机的硬件可以简单分为以下部件: 主机&#xff08…

sql比赛复习

systemctl start mysqld create database if not exit; 导入数据 编码、分割符号 alter更 http://172.19.100.21:9000/#!/auth 导入数据 简单插叙 创建视图 disti

嵌入式保温箱温湿度监测解决方案

无论是生鲜还是水果,在运输过程中都要保持恒温以保食材新鲜,这不仅需要强大的冷链运输车来实现,还需要搭配冷链保温箱。 传统的冷链是通过保温箱蓄冷剂,使用快递进行配送。由于市面保温箱功能不一,不同货品又对温度及保…

使用HbuilderX3.8.3_把开发的小程序发布为Html5页面上传到_免费托管空间---uniapp_小程序开发工作笔记009

首先使用hbuider开发完程序,然后,再去,点击发型,然后选择 上传网站到服务器,然后选择 选择新建,然后点击 新建以后然后这里点击新建服务空间,然后再去 这里选择免费服务空间,然后 然后点击立即购买,然后 点

基于AT89C52单片机的简易电子琴设计与仿真

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853299?spm1001.2014.3001.5503 源码获取 主要内容: 本设计是基于51系列的单片机进行的设计,利用所给键盘的八个键,能够发出…

基于单片机的红外光控灯系统

摘要 随着时代的飞逝,人们对更加先进、更加环保、更加节约资源、更加可持续地满足自身需要,高科技的运用正变成当今时代发展的动力,其对电子行业有着重要影响。近年来,智能化技术被广泛运用到各种家庭设备上,如智能洗衣…

如何分析OOM文件

一、下载dump文件。 需联系运维同事获取dump文件。dump文件的生成,需在jvm启动时通过添加启动参数:-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath。因此直接到设置的目录文件下下载下来即可。后缀名一般为hprof。有些为dump后缀,改为hpro…

国际儿童节

节日由来 国际儿童节儿童作品画(11张) 国际儿童节的设立,和发生在二战期间一次屠杀——利迪策惨案有关。1942年6月10日,德国法西斯枪杀了捷克利迪策村16岁以上的男性公民140余人和全部婴儿,并把妇女和90名儿童押往集中营。村里的房舍、建筑物…

MySQL中字符串查询效率大比拼

背景 最近有个同事对字符串加索引,加完后,发现多了个奇奇怪怪的数字 执行的SQL如下: alter table string_index_test add index idx_name (name) USING BTREE;这个奇怪数字就是191,它很是疑惑,也没指定索引的长度 通…