【Redis】知识点整理(源于javaguide)

一、什么是Redis

Redis是一种开源的内存数据库,它支持键值存储,常被用作数据缓存、消息代理和队列等。它以高性能和支持多种数据结构而闻名,如字符串、哈希、列表、集合和有序集合。Redis也支持持久化,可以将数据存储在磁盘上,以确保数据不会因服务器重启而丢失。

二、Redis的优点

读取速度快,因为数据存在内存中,所以数据获取快;
支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等;
支持事务,且操作遵守原子性,即对数据的操作要么都执行,要么都不支持;
还拥有其他丰富的功能,队列、主从复制、集群、数据持久化等功能。

三、为什么Redis的速度比较快

1.Redis是由C语言实现的,效率比较高
2.Redis存储在内容中,针对内存操作,使用效率高
3.Redis是基于非阻塞的IO复用模型
4.采用单线程的模型,避免频繁的上下文切换
5.提供了丰富的数据结构,提高使用效率

四、Redis的持久化方式?有何区别?

Redis的持久化方式为RDB和AOF两种:
RDB 持久化方式
使用数据集快照的方式记录Redis数据库的所有键值对,将数据写入临时文件,持久化完成后,用临时文件替换原文件,达到数据恢复的效果。
优点:
只有一个文件 dump.rdb ,方便持久化。
容灾性好,一个文件可以保存到安全的磁盘。
性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 Redis 的高性能)
相对于数据集大时,比 AOF 的启动效率更高。
缺点:
数据安全性低。 RDB 是间隔一段时间进行持久化,如果持久化之间 Redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

AOF 持久化方式
是指所有的命令行记录以 Redis 命令请求协议的格式完全持久化存储,保存为 AOF 文件
优点
数据安全, AOF 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 AOF 文件中一次。
通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
AOF 机制的 rewrite 模式。 AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall )
缺点
AOF 文件比 RDB 文件大,且恢复速度慢。
数据集大的时候,比 RDB 启动效率低

五、Redis支持的数据类型

Redis的五种基本数据类型
String(字符串):SDS
底层的数据结构为简单动态字符串(SDS) ,可以保存文本和二进制数据
List(列表):LinkedList/ZipList/QuickList
底层实现为一个双向链表,支持反向查找和遍历
Hash(散列):Dict、ZipList
底层实现为数组 + 链表
Set 类型是一种无序集合,集合中的元素没有先后顺序但都唯一
底层实现为数组 + 链表
Zset(有序集合):ZipList、SkipList
在Set基础上增加了一个权重参数score,使得元素能够按照score进行有序排列。“底层使用跳表实现”

Redis的三种特殊类型
Bitmap(位图)
Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身
HyperLogLog(基数统计)
HyperLogLog 是一种有名的基数计数概率算法 ,基于 LogLog Counting(LLC)优化改进得来,并不是 Redis 特有的,Redis 只是实现了这个算法并提供了一些开箱即用的 API。
Geospatial (地理位置)
Geospatial index(地理空间索引,简称 GEO) 主要用于存储地理位置信息,基于 Sorted Set 实现。

六、Redis的过期key删除策略

惰性删除:只会在取出/查询 key 的时候才对数据进行过期检查。这种方式对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
定期删除:周期性地随机从设置了过期时间的 key 中抽查一批,然后逐个检查这些 key 是否过期,过期就删除 key。相比于惰性删除,定期删除对内存更友好,对 CPU 不太友好。
延迟队列:把设置过期时间的 key 放到一个延迟队列里,到期之后就删除 key。这种方式可以保证每个过期 key 都能被删除,但维护延迟队列太麻烦,队列本身也要占用资源。
定时删除:每个设置了过期时间的 key 都会在设置的时间到达时立即被删除。这种方法可以确保内存中不会有过期的键,但是它对 CPU 的压力最大,因为它需要为每个键都设置一个定时器。

七、Redis的内存淘汰策略Redis 的内存淘汰策略

