Redis学习二--常见问题及处理

基本概念

Redis基本概念数据结构

机制

持久化机制:

RDB(内存快照):某一时刻的内存快照以二进制的方式写入磁盘,可以手动触发和自动触发。

优点:生成文件小,恢复速度快,适用于灾难恢复。

缺点:redis发生意外停机时,服务器会丢失还未保存到快照中的数据。

RDB详解

AOF(增量日志):将redis执行的每一条命令追加到一个文件的末尾,redis重启时,会重新执行这些命令来恢复数据。

优点:不容易丢失数据,更为安全

缺点:文件体积大,恢复速度慢

混合持久化(RDB+AOF):redis会优先加载AOF文件恢复数据,因为AOF更为安全

内存淘汰策略

noeviction(不淘汰策略):当内存不足以容纳新写入数据时,Redis 将新写入的命令返回错误。这个策略确保数据的完整性,但会导致写入操作失败。
volatile-lru(最近最少使用):从设置了过期时间的键中选择最少使用的键进行删除。该策略优先删除最久未被访问的键,保留最常用的键。
volatile-ttl(根据过期时间优先):从设置了过期时间的键中选择剩余时间最短的键进行删除。该策略优先删除剩余时间较短的键,以尽量保留剩余时间更长的键。
volatile-random(随机删除):从设置了过期时间的键中随机选择一个键进行删除。
allkeys-lru(全局最近最少使用):从所有键中选择最少使用的键进行删除。无论键是否设置了过期时间,都将参与淘汰。
allkeys-random(全局随机删除):从所有键中随机选择一个键进行删除。

redis的哨兵机制

redis的哨兵,集群详解

应用

使用场景                

1.app首页流量高峰

2.不需要持久化存储的操作(验证码,点赞数)

3.分布式锁

4.分布式缓存

问题

如何解决Hash冲突

Hash冲突:用哈希表存储数据时,两个或多个不同的键被哈希函数映射到一个位置。

redis通过链式哈希解决冲突,也就是同一个桶里面的元素使用链表保存。

但是当链表过长就会导致查找性能变差可能。所以redis为了追求块,使用了两个全局哈希表。用于rehash操作,增加现有的哈希桶数量,减少哈希冲突。

如何处理过期的数据(过期策略)

惰性删除:客户端尝试访问某个键时,redis检查是否过期,如果过期就会删掉。

优点:节省CPU资源,只有访问时才会判断是否过期

缺点:key过期了却没有删掉,占用内存

定期删除:每隔一段时间就会通过循环遍历去随机抽查一部分设置过期时间的key,过期了就删掉。

优点:调整定时扫描的时间间隔和每次扫描的限定耗时,保证CPU和内存资源的利用最大化。

如何保证数据库和redis的一致性

双删策略:

  • 第一次删除:在更新数据库之前,先删除Redis缓存中的数据。这样,即使在更新数据库的过程中,如果有请求查询该数据,也会从数据库中读取最新数据,而不是从缓存中读取过期的旧数据。

  • 第二次删除:在更新数据库之后,再次删除Redis缓存中的数据。这样可以处理在第一次删除和更新数据库之间,有其他请求将旧数据重新写入缓存的情况。这次删除确保了即使这种情况发生,缓存中的数据也会被最新的数据库数据替换。

需要注意的是,双删策略可能会在某些情况下导致数据不一致的问题,比如在分布式系统中,如果第二次删除操作失败,可能会导致缓存中的数据和数据库中的数据不一致。因此,实际应用中可能需要结合其他一致性保证机制,如使用事务、延迟删除策略、订阅数据库变更事件等,来确保数据的一致性。

如何解决热key问题

热Key问题:某些特定的缓存key受到高频访问,导致对这些热门数据的读取/写入操作集中在少数几个缓存节点上,使得这些节点的负载过高,而其他节点负载较轻甚至空闲。这会造成系统性能不均衡,可能导致部分请求响应变慢或服务不可用。

解决:

