Redis高级特性

文章目录

      • 1.4.1 Redis的缓存过期淘汰策略
        • 1.4.1.1 Redis内存满了怎么办
        • 1.4.1.2 过期策略
        • 1.4.1.3 缓存淘汰策略
          • 1.4.1.3.1 Redis 中LRU设计
          • 1.4.1.3.2 Redis 中LFU设计
      • 1.4.2 持久化机制
        • 1.4.2.1 持久化流程
        • 1.4.2.2 RDB
        • 1.4.2.3 AOF
          • 1.4.2.3.1 AOF运行原理
          • 1.4.2.3.2 AOF文件重写原理
      • 1.4.3 Redis为什么这么快?Redis IO多路复用深度解析

1.4.1 Redis的缓存过期淘汰策略

1.4.1.1 Redis内存满了怎么办

真要打满了会怎么样?如果Redis内存使用超出了设置的最大值会怎样?
改改配置,故意把最大值设为1个byte试试,发现OOM了


1.4.1.2 过期策略

往redis里写的数据是怎么没了的?它如何删除的?

立即删除,需时刻遍历过期key,cpu消耗大,对空间友好
惰性删除,下次访问过期key删除,对空间不友好,可能key不在访问就不会删除
定期删除(折中方案)


定期删除的漏网之鱼
1 定期删除时,从来没有被抽查到
2 惰性删除时,也从来没有被点中使用过
上述2步骤======> 大量过期的key堆积在内存中,导致redis内存空间紧张或者很快耗尽
必须要有一个更好的兜底方案…内存淘汰策略

1.4.1.3 缓存淘汰策略

平时用哪一种?如何配置、修改?命令和配置文件reids.conf参数配置



1.4.1.3.1 Redis 中LRU设计

抽样删除热度最低的key。
如果基于传统LRU算法实现Redis LRU会有什么问题?
问题1:需要额外的数据结构存储,消耗内存
问题2:如图,假设A在10秒内被访问了5次,而B在10秒内被访问了3次。因为B最后一次被访问的时间比A要晚,在同等的情况下,A反而先被回收。

原理问题:redis如何找出热度最低(最少使用)的数据?
Redis中所有对象结构有一个lru字段记录对象热度,对象创建是会记录lru值,被访问时更新lru(设置值不是当前时间戳,而是Server.lrulock的值,也就是unix时间)。
Server.lrulock:Redis中有个定时处理的函数serverCron,默认每100毫秒调用函数updateCachedTime 更新一次全局变量的 server.lruclock 的值,它记录的是当前unix时间。

为什么不获取精确的时间而是放在全局变量中?不会有延迟的问题吗?
这样函数查询key调用lookupKey中更新数据的lru热度值时,就不用每次调用系统函数time,可以提高执行效率。

热度如何评估?当对象里有LRU字段值,就可以评估对象热度了
评估方式:对象lru值和全局server.lruclock的差值,差值越大(越久没更新),表示该对象热度越低

1.4.1.3.2 Redis 中LFU设计

字段lru作为LFU使用有24bit位
高16为记录访问时间(单位分),
低8为记录访问次数(counter),基于概率对数实现,8位可表示百万次访问评率
对象被读写时更新lfu的值(基于算法增加)
当长时间不访问该值,lfu应该减少:减少值由衰减因子控制,如果为1,N分没访问计数器减少N

1.4.2 持久化机制

官网:https://redis.io/topics/persistence

RDB和AOF如何选择(比较)?
建议两种都用,redis启动优先加载AOF文件恢复数据,因为AOF保存的数据更完整
如果可以忍受一小段时间内数据的丢失,选RDB。否则就使用AOF重写。
但是不建议单独使用某一种持久化机制,而是应该两种一起用,在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

1.4.2.1 持久化流程

