Redis 分布式缓存

news2025/1/17 14:01:58

分布式缓存

单点 Redis 的问题及解决

  • 数据丢失:实现Redis数据持久化
  • 并发能力:搭建主从集群,实现读写分离
  • 存储能力:搭建分片集群,利用插槽机制实现动态扩容
  • 故障恢复能力:利用哨兵机制,实现健康检测和自动恢复

RDB

RDB全称Redis Database Backup file (Redis数据备份文件),也被叫做Redis数据快照,简单来说就是把内存中的所有数据都记录到磁盘上,当Redis实时故障重启后,从磁盘读取快照文件,恢复数据

save #由Redis主进程来执行RDB,会阻塞所有命令

bgsave #开启子进程执行RDB,避免主进程收到影响,推荐

RDB默认是开启的,内部有触发机制,可以在redis.conf文件中找到,RDB文件也支持压缩;Redis关闭时,也会触发一次RDB

RDB方式bgsave的基本流程

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新的RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000的含义?

  • 默认时停止服务的时候
  • 代表60s内至少执行1000次修改才会触发RDB

RDB的缺点

  • RDB执行间隔时间长,两次RDB之间的写入数据由丢失的风险
  • fork子进程、压缩、写RDB文件比较耗时

AOF

AOF全称Append Only Field(追加文件)。Redis处理的每一个写命令都会记录在AOF文件。可以看做时命令日志文件。

AOF默认是关闭的,AOF的命令记录频率也可以通过修改redis.conf文件修改

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always

# 写命令执行完先放到AOF缓冲区,然后表示每隔1s将缓冲区数据写入到AOF文件,是默认方案
appendfsync everysec

# 写入命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写到磁盘
appendfsync no
  • 因为AOF记录的是每次写的命令。AOF文件会比RDB文件大,而且AOF中会记录对同一个key的多次写操作,但是只有最后一次的才有意义,通过执行bgreWriteaop命令,可以让AOF文件执行重写功能,用最少得命令达到相同的效果

  • Redis也会在触发阈值时自动去重写AOF文件,阈值也可以在redis.conf中配置

    # AOF文件比上次文件增长超过多少百分比触发重写
    auto-aof-reWrite-percentage 100
    
    # AOF文件体积最小多大以上才触发重写
    auto-aof-rewrite-min-size 64mb
    
  • AOF和RDB同时开启,会以AOF优先;在实际的开发中往往结合两者使用

Redis主从

单点的Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离;

在这里插入图片描述

主从数据同步原理

第一次是全量同步

在这里插入图片描述

全量同步的流程

  1. slave节点请求增量同步
  2. master节点判断replid,发现不一致,拒绝增量同步
  3. master将完整的内存数据生成RDB文件,发送RDB到slave
  4. slave清空本地数据,加载master的RDB文件
  5. master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave

如果slave重启后,执行增量同步

哨兵(Sentinel)

Redis提供哨兵(Sentinel)机制来实现主从集群的自动恢复

  • 监控:哨兵会不断监控master和slave的健康状况
  • 故障自动恢复:当master故障时,Sentinel哨兵会将其中一个slave提升为master,当老master恢复后,还是以新的master为主
  • 通知:哨兵充当Redis客户端发现来源,当集群发生故障转移时,会将最新的消息推送给Redis的客户端

哨兵基于心跳监测机制,每个1s向集群的每一个实例发送ping命令:

  • 主观下线:如果某个哨兵节点发现某实例为在规定时间内响应,则认为该实例主观下线
  • 客观下线:若超过指定数量(quorum)的哨兵都认为该实例主观下线,则该实例客观下线,类似投票机制

选举新的master

  • 首先会判断slave节点与master节点断开时间的长短,如果超过指定值,则会排除在外
  • 然后根据slave节点的slave-priority,越小优先级越高
  • slave一样,则判断slave节点的offset值。越大说明数据越新,优先级越高
  • 最后判断slave节点的运行id大小,越小优先级越高

故障转移

  • Sentinel哨兵给备选的slave发送命令,让该节点称为新的master
  • 哨兵给所有的其它slave发送命令,让这些节点成为新master的slave节点,开始从master同步数据
  • 最后,哨兵将故障节点,也就是老的master标记为slave从节点

Redis分片集群

在这里插入图片描述

主从和哨兵解决了高可用、高并发读的问题,但依然有两个问题没有解决:

  • 海量数据存储问题
  • 高并发写的问题

使用分片集群可以解决以上问题

  • 集群中有多个master,每个master保存不同的数据
  • 每个master都可以有多个slave节点
  • master之间通过ping监测彼此健康状态
  • 客户端请求可以访问集群中的任一个节点,最终都会被转发到正确的节点上

散列插槽

  1. Redis会把每个master节点映射到0~16383共16384个插槽(Hash slot)上
  2. 数据key不是与节点绑定,而是与插槽绑定,Redis会根据key的有效部分计算插槽值,分为两种情况:
    • key中包含"{}“,且”{}“中至少包含一个字符,”{}"中的部分是有效部分,这就实现了控制不同的key在同一插槽上
    • 可以中不包含"{}",整个可以都是有效部分
    • 计算方式是利用CRC16算法得到一个Hash值,然后对16384取余,得到的就是slot值

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

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

相关文章

Linux系统编程(进程基础知识讲解)

文章目录 前言一、进程的概念二、进程的生命周期三、进程树四、进程的创建五、一个进程可以执行几个程序?六、子进程中调用execve函数总结 前言 本篇文章来讲解Linux中的进程,进程在Linux中是非常重要的一个知识点,掌握好进程是非常重要的。…

postgresql源码学习(56)—— explain是如何快速估算pg表行数的