1. 缓存预热:在系统启动或业务低峰期,通过批量加载或预先访问热门数据,将这些热门数据提前加载到缓存中。这样可以避免大量请求同时涌入导致的热点问题,提高系统的稳定性和性能。
2. 动态散列:将缓存节点组织成一个哈希环,根据缓存键的哈希值将数据分散存储在多个节点上。通过增加缓存节点的数量,让请求更均匀地分布在各个节点上,减轻热 Key 对单个节点的压力。当节点数量发生变化时,可以通过一致性哈希算法进行平滑迁移,避免数据大规模迁移带来的负载过高。
3. 数据分片:将数据按特定规则(如数据范围、业务维度等)分成多个片段,分别存储在不同的缓存节点上。这样可以使热 Key 所在的数据尽量均匀地分布在多个节点上,减轻单个节点的压力。

缓存击穿

指当一个缓存键(key)对应的数据在缓存中不存在,同时又有大量并发请求访问该缓存键时,这些请求会直接绕过缓存,查询数据库或其他存储系统,导致数据库压力增大。缓存击穿通常在缓存过期后发生。

缓存穿透

指当一个查询请求访问一个不存在于缓存中且也不存在于数据库中的数据时,这个请求会无效地继续访问数据库,而不会被缓存。如果黑客故意发送大量非法请求,则缓存层无法起到过滤作用,可能导致数据库负载过大。

缓存雪崩

指当缓存集中在某个时间点失效或由于某个原因发生故障,导致大量的请求直接打到后端数据库,造成数据库瞬时压力过大,甚至引起数据库崩溃。在缓存雪崩期间,系统性能急剧下降,无法正常提供服务。

解决

1. 对热点数据采用永不过期策略,避免缓存击穿。
2. 在缓存层进行空值缓存,即将查询结果为空的数据也缓存一段时间,避免缓存穿透。
3. 设置合理的缓存过期时间,并使用分布式缓存的多节点部署,避免缓存雪崩。
4. 引入限流、熔断等机制,控制并发访问量,保护后端系统。
5. 对重要数据做冷备份,确保即使缓存失效或故障,仍能从其他系统中恢复数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何与施耐德Schneider建立EDI连接?

EDI基础知识 何为EDI?是一个软件、系统还是一种流程呢?准确来说,EDI全称Electronic Data Interchange,中文名称是电子数据交换,也被称为“无纸化贸易”。EDI是: 标准化的数据格式连接业务系统间的数据桥梁…

Verilog刷题笔记40

题目: For the following Karnaugh map, give the circuit implementation using one 4-to-1 multiplexer and as many 2-to-1 multiplexers as required, but using as few as possible. You are not allowed to use any other logic gate and you must use a and …

vite脚手架生成vue项目及其配置

认识脚手架 脚手架就是为了快速生成可复用代码的工具,帮你配置好开发过程中要用到的工具和环境,更快更方便地做开发写业务 vite和cli脚手架区别 可参考博主文章: Vue脚手架(cli和vite详解)_vite和vuecli-CSDN博客 …

JVM的知识

什么是JVM 1.JVM: JVM其实就是运行在 操作系统之上的一个特殊的软件。 2.JVM的内部结构: (1)因为栈会将执行的程序弹出栈。 (2)垃圾99%的都是在堆和方法区中产生的。 类加载器:加载class文件。…

花生壳 | ubuntu安装和卸载花生壳

一、到花生壳官网下载linux版本的花生壳 一般下载到Downlaods文件夹 进入文件夹 dpkg -i phddns_5_1_amd64.deb #安装花生壳 dpkg -r phddns #卸载花生壳 登录花生壳管理网站 http://b.oray.com 在Ubuntu中输入命令查看sn码,默认密码为admin phddns status …

年龄大了转嵌入式有机会吗?

有老铁说,我28了,转嵌入式还来得及吗? 其实这个是因人而异的,没有固定说超过多少岁,就不能转了。 我一般不太建议30及以上的转行,第一是30岁才从开始做技术,感觉意义不大。第二是难度大&#xf…

