Redis之常用实战场景

1.Redis数据丢失场景

1.1 持久化丢失

采用RDB或者不持久化,就会有数据丢失,因为是手动或者配置以快照的形式来进行备份。

解决: 启用AOF,以命令追加的形式进行备份,但是默认也会有1s丢失,这是在性能与数据安全性中寻求的一个最适合的方案,如果为了保证数据一致性,可以将配置更改为always,但是性能很慢,一般不用。

# appendfsync always

1.2主从切换

因为Redis的数据是主异步同步给从的,提升了性能,但是由于是异步同步到从。所以存在数据丢失的可能。

1.master 写入数据 k1 , 由于 是异步同步到 slave ,当 master 没有同步给slave的时候, master 挂了
2.slave 会成为新的 master ,并且没有同步 k1
3.master 重启,会成为新 master slave ,同步数据会清空自己的数据,从新的master 加载
4.k1 丢失

1.3 sentinel脑裂

a.假如有个sentinel集群跟redis集群,如图

b. 当我的master机器(129)跟另外2台发生分区容错,网络断开

c. sentinel2跟sentinel3大于三分之二,满足故障转移条件(sentinel故障转移需要过半),这个时候会从2个slave中选出一个master

d. 客户端假如连接到sentinel1,我们数据会写入129,连接到sentinel2或sentinel3,数据就会写入128,同时有2个master写入数据。假如129写入了k1

e.当网络恢复后,129会变成128的从,129的数据全部从128同步

f. k1丢失

尽量减少主从切换跟sentinel数据丢失的解决办法:

 min-replicas-to-write 1 至少有1个从节点同步到我主节点的数据(有的话让数据写入),但是由于是异步同步,所以是最终一致性 不会确保有数据写入

min - replicas - max - lag 10 判断上面 1 个的延迟时间必须小于等于 10s

2. Redis缓存跟DB一致性问题

在并发环境下,可能导致redis跟DB的数据产生不一致。

2.1 怎么产生?

查询缓存逻辑

a.在我们查询DB之前,先去查询Redis,如果Redis存在,直接返回;如果Redis不存在,从DB查询。

b.从DB查询后,回写到Redis

缓存依赖

当修改DB的数据,DB数据修改成功后,删除Redis数据,做好缓存依赖。

丢失场景

1. 线程 A 请求缓存,没有缓存,从 DB 拿到 1
2. 线程 B 1 更新为 2 ,并且删除缓存, DB 的值为 2
3. 线程 A 更新缓存, redis 1

因此,最终我们发现,redis的数据为1,db数据为2,出现了数据一致性问题。

所以,数据一致性产生的根本问题,是查询DB跟操作Redis不是原子性的,所以并发会导致数据一致性问题。

 2.2 怎么解决?

2.2.1 不可取的强一致性方案

延时双删

所谓延时双删,就是在更新 DB 后,等待一段时间,再进行 Redis 删除!来等待其他的线程拿到的都是最新数据!
也会产生很多问题。
1. 延时多久?不知道其他线程要多久。
2. 不够优雅,代码中写入延时代码。

采用锁机制,不让有并发

 在更新的时候,采取锁的机制,不让其他线程进行删除操作!

但是会拖慢整个性能,违背了 Redis 的初衷

 综上,我们只能采用最终一致性,不应该去保证强一致性。

2.2.2 最终一致性方案

每个缓存设置过期时间

设置过期时间,就算不一致,也只是在有效时间内的不一致。

Mysql canal等数据同步工具

捕捉到DB的更改,同步到相关Redis,相对比较复杂,要知道每个数据对应的缓存。

3. edis缓存雪崩、穿透、击穿问题分析

3.1缓存雪崩

缓存雪崩就是redis大量的数据同时过期(失效) 并且并发很高,则会导致所有的key全部打到DB

1. 保证 Redis 的高可用,防止由于 Redis 不可用导致全部打到 DB
2. 加互斥锁或者使用队列,针对同一个 key只允许一个线程到数据库查询( 一般不这么干  与redis初衷违背 )
3. 缓存定时预先更新,避免同时失效
4. 通过加随机数,使 key 在不同的时间过期

3.2 缓存穿透

缓存穿透就是恶意攻击,指的是查询的key redis没有 db也没有,就会导致每次请求都会走DB

怎么解决? 最好的办法就是找运维  封IP 

