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.mfbz.cn/a/678461.html

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

相关文章

HTML、HTML5一览

文章目录 HTML简介标签基本标签格式化文本链接图像块级元素列表表格框架表单实体 HTML5 此篇用于优化csdn第一篇文章 HTML 简介 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而是一种标记语言…

sublime如何写python

推荐一款好用且轻量级的编辑器——sublime—text3,sublime现在支持的语言有很多。 右边弹出的列表可以往下拉,亮点是支持了python,而且不需要安装任何的python环境,直接下载sublime就可以编写python代码并运行了。 使用方法&…

Java面经——SpringCloud微服务

SpringCloud SpringCloud的五大组件 注册中心网关远程调用负载均衡熔断降级 谈谈你对SpringCloud的理解 SpringCloud是为了解决微服务架构中出现的一系列服务治理难题的而提出的一套规范,统一了标准。降低了微服务架构的开发难度。有了 Spring Cloud 这样的技术生…

Three.js——基础纹理、凹凸纹理、法向贴图、环境贴图、canvas贴图

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

linux嵌入式设备测试wifi信号强度方法

首先我们要清楚设备具体链接在哪个wifi热点上 执行:nmcli dev wifi list rootubuntu:/home/ubuntu# nmcli dev wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS > * 14:EB:08:51:7D:20 wifi22222_5G Infr…

香橙派安装 opencv 4.9.0

香橙派Orange AI Pro / 华为昇腾310 使用源码方式安装opencv 4.9.0 下载源码到香橙派 https://opencv.org/releases/ 解压 unzip opencv-4.9.0.zip进入解压后的文件 cd opencv-4.9.0创建构建目录build mkdir build进入目录 cd build使用cmake配置后续的构建环境 cmake -D…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(二)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

SpringBoot校园疫情管理系统-计算机毕业设计源码81164

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,校园当然也不例外。校园疫情管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用J…

SmartEDA:Multisim与Proteus的强劲对手,引领电子设计新纪元

在电子设计领域,Multisim与Proteus长久以来一直占据着重要的地位,它们以其强大的仿真功能和丰富的组件库,深受设计师们的喜爱。然而,随着科技的不断进步和创新,一款名为SmartEDA的新兴电子设计工具正悄然崭露头角&…

MYSQL数据库客户端常规指令使用

这里新开一章,对MYSQL进行更加底层的系统的一个学习 Mysql常用工具简介 emmmm这里的话就默认大家在linux系统上面都进行了MYSQL的安装了. 在mysql安装完成之后,一般在路径 /usr/bin 下的 我们对该路径进行一个文件的展示 这里是展示出来的辅助工具 …

Web3.0区块链技术开发方案丨ICO与IDO代币开发

在Web3.0时代的到来下,区块链技术不仅改变着金融领域的格局,也在资金筹集和代币发行方面掀起了一场变革。初始代币发行(ICO)和去中心化代币发行(IDO)成为了项目融资的主要方式,其基于区块链技术…

【android 9】【input】【8.发送按键事件2——InputDispatcher线程】

系列文章目录 本人系列文章-CSDN博客 目录 系列文章目录 1.简介 1.1流程介绍 1.2 时序图 2.普通按键消息发送部分源码分析(按键按下事件) 2.1 开机后分发线程阻塞的地方 2.2 InputDispatcher::dispatchOnceInnerLocked 2.3 InputDispatcher::disp…

有没有不用写代码,贴图也简单的HTML WEB 3D 产品展示配置器?

品牌零售商,产品有3D模型但没有贴图,以前是直接送去生产,现在需要上线电商,看到国外挺多这种展示方式的网店,国内有没有这方面的供应商,网店顾客可以自己鼠标转动、换零件、换颜色等看定制效果,…

深入理解并发之LongAdder、DoubleAdder的实现原理

深入理解LongAdder、DoubleAdder的实现原理 本文主要通过LongAdder和DoubleAdder的源码,讲述一下其实现原理。通过LongAdder和DoubleAdder的源码可知。两者都是继承了Striped64的类。下面我们将通过源码的形式讲述一下这三个类都做了哪些事情。 1: Striped64 ​ …

用C#(WinForm)开发触摸屏,体验感满满

用C#(WinForm)开发触摸屏,体验感满满

人工智能大模型的进化之路:探索如何让它们变得更“聪明”

一、引言 在人工智能(AI)领域,大模型凭借其强大的处理能力和广泛的应用前景,已经成为研究的热点。然而,尽管这些模型在多个领域展现出了惊人的能力,但它们仍然面临着理解力、泛化能力和适应性等方面的挑战…

中央空调节能的分户计费系统

中央空调节能 在建筑能耗中,中央空调能耗一般占到了40%---60%的比例,因此如何有效降低空调能耗就成为建筑节能的重中之重。 项目案例描述 山东银座购物广场:为集购物中心、高级酒店式公寓和办公为一体的综合性公共建筑。整体建筑共为地下3层&…

我们身边的北斗:你知道吗北斗还能帮我们演唱会抢票

当我们步入2024年,演唱会与音乐节的热潮依然不减。每当周末或节假日,各大城市的演唱会场馆总是人头攒动,歌声与掌声交织成一片欢乐的海洋。而在朋友圈里,也总能看到乐迷们晒出的演唱会现场照片和视频,分享着那份独特的…

智领未来,安全无忧:智能网联汽车监控大屏的守护之旅

在繁忙的都市中,驾驶者往往面临着诸多安全隐患。传统的驾驶辅助系统虽然能够提供一定的帮助,但在复杂多变的交通环境中,其局限性也逐渐显现。而智能网联汽车安全监控大屏,正是为了解决这一问题而诞生的。 山海鲸可视化大屏 大屏采…

36. 【Java教程】输入输出流

本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。 1…