淡旺季酒店价格波动太大,住宿费用怎么管?

受地理位置、季节等因素的影响,部分城市不同季节的酒店价格浮动较大。一线还是二线城市?是淡季还是旺季?价格差距之间可以说是天差地别。 在淡季出差时,按照旺季的标准会导致成本过高,造成资源的浪费。而在旺季出差时&…

python+requests接口自动化测试实战

环境说明: 1.WIN 7, 64位 2.Python3.4.3 (pip-8.1.2) 3.Requests —>pip install requests 4.Unittest —>unittest 框架是python自带的单元测试框架,python2.1及其以后的版本已将unittest作为一个标准块放入python开发包中…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数(通常使用输入函数),确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和,该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系,而传统的固定序列处理方法可能会遗漏这…

LeetCode:2617. 网格图中最少访问的格子数(优先级队列 Java)

目录 2617. 网格图中最少访问的格子数 题目描述: 实现代码与解析: 优先级队列 原理思路: 2617. 网格图中最少访问的格子数 题目描述: 给你一个下标从 0 开始的 m x n 整数矩阵 grid 。你一开始的位置在 左上角 格子 (0, 0) 。…

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树 965. 单值二叉树 - 力扣(LeetCode) 建立一个新的函数,用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题,建立新的函数来传参 多采用使用反对值的方法,因为如果是相等return true的话&am…

芯片公司SAP管理架构:科技与管理的完美融合

在当今日新月异的科技时代,芯片公司作为信息技术领域的核心力量,其运营管理的复杂性日益凸显。SAP管理架构作为一种高效的企业资源规划系统,为芯片公司提供了强大的管理支持。本文将为您科普芯片公司SAP管理架构的相关知识。 SAP管理架构是一…

leetcode每日一题1969

目录 一.题目原型: 二思路解析: 三.代码实现: 一.题目原型: 二思路解析: 灵神的做法非常让人惊叹: 理解就是,如果一个数大于另一个数要交换的1的权重,那么他们的乘积就变小。 那么一个大的数…

React 中的懒加载(Lazy Load)

React 中的懒加载(Lazy Load) 在大型的 React 应用中,为了提高页面加载速度和性能,我们经常会使用懒加载技术来延迟加载组件或资源。懒加载可以将页面初始加载的内容减少到最小,只在需要时再动态加载额外的组件或资源…

js实现hash路由原理

一、简单的上下布局&#xff0c;点击左侧导航&#xff0c;中间内容跟对变化&#xff0c;主要技术使用js检测路由的onhashchange事件 效果图 二、话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"…

Wireshark 抓包工具与长ping工具pinginfoview使用,安装包

一、Wireshark使用 打开软件&#xff0c;选择以太网 1、时间设置时间显示格式 这个时间戳不易直观&#xff0c;我们修改 2、抓包使用的命令 1&#xff09;IP地址过滤 ip.addr192.168.1.114 //筛选出源IP或者目的IP地址是192.168.1.114的全部数据包。 ip.sr…

Win10中IIS服务如何部署c#服务

1、将项目打包发布 注意发布位置 2、打开搜索搜索计算机管理 3、点击服务和应用程序 4、点击internet information service 5、点击网站再点击添加网站 6、添加网站名称:opm 添加网站路径(即刚才发布路径) 输入ip地址:自己电脑ip 配置端口号5052 最后点击确认 7、…

vue3中如何实现多个侦听器(watch)

<body> <div id"app"><input type"button" value"更改名字" click"change"> </div> <script src"vue.js"></script> <script>new Vue({el: #app,data: {food: {id: 1,name: 冰激…

类型双关联合体(C++基础)

类型双关 类型双关就是在同样的一个内存中&#xff0c;存储的数据可以用做不同类型的表述。用在底层性能优化的时候&#xff0c;一般使用的时候要非常小心&#xff0c;因为不当的使用可能导致程序的不稳定和不可预测的行为。 int a 5;//double value (double)a;double value…

卷王的自述,我为什么这么卷?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xf…