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,一经查实,立即删除!

相关文章

Vue自定义指令校验按钮权限

目标 在类似运营平台的项目中,经常会有一些操作按钮需要校验当前登录的用户是否有权限访问。然而在每一个按钮上都加 v-if 判断非常的繁琐和冗余,为此可以通过自定义指令的方式来处理按钮权限 实现方案 在main.js全局添加自定义指令 // 权限列表&…

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

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

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

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

使用 OpenAI 自定义 API 提高电商平台的推荐精度

使用 OpenAI 自定义 API 提高电商平台的推荐精度 一、引言 随着人工智能技术的不断发展,推荐系统在电商领域的应用越来越广泛。电商平台通过推荐系统向用户提供个性化的商品推荐,从而提高用户满意度和转化率。OpenAI 提供了自定义 API,使得…

用vue写表格实现数量的加减

可以使用Vue的v-model和计算属性来实现表格中数量的加减功能。 首先,在Vue实例中定义一个数组items,数组中包含多个对象,每个对象代表表格中的一行数据,包含一个quantity属性来表示数量。例如: new Vue({el: #app,da…

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的介绍, 看完大概也就知道了,实在不知道就看看下面的代码 线路连接…

实习记录——第五天

今天我的心情不是很美丽,昨天晚上没怎么睡好,因为我一直在想离不离开实验室?该怎么说的事情?但是又觉得这个项目还没有完全结束,冒昧提这个事情是不是不好?最终也没得出一个结论,晚上睡得也不踏…

Redis++源码学习1

为了更好使用Redis库,分析了源码,了解了命令的发送过程及连接池管理细节等。草草做了笔记留存。 创建ConnectionOptions 创建ConnectionPoolOptions 创建redis(ConnectionOptions, ConnectionPoolOptions) 执行redis.auth() 调用Redis::command 模板函…

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

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

代码随想录算法训练61 | 总结篇

前面60天的刷题大概是按照如下类型来刷:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->单调栈。每道题目都是精心筛选,都是经典题目高频面试题。并且,每个专题开始都有理论基础篇&#xff…

gitignore规则

在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。 Git 忽略文件提交的方法 有三种方法可以实现忽略Git中不想提交的文…

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

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

AcWing--因数平方和-->数论,整数分块

4662. 因数平方和 - AcWing题库&#xff08;python) # 输入 n int(input()) mod int(1e9 7) # 求平方和 def square_sum(n): return n * (n 1) * (2 * n 1) // 6 % mod # 结果 res 0 i1 while(i<n): # 找到开始跟结尾 x n // i y n // x res (res …

SQL Server我用TRUNCATE TABLE 表名称 清除表,没有释放空间,怎么才能把我刚才TRUNCATE TABLE 清表的空间给释放掉

在 SQL Server 中&#xff0c;当你使用 TRUNCATE TABLE 命令时&#xff0c;它确实会删除表中的所有数据&#xff0c;但不会回收空间。这是因为 TRUNCATE 操作保留了表的结构、索引、触发器等&#xff0c;而仅仅删除数据页。 如果你想释放由 TRUNCATE 操作保留的空间&#xff0…

力扣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…

SpringBoot 相关概念

文章目录 SpringBoot事务的使用Spring Boot 有哪几种读取配置的方式&#xff1f;SpringBoot的自动配置原理是什么bootstrap.properties 和 application.properties 有何区别 ?什么是 Spring Profiles&#xff1f;Spring Boot 中如何解决跨域问题 ?SpringBoot性能如何优化实现…

MYSQL源码安装并且添加系统服务脚本SHELL编程实战LNMP源码部署脚本

MYSQL源码安装&并且添加系统服务脚本&SHELL编程实战LNMP源码部署脚本 1、编写MYSQL源码安装&并且添加系统服务脚本 mysql_yuanma_install_v2.sh #!/bin/bash #2024年01月25日21:05:03 #auto install mysql #by author lqc ##################################…