能不能把数据放到另外一个地方, 在访问redis和db之间就过滤一次。举个例子

 比如,你去按摩,你有指定的技师,那么你先看下这个技师会不会值班,如果值班,你就去,否则你就不去。并且这个值班表必须提前安排好!可以用一个在线表格,在就打钩,不能说你把这个人站在这里,看到这个人就说明在。

上面例子到我们的redis中,就是腾出一部分内存空间,为value值打标记,这就是我们布隆过滤器的思想。

3.2.1 布隆过滤器

 

位图里面只有0和1 zsc jack tom代表的是 value值 布隆过滤器的key, 向上指向的1 为两次hash后得到的位置 标记为1.但是我们没有办法判断tom是不是真的存在,因为Tom所在的两个位置与zsc和jack的hash冲突,因为无法判断tom是不是存在,但是布隆过滤器一定能够判断数据不存在。

思考: 那么怎么减少hash冲突呢? 多次hash; 增大位图大小。

还有一个弊端: 必须首先初始化数据到布隆过滤器,并且不能删除(就拿tom来说,如果tom删除了,第3和第5的位置就会置为0,影响其他的元素会导致 zsc和jack即使db中有,也判断为了没有)

实现方式:

1Redission 封装基于 Redis bitMap 实现分布
2.google.guava 本地内存.
3.Redis bloom模板  https://redis.io/docs/stack/bloom/

3.3 缓存击穿

缓存击穿是说单个key过期的时候有大量的并发访问。 解决办法: 使用互斥锁,回写redis,并且采用双重检查锁来提升性能,减少对DB的访问

以上,我们Mysql现在有集群等方案,所以也没那么脆弱,如果真的到了瓶颈我们也可以进行DB横向扩容

4. 慢查询分析

许多存储系统都会有慢日志查询,提供给开发跟运维来找到哪些指令是比较耗时的。比如Mysql,那么Redis中也会有慢日志查询。

但是Redis的慢查时间只会去统计执行指令的时间,不会统计网络消耗时间,所以没有慢查不代表没有超时。

多慢才是慢查询?可配

#The following time is expressed in microseconds , so   1000000  is equivalent   微秒表示
#to one second . Note that a negative number disables the slow log , while   负数禁用慢日志记录
#a value of zero forces the logging of every command 为0记录每个命令
slowlog - log - slower - than 10000    // 默认 10ms  建议1ms

最多存储多少慢查?可配

slowlog - max - len 128   // 最多存储 128 条数据

 如果发现慢查,怎么避免?

1. 尽量不要使用 hgetall keys 等指令
2. 调整大对象,变成多个子对象(一般超过 10K 就算比较大的 key ,但是根据业务来)

4.1 阻塞分析

1.业务记录好相关日志,以及降级报警等系统,知道有阻塞

2. 原因主要分为几个点
        2.1 外部原因:网络阻塞 CPU 竞争等
        2.2 内部原因:数据结构不合理导致大key 等单条指令耗时过大、 fork 子进程阻塞、AOF 刷盘阻塞

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

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

相关文章

深入解析Spring Cloud Config:构建高可用分布式配置中心

在微服务架构中,配置管理是一个关键问题。Spring Cloud Config提供了一种解决方案,它是一个高可用、分布式的外部配置中心。本文将深入探讨Spring Cloud Config的原理、架构及其在实际项目中的应用,帮助读者掌握如何构建一个高效、可靠的分布…

SD NAND(贴片式TF卡)在储能领域的应用