(1)客户端向服务端发送写操作(数据在客户端的内存中)。
(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。
(3)服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。
(4)操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。
(5)磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。

1.4.2.2 RDB




redis.conf配置触发规则:不需要RDB注释sava

lastsave命令查看最近生成的快照:

bgsave原理:


1.4.2.3 AOF


redis.conf配置appenddonly开启:


数据都是实时持久滑到磁盘吗?

1.4.2.3.1 AOF运行原理

每当有一个写命令过来时,就直接保存在我们的AOF文件中

1.4.2.3.2 AOF文件重写原理

文件越来越大,怎么办?bgrewriteaof命令重写,生成新的aof文件
重写过程中新的写命令记录到AOF重写缓存中,写完成后追加到aof文件



1.4.3 Redis为什么这么快?Redis IO多路复用深度解析



Redis单线程如何处理那么多并发客户端连接,为什么单线程,为什么快?

I/O多路复用解决了redis单线程读写操作等待用户输入或输出都是阻塞的问题

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

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

相关文章

PowerBI商业智能分析引入,带你了解什么是商务智能

一、商务智能工具 什么是Power BI ?Power Bl是微软开发的一个软件,它是从获取数据、数据清洗、数据图表搭建、数据分析、共享发布为一体的软件,无论你的数据是简单的Excel电子表格,还是复杂庞大的数据库,Power Bl都可…

智慧文旅:提升旅游体验与推动经济发展的新动力

一、智慧文旅的定义与意义 智慧文旅,即智慧文化旅游,是一种以当地特色文化元素为核心驱动,利用现代科技手段实现旅游景区全面智慧升级的旅游模式。其意义在于为游客提供高效便捷的旅游信息化服务,提升旅游体验,同时推…

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go …

【Linux】Linux权限的概念 -- 详解

一、Linux 中的用户 Linux 下有两种用户: 超级用户(root):可以在 Linux 系统下做任何事情,不受限制。普通用户:在 Linux 下做有限的事情。 超级用户的命令提示符是 “#”,普通用户的命令提示符…

解读BEVFormer,新一代自动驾驶视觉工作的基石

文章出处 BEVFormer这篇文章很有划时代的意义,改变了许多视觉领域工作的pipeline[2203.17270] BEVFormer: Learning Birds-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers (arxiv.org)https://arxiv.org/abs/2203.17270 BEV …

ESP8266 控制之 : 使用 RingBuffer USART1 和 USART3互传

简介 使用Buffer来避免数据的丢失, 或许你自己在使用串口进行收发时会丢失数据, 现在我们就来简单使用一下RingBuffer创建Rx、Tx的Buffer来避免发送接收丢包或数据丢失问题。 扩展知识 RingBuffer的介绍, 看完大概也就知道了,实在不知道就看看下面的代码 线路连接…

使用antdesign3.0、echarts制作固定资产后台管理系统原型

学了半个月Axure,周末用半天时间,照着网上的模板做了一个固定资产后台管理系统的原型。重点是内联框架的使用,和对echarts表格js代码的调试。原型链接:https://qoz5rv.axshare.com 资产管理系统

SD NAND的CLK引脚的注意事项和走线规范

CLK的作用和注意事项 SD NAND的时钟引脚(CLK)的作用是提供一个时钟信号,用于同步数据传输。时钟信号是由主设备(如微控制器或存储控制器)提供的,用于确保SD NAND和主设备之间的数据交换是按照相同的时序进…

力扣hot100 子集 回溯 超简洁

Problem: 78. 子集 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {List<Li…

【Javaweb程序】【C00155】基于SSM的旅游旅行管理系统(论文+PPT)

基于SSM的旅游旅行管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于SSM的旅游旅行管理系统 本系统分为前台系统模块、管理员模块、用户模块以及商家模块 其中前台系统模块的权限为&#xff1a;当游客打开系统的网址后…

Docker本地部署APITable结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

luceda ipkiss教程 60:导入特定图层的GDS版图

在用GDSCell导入版图时&#xff0c;可以设置layer_map来选择导入特定图层的GDS文件&#xff0c; 比如&#xff1a;可以将教程57中的微环调制器生成gds文件&#xff1a;Ring_modulator.gds&#xff0c; 在导入Ring_modulator.gds做其他设计时&#xff0c;可以选择只导入波导部分…

高阶测试开发必备技能: k8s入门!

现在稍微有点规模公司都是基于docker容器化部署技巧&#xff0c;K8s现在主流&#xff0c;应用最广的容器集群管理技术。 k8s全称kubernetes&#xff08;首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s&#xff0c;所以简称 k8s&#xff09;&#xff0c;基于Docker容器…

网络安全01--负载均衡

目录 一、环境准备 1.1三台虚拟机 二、开始搭建负载均衡&#xff1a; 2.1准备一下源 2.2正式安装 2.3Nginx安装情况 三、负载均衡--轮询&#xff08;round robin&#xff09; 3.1在 http 部分添加如下负载均衡配置&#xff1a; 3.2简单解释一下server端&#xff1a; …

JS-Window常见对象

location对象 location的数据类型是对象&#xff0c;它拆分并保存了URL地址的各个组成部分 常用属性和方法&#xff1a; 1&#xff09;href属性获取完整的URL地址&#xff0c;对其赋值时用于地址的跳转 //可以得到当前文件URL地址 console.log(location.href) //可以通过js…

GPT-SoVITS 测试

开箱直用版&#xff08;使用 AutoDL&#xff09; step1 打开地址 https://www.codewithgpu.com/i/RVC-Boss/GPT-SoVITS/GPT-SoVITS-Official 选择 AutoDL创建实例&#xff0c;选择 3080ti 机器 step2 创建好实例之后&#xff0c;进入命令行&#xff0c;输入命令 echo {}>…

防御保护--智能选路

目录 就近选路 策略选路--PBR DSCP优先级 智能选路--全局路由策略 1.基于链路带宽的负载分担 2.基于链路质量进行负载分担 3.基于链路权重进行负载分担 4.基于链路优先级的主备备份 ​编辑 DNS透明代理 就近选路 我们希望在访问不同运营商服务器时&#xff0c;通过对…

使用机器学习算法检测交易中的异常行为

交易中的异常检测意味着识别交易或相关活动中的异常或意外模式。这些模式被称为异常或异常值&#xff0c;明显偏离预期规范&#xff0c;可能表明存在不规则或欺诈行为。 异常检测在各种业务中发挥着至关重要的作用&#xff0c;尤其是那些涉及金融交易、在线活动和安全敏感操作…

TensorFlow Lite中文本分类在Android上的实践

#1 Tensorflow Lite TensorFlow Lite(后续简称TFL) 是 Google 开发的一个用于移动设备和嵌入式设备的开源库,旨在为移动终端设备提供机器学习推断。它是 TensorFlow 框架的轻量级版本,专门优化了模型的大小和性能,以适应资源受限的移动设备和嵌入式系统。 TFL 提供了一种在移…

go包与依赖管理

包&#xff08;package&#xff09; 包介绍 Go语言中支持模块化的开发理念&#xff0c;在Go语言中使用包&#xff08;package&#xff09;来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件&#xff08;.go结尾的文件&#xff09;组成&#xff0c;是一种高级的代码…