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.rhkb.cn/news/340610.html

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

相关文章

2021 hnust 湖科大 数据结构课设报告+代码

2021 hnust 湖科大 数据结构 课设报告代码 描述 hnust大一下学期数据结构课设的报告和源代码(放在了附录里面) 目录 项目名称完成日期页码复杂度分析(Ⅰ)2021-06-211—2复杂度分析(Ⅱ)2021-06-213—4Josephus问题(Ⅰ)2021-06-215—6Josephus问题(Ⅱ…

做抖音小店掌握这些方法,轻松和达人合作!

大家好,我是喷火龙。 抖店的新手商家想要出单,最快速稳定的出单方法无疑是与达人合作,通过达人的自身流量来帮助我们进行产品的转化。 接下来我就教大家怎么和达人合作。 首先我们可以通过蝉妈妈、达人广场、抖音私信等方式来找到我们想要…

Linux之线程互斥

线程简单封装 试着用线程控制力介绍的一些系统调用, 将线程的创建、执行和等待等都封装起来. 我们在程序中指定一个函数Print, 让多个线程不断地执行该函数. myThread.hpp #pragma once #include <functional> #include <pthread.h> #include <string>//假…

centos7下卸载MySQL,Oracle数据库

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

HiveMetastore

HiveMetastore 背后的存储 select * from DBS; select * from TBLS; select * from TABLE_PARAMS; 查找出没有 totalSize stats 的table SELECT DBS.NAME,t.TBL_NAME from DBS inner join (select DB_ID,TBL_NAME from TBLS where TBLS.TBL_ID not in(select TBL_ID from T…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称&#xff0c;意思是 用Java编写的服务器端的程序&#xff0c;Servlet被部署在服务器中&#xff0c;而服务器负责管理并调用Servle…

Leetcode:最长公共前缀

题目链接&#xff1a;14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;横向扫描&#xff09; 主旨&#xff1a;用第一个字符串与后续的每个字符串进行比较&#xff0c;先获取S1和S2的最长公共前缀&#xff0c;然后将该次比较获得的最长公共前缀…

自媒体利器-如何实现自媒体文章分发操作,自媒体怎么赚钱

大家好&#xff0c;我是网创有方的站长&#xff0c;由于最近在做自媒体&#xff0c;发现一个非常让人苦恼的问题&#xff0c;就是多平台分发操作&#xff0c;市面上有那种多平台一键发布的工具&#xff0c;但通常都要收费才能用&#xff0c;所以特别自制了一个免费使用的小工具…

巨详细Linux安装MySQL

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

数据结构练习题——Java实现

20240531-时间复杂度 1、消失的数字 方法一&#xff1a;位运算 两个数字一样的数组&#xff0c;其中一个数组中少了一个数字&#xff0c;定义一个变量分别异或两个数组&#xff0c;结果即为缺少的数字 class Solution {public int missingNumber(int[] nums) {int xor 0;int…

ChatGPT 宕机部分用户访问报错 api key开发应用不影响

就在今日4号下午&#xff0c;有部分用户反映ChatGPT访问报错&#xff0c;不幸的是&#xff0c;ChatGPT 目前对某些用户不可用 - 该问题已被发现&#xff0c;OpenAI 团队正在努力解决它 似乎就api 开发使用key的应用不受影响 以下是对接ChatGPT api key开发的应用正常对话

[数据集][目标检测]室内积水检测数据集VOC+YOLO格式761张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;761 标注数量(xml文件个数)&#xff1a;761 标注数量(txt文件个数)&#xff1a;761 标注类别…

【机器学习系列】掌握随机森林:从基础原理到参数优化的全面指南

目录 目录 一、随机森林简介 (一)随机森林模型的基本原理如下&#xff1a; (二)随机森林模型的优点包括&#xff1a; (三)森林中的树的生成规则如下&#xff1a; (四)在随机森林中&#xff0c;每棵树都使用不同的训练集进行训练&#xff0c;原因如下 随机森林的分类性能&…

全网唯一:触摸精灵iOS版纯离线本地文字识别插件

目的 触摸精灵iOS是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但触摸精灵的图色功能比较单一&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要…

2024年Python最新30道练手题(附详细答案),新手小白必备项目学习资源!

今天给大家分享2024年最新30道Python练习题&#xff0c;建议大家先独立思考一下解题思路&#xff0c;再查看答案。&#xff08;文末附python学习资料&#xff09; 1. 已知一个字符串为 “hello_world_yoyo”&#xff0c;如何得到一个队列 [“hello”,”world”,”yoyo”] &…

ChatGPT Mac客户端 下载安装教程(免费 不限次数使用 还支持语音聊天)

ChatGPT Mac客户端 下载安装教程&#xff08;免费 不限次数使用 还支持语音聊天&#xff09; 免费 不限次数使用 还支持语音聊天 系统要求&#xff1a; macOS 14 和 Apple Silicon&#xff08;M1 或更高版本&#xff09; 文章目录 ChatGPT Mac客户端 下载安装教程&#xff08;…

【scau大数据技术与原理2】综合性实验Spark集群的安装和使用——安装启动spark shell篇

实验内容简介&#xff1a; Spark是一个分布式计算框架&#xff0c;常用于大数据处理。本次实验中&#xff0c;首先设计一个包含主节点和从节点的Spark集群架构&#xff0c;并在CentOS的Linux环境下进行搭建。通过下载并解压Spark安装包&#xff0c;配置环境变量和集群参数&…

Kaggle平台进行Python版本降级

前言 最近在复现语音合成模型VITS&#xff0c;由于目前没有算力故去Kaggle白嫖运算资源。 VITS的运行环境要求如下 Cython0.29.21 librosa0.8.0 matplotlib3.3.1 numpy1.18.5 phonemizer2.2.1 scipy1.5.2 tensorboard2.3.0 torch1.6.0 torchvision0.7.0 Unidecode1.1.1截至2…

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

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

SDL教程(二)——Qt+SDL播放器

前言 ​ 这篇文章主要是使用SDL来打开视频&#xff0c;显示视频。后续会再继续使用SDL来结合FFmpeg。来能够直接使用网上的demo进行学习。 正文 一、环境 Qt 5.15.2 MSVC2019 64bit Win11 二、Qt搭建SDL Qt搭建&#xff0c;我觉得相比用VS2019来说&#xff0c;更为方便&…