当前位置: 首页 > news >正文

redis主备切换,哨兵模式,缓存穿透、缓存击穿、缓存雪崩问题

主备切换
主从复制指的是把一台Redis服务器的数据复制到其他Redis服务器上,前者称为主节点Master,后者称为从节点Slave,只能从Master单向复制到Slave,一般Master以写操作为主,Slave以读操作为主,实现读写分离。

作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
命令
slaveof host port    将当前服务器转变为指定服务器的从属服务器。如果已是slave则停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。SLAVEOF NO ONE将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
info [section]    INFO命令以一种易于理解和阅读的格式,返回关于Redis服务器的各种信息和统计数值。通过给定可选的参数 section ,可以让命令只返回某一部分的信息:
配置
以单机多服务为例(正常是多机多服务,然我只有一台服务器)

首先每个redis客户端都默认是主机,可以通过info replication命令查看
那么我们现在要同时开三个客户端,模拟一主两从,所以要修改配置:

修改端口号
修改pid名字
修改log名字
修改rdb名字
设置主机连接(可不选,用命令行)
先拷贝两份配置文件作为从机配置,主机可使用默认。

哨兵模式
上面的80上位和嵌套主从都是我们手动命令行输入的,其目的就是避免主机宕机后写操作的空窗期,这些都是需要人工干预。
哨兵Sentinel会作为一个独立的进程独立运行,其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis服务器。
如果哨兵检测到主机下线,则会选一个从机「上位」(自动故障迁移)成为新的主机。如果原主机上线,原主机将变成新主机的从机。其原理是通过发布订阅模式通知其他服务器,修改配置文件,从而切换主机。

如果哨兵宕机怎么办?可以使用多哨兵模式

主观下线(Subjectively Down, 简称 SDOWN)指的是单个哨兵实例对服务器做出的下线判断。
客观下线(Objectively Down, 简称 ODOWN)指的是多个哨兵实例在对同一个服务器做出主观下线判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。
当主机客观下线后,哨兵会投票出新的主机(具体算法略 ),进行自动故障迁移(failover),通过发布订阅通知其他服务器切换主机。
多哨兵模式,配置不同端口的配置文件来开启多个哨兵客户端,然后照葫芦画瓢即可

