Redis-内存淘汰算法
Redis可以存多少数据
32位的操作系统默认3G
谁现在用32位啊?我们说64位的 一般来讲是不设上限的
但是我们也可以主动配置maxmemory, maxmemory支持各单位:
maxmemory 1024 (默认字节)
maxmemory 1024KB
maxmemory 1024MB
maxmemory 1204GB
当Redis存储超过这个配置值,则触发Redis内存淘汰。
实际上,每次进行读写的时候,都会去检查是否需要释放内存,如果需要则会触发。
那怎么淘汰呢
分两大类
第一类
noeviction,默认就是这种策略,此时如果内存达到maxmemory, 则写入操作会失败,但
不会淘汰已有数据。
第二类
多种淘汰策略,主要支持LRU, LFU, RANDOM, TTL这几个方式:
lru:根据LRU (Least recently used, 最近最少使用)算法尝试回收最长时间未使用的。
Ifu:根据LFU (Least Frequently Use) 驱逐最不常用的键,Ifu是在4.0引入的
random: 回收随机的键使得新添加的数据有空间存放。
ttl:回收在过期集合的键,并且优先回收存活时间(TTL) 较短的键,使得新添加的数据有空间存放。
这四种策略,可以选择时volatile, 也就是设置了过期时间的Key,或者是alkeys,即全部的Key,所以一共有8种淘汰方式。
LRU算法
最近最久未使用,即记录每个Key的最近访问时间,维护一一个访问时间的数据
如果为所有数据维护一个顺序列表,实际就是做一个双向链表,但是如果Redis数据稍微多些,这个链表就是巨大的成本,对于Redis而言,内存是最宝贵的,所以Redis选择了近似LRU算法。
近似的LRU算法
在LRU模式,redisObject对象 中Iru字段存储的是key被访问时Redis的时钟server.lruclock,当key被访问的时候,
Redis会更新这个key的redisObject的Iru字段。注意,Redis为了保证核心单线程服务性能,缓存了Unix操作系统时钟,默认每100毫秒更新一次,缓存的值是Unix时间戳取模2^24
近似LRU算法在现有数据结构的基础上采用随机采样的方式来淘汰元素,当内存不足时,就执行一次近似LRU算法。
具体步骤是随机采样n个key,这个采样个数默认为5,然后根据时间戳淘汰掉最旧的那个key,如果淘汰后内存还是不足,就继续随机采样来淘汰。
采样范围
采样范围是什么呢? Redis可以选择范围策略,有两种: 1.alkeys, 所有key中随机采样。2.volatile从有过期时间的key随机采样。分别对应alkeys-lru, volatitle-lru。
优化-淘汰池
Redis3.0对近似LRU算法进行了一些优化。
新算法会维护一个大小为16的候选池,池中的数据根据访问时间进行排序。第-次随机选取的key都会放入池中,
然后淘汰掉最久未访问的,比如第一次选了5个,淘汰了1个,剩下4个继续留在池子里。
随后每次随机选取的key只有活性比池子里活性最小的key还小时才会放入池中,当池子装满了,如果有新的key需要放入,则将池中活性最大的key移除。
有一个活性堆 最上面永远是活性最小的 如果比它还小才能加入堆 但是如果堆已经满了 那就要把最大的活性的弹出(既然我们要让结果贴合 淘汰最旧的 那就不会弹出活性最大的拉) 合理 里面只存最小活性的 然后每次要淘汰就淘汰活性最小的
原本的近似LRU算法 全局采样 然后从里面拿出一个活性最低的 来近似作为淘汰了全局活性最低的 这到底哪合理了
现在的算法比之前的贴近反正
LFU算法
LFU淘汰算法,即Least Frequently Used,最不频繁(断句)淘汰算法,顾名思义,优先淘汰活跃最低,使用频率最低的。
LRU是淘汰最久没使用的 我个人觉得LFU更合理 我肯定要淘汰最不常用的反正
如果使用LRU,那么redisObject中lru字段, 就是用来存储最近访问时间的,这个字段长度是LRU_ _BITS, 这个值一直都是24位。
如果是LFU,因为LRU、LFU是不会同时开启的,所以两者可以说是互斥,基于这个情况,加上节约内存的考虑,Redis在LFU策略下复用Iru字段,还是用它来表示LFU的信息,不过将24拆解,高16bit存储ldt(L ast DecrementTime),低8bit存储logc(Logistic Counter)
高的16位保存了.上次访问时间戳,因为少了8位,所以LFU下时间精度是1分钟,不然用秒的话2^16次方只能表示65536秒(因为这次的时间只是辅助作用喵),后8位存储的是一个访问计数。
一个Key是否活跃,就是这两个字段综合决定的。
如果上一次访问时间很久,那么访问计数就会衰减,当然,最后起作用的就是访问计数。
当某个KEY被访问到的时候
第一步,计算次数衰减
因为无论是多快,相对于上次访问,-定有时间间隔,根据间隔,来计算你应该减少的次数。使用的函数就是LFUDecrAndReturn。
第二步,一定概率增加访问计数
次数不足5次,那一定会增加,如果大于5次小于255次,会一定概率加1,原来的次数越大,越困难。除了原来的次数影响之外,还有一个Ifu-log-factor参数可以被设置的。也就是说,可以通过lfu-log-factor参 数来调节难度,这个越大,难度也越大,如果为0,那么每次必然+1,很快就能255, 255就是最大值,默认是10,需要1M流量才能达到最大值。
第三步,更新
当前时间更新到高16位,次数更新到低8位。
相关文章:
Redis-内存淘汰算法
Redis可以存多少数据 32位的操作系统默认3G 谁现在用32位啊?我们说64位的 一般来讲是不设上限的 但是我们也可以主动配置maxmemory, maxmemory支持各单位: maxmemory 1024 (默认字节) maxmemory 1024KB maxmemory 1024MB maxmemory 1204GB 当Redis存储超过这个配置值&#…...
Git 合并分支时允许合并不相关的历史
git fetch git fetch 是 Git 的一个命令,用于从远程仓库中获取最新的提交和数据,同时更新本地仓库的远程分支指针。 使用 git fetch 命令可以获取远程仓库的最新提交,但并不会自动合并或修改本地分支。它会将远程仓库的提交和引用ÿ…...
世界上最著名的密码学夫妻的历史
Alice和Bob是密码学领域里最著名的虚拟夫妻,自1978年“诞生”以来,到走进二十一世纪的移动互联网时代,作为虚构的故事主角,Alice和Bob不仅在计算机理论、逻辑学、量子计算等与密码学相关的领域中得到应用,他们的名字也…...
二维码网络钓鱼攻击泛滥!美国著名能源企业成主要攻击目标
近日,Cofense发现了一次专门针对美国能源公司的网络钓鱼攻击活动,攻击者利用二维码将恶意电子邮件塞进收件箱并绕过安全系统。 Cofense 方面表示,这是首次发现网络钓鱼行为者如此大规模的使用二维码进行钓鱼攻击,这表明他们可能正…...
前端面试题-CSS
1. 盒模型 ⻚⾯渲染时, dom 元素所采⽤的 布局模型。可通过 box-sizing 进⾏设置。根据计算宽⾼的区域可分为 content-box ( W3C 标准盒模型)border-box ( IE 盒模型)padding-boxmargin-box (浏览器未实现) 2. BFC 块级格式化上下⽂,是⼀个独⽴的渲染…...
6.1 安全漏洞与网络攻击
数据参考:CISP官方 目录 安全漏洞及产生原因信息收集与分析网络攻击实施后门设置与痕迹清除 一、安全漏洞及产生原因 什么是安全漏洞 安全漏洞也称脆弱性,是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞数量逐年递增 漏洞产生的…...
STM32--EXTI外部中断
前文回顾---STM32--GPIO 相关回顾--有关中断系统简介 目录 STM32中断 NVIC EXTI外部中断 AFIO EXTI框图 旋转编码器简介 对射式红外传感器工程 代码: 旋转编码器工程 代码: STM32中断 先说一下基本原理: 1.中断请求发生:…...
Python + Selenium 处理浏览器Cookie
工作中遇到这么一个场景:自动化测试登录的时候需要输入动态验证码,由于某些原因,需要从一个已登录的机器上,复制cookie过来,到自动化这边绕过登录。 浏览器的F12里复制出来的cookie内容是文本格式的: uui…...
文件的导入与导出
文章目录 一、需求二、分析1. Excel 表格数据导出2. Excel 表格数据导入一、需求 在我们日常开发中,会有文件的导入导出的需求,如何在 vue 项目中写导入导出功能呢 二、分析 以 Excel 表格数据导出为例 1. Excel 表格数据导出 调用接口将返回的数据进行 Blob 转换,附: 接…...
[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调
文章目录 1、string类的出现1.1 C语言中的字符串 2、标准库中的string类2.1 string类 3、string类的常见接口说明及模拟实现3.1 string的常见构造3.2 string的构造函数3.3 string的拷贝构造3.4 string的赋值构造 4、完整代码 1、string类的出现 1.1 C语言中的字符串 C语言中&…...
【Apollo】赋能移动性:阿波罗自动驾驶系统的影响
前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…...
Camunda 7.x 系列【19】表达式语言
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 变量与函数2.1 流程变量2.2 内置环境变量2.3 Spring、CDI Bean2.4 内置上下文函数…...
详解RFC 793文档-4
3.7 数据通信 一旦连接建立,数据就通过交换数据段进行通信。由于错误(校验和错误)或网络拥塞可能导致数据段丢失,TCP使用重传(超时后)来确保每个段的交付。由于网络或TCP重传,可能会到达重复的段。对于重复段,TCP对段中的SEQ和ACK号执行某些检测,以验证它们的可接受性…...
ubuntu16编译内核源码并替换
文章目录 1.找到和ubuntu内核版本相同的内核源码包2.下载下面三个文件3.相关步骤4.安装编译环境软件参考: 1.找到和ubuntu内核版本相同的内核源码包 4.15.0-112.113 : linux package : Ubuntu (launchpad.net) 2.下载下面三个文件 3.相关步骤 uname -r #查看内核…...
AI 绘画Stable Diffusion 研究(九)sd图生图功能详解-老照片高清修复放大
大家好,我是风雨无阻。 通过前面几篇文章的介绍,相信各位小伙伴,对 Stable Diffusion 这款强大的AI 绘图系统有了全新的认知。我们见识到了借助 Stable Diffusion的文生图功能,利用简单的几个单词,就可以生成完美的图片…...
Linux系统安装Google Chrome
1.进入谷歌浏览器官网 Google Chrome - Download the Fast, Secure Browser from GoogleGet more done with the new Google Chrome. A more simple, secure, and faster web browser than ever, with Google’s smarts built-in. Download now.http://www.google.cn/intl/en_…...
带你了解SpringBoot支持的复杂参数--自定义对象参数-自动封装
😀前言 本篇博文是关于SpringBoot 在响应客户端请求时支持的复杂参数和自定义对象参数,希望您能够喜欢😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章…...
Raspberry Pi Pico RP2040制作低成本FPGA JTAG工具
目录 1 准备工作和前提条件 1.1 Raspberry Pi Pico RP2040板子一个 1.2 xvcPico.uf2固件 1.3 Vivado USB驱动 2 操作指南 2.1 按住Raspberry Pi Pico开发板的BOOTSEL按键,再接上USB接口到电脑 2.2 刷入固件 2.3 Vivado USB 驱动 2.3.1 打开Zadig驱动工具 2.3…...
【工具】Python从临时邮箱获取验证码
安装好依赖库之后代码可直接运行, captcha re.search(r您的验证码为: \*(\w)\*, response.json()[body][html])正则表达式部分改成自己的。 import random import requests import re from faker import Fakerdomain "https://api.mail.cx/api/v1" # 临…...
时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价)
时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 1.Matlab实现GRU门控循环单元时间序列预测未…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