只有在运行内存达到了配置的最大内存阈值时才会触发,这个阈值是通过redis.conf的maxmemory参数来定义的。
Redis 提供了 6 种内存淘汰策略:
volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
allkeys-lru(least recently used):从数据集(server.db[i].dict)中移除最近最少使用的数据淘汰。
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
no-eviction(默认内存淘汰策略):禁止驱逐数据,当内存不足以容纳新写入数据时,新写入操作会报错。

八、Redis bigkey问题

bigKey:一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。
处理方式
分割 bigkey:将一个 bigkey 分割为多个小 key。例如,将一个含有上万字段数量的 Hash 按照一定策略(比如二次哈希)拆分为多个 Hash。
手动清理:Redis 4.0+ 可以使用 UNLINK 命令来异步删除一个或多个指定的 key。Redis 4.0 以下可以考虑使用 SCAN 命令结合 DEL 命令来分批次删除。
采用合适的数据结构:例如,文件二进制数据不使用 String 保存、使用 HyperLogLog 统计页面 UV、Bitmap 保存状态信息(0/1)。
开启 lazy-free(惰性删除/延迟释放) :lazy-free 特性是 Redis 4.0 开始引入的,指的是让 Redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。

九、Redis生产问题

缓存穿透
缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。
解决办法:
做好参数校验
(1)缓存无效key
(2)布隆过滤器
(3)接口限流
缓存击穿
缓存击穿中,请求的 key 对应的是 热点数据 ,该数据 存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期) 。
解决办法:
(1)永不过期
(2)提前预热
(3)加锁
缓存雪崩
缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。
针对 Redis 服务不可用的情况:
(1)Redis 集群:采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。Redis Cluster 和 Redis Sentinel 是两种最常用的 Redis 集群实现方案。
(2)多级缓存:设置多级缓存,例如本地缓存+Redis 缓存的二级缓存组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。
针对大量缓存同时失效的情况:
(1)设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。
(2)提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。(3)持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。

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

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

相关文章

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面: 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的,镜像图层都是只读层, 第二个是: 容器读写层, 容器启动后,docker会基于容器镜像的读层&…

服务器数据恢复—raid磁盘故障导致数据库文件损坏的数据恢复案例

服务器存储数据恢复环境&故障: 存储中有一组由3块SAS硬盘组建的raid。上层win server操作系统层面划分了3个分区,数据库存放在D分区,备份存放在E分区。 RAID中一块硬盘的指示灯亮红色,D分区无法识别;E分区可识别&a…

Python机器学习中的模型评估与优化技术

Python机器学习中的模型评估与优化技术 目录 📊 模型评估与优化 1.1 交叉验证与模型评估指标 准确率、精确率、召回率、F1-score 1.2 超参数调优 网格搜索与随机搜索使用Scikit-learn的GridSearchCV与RandomizedSearchCV 1. 📊 模型评估与优化 1.1 …

【理论科学与实践技术】数学与经济管理中的学科与实用算法

在现代商业环境中,数学与经济管理的结合为企业提供了强大的决策支持。包含一些主要学科,包括数学基础、经济学模型、管理学及风险管理,相关的实用算法和这些算法在中国及全球知名企业中的实际应用。 一、数学基础 1). 发现人及著名学者 发…

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测 开源项目地址:https://gitcode.net/EricLee/yolo_v3 示例:

物理学基础精解【44】

文章目录 球面方程一、球面方程的一般形式二、球面方程的其他形式三、球面方程的性质四、球面方程的应用五、球面方程与其他几何图形的关系 球面方程的几何意义1. 定义球面的形状和大小2. 描述球面的对称性3. 确定球面上点的位置4. 反映球面的曲率性质5. 与其他几何图形的关系6…

前端学习第二天笔记 CSS选择 盒子模型 浮动 定位 CSS3新特性 动画 媒体查询 精灵图雪碧图 字体图标