如何应对缓存穿透、缓存击穿、缓存雪崩问题
8.1. Key 的过期淘汰机制
Redis 可以对存储在 Redis 中的缓存数据设置过期时间,比如我们获取的短信验证码一般十分钟
过期,我们这时候就需要在验证码存进 Redis 时添加一个 key 的过期时间,但是这里有一个需要格
外注意的问题就是:并非 key 过期时间到了就一定会被 Redis 给删除。
8.1.1. 定期删除
Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 Key ,检查其是否过期,如果过
期就删除。为什么是随机抽取而不是检查所有 key ?因为你如果设置的 key 成千上万,每 100 毫秒
都将所有存在的 key 检查一遍,会给 CPU 带来比较大的压力。
8.1.2. 惰性删除
定期删除由于是随机抽取可能会导致很多过期 Key 到了过期时间并没有被删除。所以用户在
从缓存获取数据的时候, redis 会检查这个 key 是否过期了,如果过期就删除这个 key 。这时候就
会在查询的时候将过期 key 从缓存中清除。
8.1.3. 内存淘汰机制
# 最大空闲连接,默认 8
max-idle : 200
# 最小空闲连接,默认 0
min-idle : 5
# 哨兵模式
sentinel :
# 主节点名称
master : mymaster
# 节点
nodes :
192.168.10.100 : 26379,192.168.10.100 : 26380,192.168.10.100 : 26381
@Bean
public RedisSentinelConfiguration redisSentinelConfiguration (){
RedisSentinelConfiguration sentinelConfig = new
RedisSentinelConfiguration ()
// 主节点名称
. master ( "mymaster" )
// 主从服务器地址
. sentinel ( "192.168.10.100" , 26379 )
. sentinel ( "192.168.10.100" , 26380 )
. sentinel ( "192.168.10.100" , 26381 );
// 设置密码
sentinelConfig . setPassword ( "root" );
return sentinelConfig ;
} 仅仅使用定期删除 + 惰性删除机制还是会留下一个严重的隐患:如果定期删除留下了很多已
经过期的 key ,而且用户长时间都没有使用过这些过期 key ,导致过期 key 无法被惰性删除,从而
导致过期 key 一直堆积在内存里,最终造成 Redis 内存块被消耗殆尽。那这个问题如何解决呢?这
个时候 Redis 内存淘汰机制应运而生了。 Redis 内存淘汰机制提供了 6 种数据淘汰策略:
volatile-lru :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile - ttl :从已设置过期时间的数据集中挑选将要过期的数据淘汰。
volatile - random :从已设置过期时间的数据集中任意选择数据淘汰。
allkeys - lru :当内存不足以容纳新写入数据时移除最近最少使用的 key
allkeys - random :从数据集中任意选择数据淘汰。
no - enviction (默认) :当内存不足以容纳新写入数据时,新写入操作会报错。
一般情况下,推荐使用 volatile - lru 策略,对于配置信息等重要数据,不应该设置过期时
间,这样 Redis 就永远不会淘汰这些重要数据。对于一般数据可以添加一个缓存时间,当数据失
效则请求会从 DB 中获取并重新存入 Redis 中。
8.2. 缓存击穿
首先我们来看下请求是如何取到数据的:当接收到用户请求,首先先尝试从 Redis 缓存中获取
到数据,如果缓存中能取到数据则直接返回结果,当缓存中不存在数据时从 DB 获取数据,如果
数据库成功取到数据,则更新 Redis ,然后返回数据
定义 :高并发的情况下,某个热门 key 突然过期,导致大量请求在 Redis 未找到缓存数据,进而
全部去访问 DB 请求数据,引起 DB 压力瞬间增大。
解决方案 :缓存击穿的情况下一般不容易造成 DB 的宕机,只是会造成对 DB 的周期性压力。对
缓存击穿的解决方案一般可以这样:
Redis 中的数据不设置过期时间,然后在缓存的对象上添加一个属性标识过期时间,每次获
取到数据时,校验对象中的过期时间属性,如果数据即将过期,则异步发起一个线程主动
更新缓存中的数据。但是这种方案可能会导致有些请求会拿到过期的值,就得看业务能否
可以接受,
如果要求数据必须是新数据,则最好的方案则为热点数据设置为永不过期,然后加一个互
斥锁保证缓存的单线程写。
8.3. 缓存穿透
定义 :缓存穿透是指查询缓存和 DB 中都不存在的数据。比如通过 id 查询商品信息, id 一般大
0 ,攻击者会故意传 id -1 去查询,由于缓存是不命中则从 DB 中获取数据,这将会导致每次缓
存都不命中数据导致每个请求都访问 DB ,造成缓存穿透。
解决方案
利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则
休眠一段时间重试
采用异步更新策略,无论 key 是否取到值,都直接返回。 value 值中维护一个缓存失效时
间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热 ( 项目启动
前,先加载缓存 ) 操作。
提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列
合法有效的 key 。迅速判断出,请求所携带的 Key 是否合法有效。如果不合法,则直接返
回。 如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为
60 秒。
8.4. 缓存雪崩
定义 :缓存中如果大量缓存在一段时间内集中过期了,这时候会发生大量的缓存击穿现象,所
有的请求都落在了 DB 上,由于查询数据量巨大,引起 DB 压力过大甚至导致 DB 宕机。
解决方案
给缓存的失效时间,加上一个随机值,避免集体失效。如果 Redis 是集群部署,将热点数据
均匀分布在不同的 Redis 库中也能避免全部失效的问题
使用互斥锁,但是该方案吞吐量明显下降了。
设置热点数据永远不过期。
双缓存。我们有两个缓存,缓存 A 和缓存 B 。缓存 A 的失效时间为 20 分钟,缓存 B 不设失效时
间。自己做缓存预热操作。然后细分以下几个小点
1. 从缓存 A 读数据库,有则直接返回
2. A 没有数据,直接从 B 读数据,直接返回,并且异步启动一个更新线程。
3. 更新线程同时更新缓存 A 和缓存 B

相关文章:

redis主备切换,哨兵模式,缓存穿透、缓存击穿、缓存雪崩问题

主备切换 主从复制指的是把一台Redis服务器的数据复制到其他Redis服务器上,前者称为主节点Master,后者称为从节点Slave,只能从Master单向复制到Slave,一般Master以写操作为主,Slave以读操作为主,实现读写分…...

2023山东icpc省赛总结

距离比赛结束已经一天多了,现在的感觉就是三个字:意难平。 这是我们第一次打现场赛,去之前真的是很激动。因为我们比赛前做了很多其他省的省赛模拟,也做了几套今年别的省的题目,做完会去搜题解,会看到别人写…...

linux0.12-12-fs