当我们需要大致知道表行数,但又不需要很精确时,可以采用以下方法 一、 统计信息 pg_class.reltuples 最简便的方法是利用pg_class.reltuples,类似oracle的num_rows postgres# select reltuples::numeric from pg_class where relnamepgbenc…

VUE 2X 表单数据过滤器 ⑨

目录 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ V u e j s Vuejs Vuejs收集表单数据过滤器 使用 C o o k i e Cookie Cookie 影响总结 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹…

【计算机组成原理】RISC-V模型机的有限状态控制器设计

目录 一、RISC-V模型机的目标指令集 二、RISC-V模型机的部件设计 三、运算及传送指令的数据通路设计 四、访存指令的数据通路设计 五、转移类指令的数据通路设计 六、RISC-V模型机控制单元CU的有限状态机设计 一、RISC-V模型机的目标指令集 取指令并译码:根据…

编译原理笔记16:自下而上语法分析(3)构造 DFA、DFA 对下一步分析的指导(有效项目)

目录 由 NFA 用子集法构造 DFA由 LR(0) 项目直接构造识别活前缀的 DFA构造 DFA求拓广文法 GCLOSURE & GO例: 构造 DFA DFA 指导下一步分析有效项目 看了前面的内容,我们已经了解到:分析表和驱动器算法,是 LR 分析器的核心。 …

实训四:索引与视图 - SQL视图(teachingdb数据库)

SQL视图的定义与操纵 第1关:创建视图任务描述相关知识视图的定义创建视图 编程要求测试说明参考代码 第2关:创建视图-练习一任务描述相关知识编程要求测试说明参考代码 第1关:创建视图 任务描述 本关任务:建立计算机系的学生的视…

团体程序设计天梯赛-练习集L1篇⑧

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

C语言scanf/fscanf/sscnaf和printf/fprintf/sprintf的区别

总结 1.scanf/printf 是标准输入输出流函数(键盘、屏幕)。 2.fscanf/fprintf 适用于所有输入输出流(文件、键盘、屏幕…)。 3.sscanf/sprintf 是把格式化的数据写入某个字符串中,从某个字符串中读取格式化的数据。 第一组:scanf/printf scanf/printf是…

Oracle数据库从入门到精通系列之十八:详细总结Oracle数据库核心知识点

Oracle数据库从入门到精通系列之十八:详细总结Oracle数据库核心知识点 一、Oracle数据库核心概念二、Oracle非容器数据库三、Oracle容器数据库四、容器数据库和非容器数据库的区别五、Oracle数据库多租户六、Oracle数据库多租户数据库模型七、Oracle数据库类型八、O…

实训四:索引与视图 - MySQL开发技巧 - 索引

MySQL开发技巧 - 索引 任务描述相关知识索引是什么索引的分类索引的创建和删除查询表中索引 编程要求测试说明代码参考: 任务描述 本关任务:按照要求完成索引的创建。 相关知识 为了完成本关任务,你需要掌握: 索引是什么&#…

【Leetcode60天带刷】day31回溯算法——455.分发饼干 ,376. 摆动序列 , 53. 最大子序和

​ 题目: 455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块…

Android 13(T) - binder阅读(3)- binder相关的类

原先准备在binder阅读(3)中记录ServiceManager的使用,但是写着写着发现,如果不了解和binder相关的类,那么阅读起来将会由很多困惑,所以就先来记录binder相关的类了。记录完发现特别凌乱…先就这样吧。 1 UM…

【致敬未来的攻城狮计划】打卡3:点亮LED

点亮LED 本文主要参考文章:【致敬未来的攻城狮计划】— 连续打卡第十一天:FSP固件库开发点亮第一个灯。_嵌入式up的博客-CSDN博客 在32阶段我们已经接触过类似做法了。初始化引脚模式(可以手动库函数,或者在工具包图形化界面里配…

实训四:索引与视图 - MySQL开发技巧 - 视图

MySQL开发技巧 - 视图 任务描述相关知识视图的定义创建视图操作视图删除视图 编程要求测试说明参考代码 任务描述 本关任务:通过学习视图,创建一个单表视图和一个多表视图。 相关知识 为了完成本关任务,你需要掌握: 视图的定义…

工地扬尘智能监测系统 yolov7

工地扬尘智能监测系统通过yolov7网络算法模型技术,实时监测工地施工中的扬尘情况。工地扬尘智能监测系统利用AI视频智能分析技术,并将数据传输到数据中心进行分析。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队希望它能够同时支…

数据库管理-第八十四期 X10M来了(20230624)

数据库管理 2023-06-24 第八十四期 X10M来了1 Intel -> AMD2 PMEM -> XRMEM3 DDR4 -> DDR54 Flash cards总结 第八十四期 X10M来了 在第四十三期的时候,我曾经憧憬过Exadata X10M的到来,Oracle于6月22日正式公布Exadata X10M系列。其实5月已经…

chatgpt赋能python:Python在电气行业中的应用——从数据分析到自动化控制

Python在电气行业中的应用——从数据分析到自动化控制 介绍 Python语言作为一种高级编程语言,越来越受到电气行业的关注。随着互联网、物联网以及大数据时代的到来,电气行业需要将传统的工业控制与现代化的数据分析、智能决策等技术相结合,…

Java——《面试题——Dobbo篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 目录…

springboot+mybatis笔记学习

1.环境搭建 1.引入pom依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version> </dependency> <dependency><groupId>org…

人工智能(2):机器学习算法分类

根据数据集组成不同&#xff0c;可以把机器学习算法分为&#xff1a; 监督学习无监督学习半监督学习强化学习 1 监督学习 定义&#xff1a; 输入数据是由输入特征值和目标值所组成。 函数的输出可以是一个连续的值(称为回归&#xff09;&#xff0c;或是输出是有限个离散值&…