CSS学习 CSS选择器全局选择器元素选择器类选择器ID选择器合并选择器 选择器的优先级字体属性背景属性文本属性表格属性表格边框折叠边框表格文字对齐表格填充表格颜色 关系选择器后代选择器子代选择器相邻兄弟选择器通用兄弟选择器 CSS盒子模型弹性盒子模型父元素上的属性flex-…

大厂面试真题-说一下Mybatis的缓存

首先看一下原理图 Mybatis提供了两种缓存机制:一级缓存(L1 Cache)和二级缓存(L2 Cache),旨在提高数据库查询的性能,减少数据库的访问次数。注意查询的顺序是先二级缓存,再一级缓存。…

C++入门(有C语言基础)

string类 string类初始化的方式大概有以下几种: string str1;string str2 "hello str2";string str3("hello str3");string str4(5, B);string str5[3] {"Xiaomi", "BYD", "XPeng"};string str6 str5[2];str…

主存储器——随机存取存储器RAM

静态RAM 双稳态触发器 一、工作特性 两种稳定状态: 双稳态触发器具有两个稳定的输出状态,通常表示为 0 和 1(或低电平和高电平)。这两个状态可以长期保持,即使在没有输入信号的情况下,也不会自发地改变。 例…

【分布式微服务云原生】消息队列全解析:原理、应用场景与主流MQ对比

消息队列全解析:原理、应用场景与主流MQ对比 摘要 在快速发展的软件架构中,消息队列(MQ)扮演着至关重要的角色。它不仅实现了系统间的异步通信,还提供了应用解耦、流量削峰等关键功能。本文将深入探讨消息队列的工作原…

初识TCP/IP协议

回顾上文 来回顾一下TCP协议的特性,有一道比较经典的题:如何使用UDP实现可靠传输,通过应用程序的代码,完成可靠传输的过程? 原则,TCO有啥就吹啥,引入滑动窗口,引入流量控制&#x…

面试金典题3.2

请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。 示例: MinStack minStack new MinStack(); minStack.push(-2); minStack.push(…

基于 Qwen2.5-0.5B 微调训练 Ner 命名实体识别任务

一、Qwen2.5 & 数据集 Qwen2.5 是 Qwen 大型语言模型的最新系列,参数范围从 0.5B 到 72B 不等。 对比 Qwen2 最新的 Qwen2.5 进行了以下改进: 知识明显增加,并且大大提高了编码和数学能力。在指令跟随、生成长文本(超过 8K…

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图,我这里是打包时候报错,就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包,成功。

Unity 2D RPG Kit 学习笔记

学习资料: B站教学视频:https://www.bilibili.com/video/BV1dC4y1o7A5?p1&vd_source707ec8983cc32e6e065d5496a7f79ee6 2D RPG Kit Documentation.pdf文档 1、2D RPG Kit Documentation文档 1.1、Scenes/TitleScreen 开始菜单工程 1.2、https://it…

基于YOLOv8的智能植物监测机器人

摘要:针对传统的植物病害检测方法依赖专家的经验,耗时耗力,并且准确性受限于个人的水平等问题。文中提出无线通信模块采用HTTP协议来传输数据图片,采用SoC核心处理器实现了便携化,采用对射式红外避障传感器实现自动避障功能。以YOLOv8算法为控制核心,并添加注意力机制以提…

闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨

上图为执行语义搜索前的聚类演示 ,嵌入技术是自然语言处理的核心组成部分。虽然嵌入技术的应用范围广泛,但在检索应用中的语义搜索仍是其最常见的用途之一。 尽管知识图谱等可以提升检索的准确率和效率,但标准向量检索技术仍然具有其实用价值…

「安装」 Windows下安装CUDA和Pytorch

「安装」 Windows下安装CUDA和Pytorch 文章目录 「安装」 Windows下安装CUDA和PytorchMac、Linux、云端Windows安装CUDA安装miniconda安装PyTorch测试总结 其他 Mac、Linux、云端 Mac、Linux、云端安装Miniconda和Pytorch的方法参考其他资料。 Windows 下面进行Windows下安装…