[606页] 第12章 文件系统 606–12-1-总体功能 607–12-1-1-MINIX文件系统 611–12-1-2-文件类型、属性和目录项 615–12-1-3-高速缓冲区 616–12-1-4-文件系统底层函数 616–12-1-5-文件中数据的访问操作 618–12-1-6-文件和目录管理系统调用 619–12-1-7-360KB软盘中文件系统…...

快速入门SpringMVC 学习

目录 SpringMVC 定义 MVC定义 创建SpringMVC项目 SpringMVC掌握功能 一、连接功能 RequestMapping(请求映射) GetMapping 和 PostMapping 二、获取参数功能 传递单个参数/多个参数 注意点: RequestParam(前后端参数映射) 前后端参数映射 RequestParam特…...

leetcode96--不同的二叉搜索树[java]

不同的二叉搜索树 leetcode 96 题 不同的二叉搜索树题目描述暴力递归解题思路代码演示执行效率 递归 缓存解题思路代码演示执行效率 动态规划专题 leetcode 96 题 不同的二叉搜索树 原题链接: 难度—中等 https://leetcode.cn/problems/unique-binary-search-trees/ 题目描述 …...

【Spring 项目的创建和使用】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 1. 创建 Spring 项目 2. 创建一个 普通 Maven…...

数据类型.

数据类型 数据类型分类 数值类型 tinyint类型 数值越界测试: mysql> create table tt1(num tinyint); Query OK, 0 rows affected (0.02 sec)mysql> insert into tt1 values(1); Query OK, 1 row affected (0.00 sec)mysql> insert into tt1 values(128…...

深入了解JavaScript中的Promise

在JavaScript中,异步编程是必不可少的。过去,我们通常使用回调函数来处理异步操作,但回调地狱(callback hell)和复杂的错误处理使得代码难以维护。为了解决这些问题,ES6引入了Promise,它是一种更…...

Solidity基础六

生活本来就是平凡琐碎的,哪有那么多惊天动地的大事,快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…...

自学网络安全解决问题方法

自学网络安全很容易学着学着就迷茫了,找到源头问题,解决它就可以了,所以首先咱们聊聊,学习网络安全方向通常会有哪些问题,看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间,光语言都有几门&#xf…...

Java之旅(七)

Java 异常 Java异常(Exception)是在程序运行过程中出现错误或异常情况时,由程序自动抛出,导致程序无法正常运行,用于向上层调用程序传递错误信息或中断程序执行的一种机制。 异常与错误不同,错误是由于程…...

测试报告模板二

项目名称 系统测试报告 平台测试小组 2023年x月xx日 文档信息 文档名称: 作者:...

C语句概述

1 、 C 语句分类: ①控制语句:二个分支语句( if-else 、 switch ),三个循环语句( for 、 while 、 do - while ),四个转移语句( continue 、 break 、 goto 、 return…...

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…...

【算法竞赛进阶指南】141.周期 题解 KMP 最小循环节

题目描述 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如 abaab 共有 5 5 5 个前缀,分别是 a,ab,aba,abaa,abaab。 我们希望知道一个 N N N 位字符串 S S S 的前缀是否具有循环节。 换言之…...

【Springboot 入门培训 】#19 Spring Boot 组件扫描与bean生命周期

目录 1 什么是组件扫描2 何时使用组件扫描3 扫描整个包basePackages与 includeFilters4 Spring boot 的 Bean 生命周期4.1 生命周期4.2 Bean 生命周期4.3 周期各个阶段 首先,我想先为你介绍一下“Spring”,这是一个开放源代码的设计模式解决方案和轻量级…...

Linux printf 函数输出问题

printf 函数并不会直接将数据输出到屏幕&#xff0c;而是先放到缓冲区中&#xff0c;只有一下三种情况满足&#xff0c;才会输出到屏幕。 1&#xff09; 缓冲区满 2&#xff09; 强制刷新缓冲区 fflush 3&#xff09; 程序结束时 1 #include<stdio.h>2 #include<st…...

皮卡丘Unsafe Fileupload

1.不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按照设计的格式进行…...

最优化简明版(上)

引言 本文简单地介绍一些凸优化(Convex Optimization)的基础知识&#xff0c;可能不会有很多证明推导&#xff0c;目的是能快速应用到机器学习问题上。 凸集 直线与线段 设 x 1 ≠ x 2 x_1 \neq x_2 x1​x2​为 R n \Bbb R^n Rn空间中的两个点&#xff0c;那么具有下列形…...

MySQL的一些介绍

1. SQL的select语句完整的执行顺序 SQL Select语句完整的执行顺序&#xff1a; 1、from子句组装来自不同数据源的数据&#xff1b; 2、where子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&am…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...