储能系统(Energy Storage System,简称ESS)是指能将电能以化学能、势能、动能等形式储存起来,并在需要时将其转化为电能供应给用户的设备。主要由电池管理系统(BMS)、能量管理系统(EMS&#xff0…

拿到Offer了才知道,这家公司年终奖只有几百块~

我也挠头了 最近又有不少粉丝上岸了,其中一位分享的事情比较有意思,和你分享一下: 以后你对比Offer的时候也可以多个经验。 事情是这样的: 他在经过2个多月空窗期之后终于拿到了Offer,月薪涨幅不大,但是…

java的clone

一、clone的用法: package chatRoom.F5;class Person implements Cloneable{//1.public String name;public Person(String name) {this.name name;}//2.protected Person clone() throws CloneNotSupportedException {return (Person)super.clone();//重写Object…

媒体有入口,发稿有入口 是什么意思?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体有入口,发稿有入口是指在新闻媒体发稿时,稿件可以通过一定的路径被访问和浏览。具体来说,有入口的新闻稿件可以通过点击链接,逐步深入…

芯片验证分享1 —— 开篇及名词解释

大家好,我是谷公子的藏经阁,今天和大家很高兴能和大家分享的是芯片验证中的一些内容,希望对大家的日常工作有所帮助,如果这些内容有帮助到大家的话,那么此次的分享就很值得。另外,对于这个课题,…

ChatTTS增强版,增强音质、批量处理、固定音色、支持长文本

大家好,最近ChatTTS文字生成语音项目挺火。只需要输入一段文字,就可以生成一段非常逼真的声音。声音的效果非常不错。它支持英文和中文两种语言。我在原版的基础上做了一些改动,整合包分享给大家。 功能介绍 除了基础的文本生成音频功能以外…

实验10 RIP协议配置

实验10 RIP协议配置 一、原理描述二、RIPv1配置(一)实验目的(二)实验内容(三)实验配置(四)实验步骤 三、 RIPv2配置(一)实验目的(二)实…

IT闲谈——什么是容器?

目录 什么是容器一、容器的起源与发展二、目前使用较多的容器三、容器能用来做什么四、容器的应用场景 什么是容器 随着云计算和微服务的兴起,容器技术逐渐成为IT行业的热门话题。容器,简而言之,是一种轻量级的、可移植的、独立的软件包&…

【Python】轻松打包:CentOS7上使用PyInstaller将Shell脚本转换为可执行文件的完美指南

【Python】轻松打包:CentOS7上使用PyInstaller将Shell脚本转换为可执行文件的完美指南 大家好 我是寸铁👊 总结了一篇【Python】轻松打包:CentOS7上使用PyInstaller将Shell脚本转换为可执行文件的完美指南✨ 喜欢的小伙伴可以点点关注 &#…

【CXL协议-控制和状态寄存器(8)】

8.0 控制和状态寄存器 Compute Express Link 设备控制和状态寄存器被映射到单独的空间:配置空间和内存映射空间。配置空间寄存器使用配置读取和配置写入进行访问。内存映射寄存器使用内存读取和内存写入进行访问。表 123 总结了本章中定义的寄存器位的属性。除非另…

人员身份级的数据中心机房作业随工

电信运营商的数据中心机房作为承载各类业务系统的物理基础,其运维安全直接关系到业务的连续性和数据的安全性。传统的机房管理方式依赖人工审核和监督,存在效率低下、安全隐患多等问题。因此,通过综合运用物联网、大数据分析和人工智能技术&a…

机器学习AI大模型的开源与闭源:哪个更好?

文章目录 前言一、开源AI模型1.1 开源的优点1.2 开源的缺点 二、闭源AI模型2.1 闭源的优点2.2 闭源的缺点 三、开源与闭源的平衡3.1 开源与闭源结合的案例3.2 开源与闭源的战略选择 小结 前言 在过去的几年里,人工智能(AI)和机器学习&#xf…

Docker 基础使用(3) 存储卷

文章目录 存储卷的含义存储卷的分类存储卷的作用存储卷的使用存储卷实际使用案例 ---- MySQL灾难恢复存储卷的局限 Docker 基础使用(0)基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用(2) 镜像与容器 Docker 基础使用…

LeetCode24_两两交换链表中的节点

. - 力扣(LeetCode) 一、题目: 二、模拟 1. 第一步 2. 第二步:current next.next 3. 第三步: next.next current 4. 第四步:pre.next next; 到这里为止实现了两个节点的交换 5. 第五步:pre current;…

【机器学习】朴素贝叶斯算法及其应用探索

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 朴素贝叶斯算法及其应用探索引言1. 朴素贝叶斯基本概念1.1 贝叶斯定理回顾1.2 朴…

基于 Spring Boot 博客系统开发(十三)

基于 Spring Boot 博客系统开发(十三) 本系统是简易的个人博客系统开发,为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。🌿🌿🌿 基于 Spring Boot 博客系统开发(十二)&…

【Linux-Uboot】

Linux-Uboot ■ Uboot使用 串口软件(超级终端)接受文件■ ■ Uboot使用 串口软件(超级终端)接受文件 添加链接描述 ■

NGINX之location和rewrite

一.NGINX常用的正则表达式 二.Location location作用:对访问的路径做访问控制或者代理转发 1.location 常用的匹配规则: 进行普通字符精确匹配,也就是完全匹配^~ / 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 …

JVM学习-监控工具(一)

使用数据说明问题,使用知识分析问题,使用工具处理问题 无监控,不调优! 命令行工具 在JDK安装目录下,可以查看到相应的命令行工具,如下图 jps(Java Process Status) 显示指定系统内所有的Hotpot虚拟机…