Redis 学习笔记(2)

目录

  • 1 Redis的持久化
    • 1.1 RDB持久化方案
    • 1.2 AOF持久化方案
  • 2 Redis架构
    • 2.1 主从复制架构
    • 2.2 哨兵集群设计
    • 2.3 哨兵集群设计
  • 3 Redis事务机制
  • 4 Redis过期策略与内存淘汰机制
    • 4.1 过期策略
    • 4.2 内存淘汰机制
  • 5 Redis高频面试题
    • 4.1 缓存穿透
    • 4.2 缓存击穿
    • 4.3 缓存雪崩

1 Redis的持久化


由于 redis 是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以 redis 的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。

1.1 RDB持久化方案


RDB方案是Redis默认的持久化方案。

  • 按照一定的时间内,如果Redis内存中的数据产生了一定次数的更新,就将整个Redis内存中的所有数据拍摄一个全量快照文件存储在硬盘上
  • 新的快照会覆盖老的快照文件,快照是全量快照,包含了内存中所有的内容,基本与内存一致。
  • 如果Redis故障重启,从硬盘的快照文件进行恢复。

在这里插入图片描述

RDB快照存储于Redis目录下datas文件夹下dump.rdb

触发条件

  • 手动触发:当执行某些命令时,会自动拍摄快照【一般不用】
    • save:手动触发拍摄RDB快照的,将内存的所有数据拍摄最新的快照
      • 前端运行
      • 阻塞所有的客户端请求,等待快照拍摄完成后,再继续处理客户端请求
      • 特点:快照与内存是一致的,数据不会丢失,用户的请求会被阻塞
    • bgsave:手动触发拍摄RDB快照的,将内存的所有数据拍摄最新的快照
      • 后台运行
      • 主进程会fork一个子进程负责拍摄快照,客户端可以正常请求,不会被阻塞
      • 特点:用户请求继续执行,用户的新增的更新数据不在快照中
    • shutdown:执行关闭服务端命令
    • flushall:清空,没有意义
  • 自动触发:按照一定的时间内发生的更新的次数,拍摄快照
    • 配置文件中有对应的配置,决定什么时候做快照
#Redis可以设置多组rdb条件,默认设置了三组,这三组共同交叉作用,满足任何一个都会拍摄快照
save 900 1
save 300 10
save 60 10000

为什么默认设置3组?如果只有一组策略,面向不同的写的场景,会导致数据丢失。针对不同读写速度,设置不同策略,进行交叉保存快照,满足各种情况下数据的保存策略。

总结:

  • 优点
    • rdb方式实现的是全量快照,快照文件中的数据与内存中的数据是一致的
    • 快照是二进制文件,生成快照加载快照都比较快,体积更小
    • Fork进程实现,性能更好
    • 总结:更快、更小、性能更好
  • 缺点
    • 存在一定概率导致部分数据丢失
  • 应用:希望有一个高性能的读写,不影响业务,允许一部分的数据存在一定概率的丢失【做缓存】,大规模的数据备份和恢复

1.2 AOF持久化方案


RDB存在一定概率的数据丢失,如何解决?

AOF方案

  • 按照一定的规则,将内存数据的操作日志追加写入一个文件中;
  • 当Redis发生故障,重启,从文件中进行读取所有的操作日志,恢复内存中的数据;
  • 重新对Redis进行执行,用于恢复内存中的数据。

在这里插入图片描述

追加的规则

  • appendfsync always
    • 每更新一条数据就同步将这个更新操作追加到文件中
    • 优点:数据会相对安全,几乎不会出现数据丢失的情况
    • 缺点:频繁的进行数据的追加,增大磁盘的IO,导致性能较差
  • appendfsync everysec(常用)
    • 每秒将一秒内Redis内存中数据的操作异步追加写入文件
    • 优点:在安全性和性能之间做了权衡,性能要比always高
    • 缺点:有数据丢失风险 ,但最多丢失1秒
  • appendfsync no
    • 交给操作系统来做,不由Redis控制
    • 肯定不用的

总结

  • 优点:安全性和性能做了折中方案,提供了灵活的机制,如果性能要求不高,安全性可以达到最高
  • 缺点
    • 这个文件是普通文本文件,相比于二进制文件来说,每次追加和加载比较慢
    • 数据的变化以追加的方式写入AOF文件
      • 问题:文件会不断变大,文件中会包含不必要的操作【过期的数据】
      • 解决:模拟类似于RDB做全量的方式,定期生成一次全量的AOF文件
  • 应用:数据持久化安全方案,理论上绝对性保证数据的安全

持久化方案:两种方案怎么选?

  • 两种方案都可以用:默认不配置AOF,使用的RDB
  • 问题:两种都用,重启Redis加载的是谁的数据?
    • 加载AOF

2 Redis架构


  • Redis的服务只有单台机器
  • 问题1:单点故障问题,如果Redis服务故障,整个Redis服务将不可用
    • 单点故障问题
  • 问题2:单台机器的内存比较小,数据存储的容量不足,会导致redis无法满足需求
    • 单机资源不足问题
  • 解决方案:分布式

2.1 主从复制架构


在这里插入图片描述

分布式主从架构

  • Master:主节点
    • 负责对外提供数据的读写
  • Slave:从节点
    • 负责对外提供的请求
    • 负责与主节点同步数据

特点:主从节点上的数据都是一致的,连接任何一个节点实现读,默认写操作只能连接主节点

优缺点:

  • 优点:实现了读写分离,分摊了读写的压力负载,如果一台Redis的Slave故障,其他的Redis服务节点照常对外提供服务
    • 解决了Redis单点故障问题
  • 缺点:如果Master故障,整个集群不能对外提供写的操作,Master没有HA机制
    • 带来了Master单点故障问题

2.2 哨兵集群设计


主从复制集群的Master存在单点故障问题,怎么解决?

  • 类似于ZK的设计
    • 每台节点存储的数据都是一样的
    • 如果Leader故障,允许Follower选举成为Leader

哨兵设计

  • 思想:基于主从复制模式之上封装了哨兵模式,如果Master出现故障,让Slave选举成为新的Master

  • 实现哨兵进程 实现

    • 必须能发现Master的故障
    • 必须负责重新选举新的Master

在这里插入图片描述

Redis主从架构

  • 哨兵进程
    • 每个哨兵负责监听所有Redis节点和其他哨兵
    • 为什么要监听所有Redis的节点:发现所有节点是否会出现故障
      • 如果Master出现故障,会进行投票选择一个Slave来成为新的Master
    • 为什么要监听别的哨兵:如果哨兵故障,不能让这个哨兵参与投票选举等

哨兵功能

  • 集群监控:监控节点状态
  • 消息通知:汇报节点状态
  • 故障转移:实现Master重新选举
  • 配置中心:实现配置同步

流程

  • step1:如果Master突然故障,有一个哨兵会发现这个问题,这个哨兵会立即通告给所有哨兵
    • 主观性故障【sdown】
  • step2:当有一定的个数的哨兵都通告Master故障了,整体认为Master故障了
    • 客观性故障【odown】
  • step3:所有哨兵根据每台Slave通信的健康状况以及Slave权重选举一个新的Master
  • step4:将其他所有的Slave的配置文件中的Master切换为当前最新的Master

2.3 哨兵集群设计


Redis哨兵集群中的存储容量只有单台机器,如何解决大量数据使用Redis存储问题?

分片集群模式:解决了单点故障和单机资源不足的问题。

  • 将多个Redis小集群从逻辑上合并为一个大集群,每个小集群分摊一部分槽位,对每一条Redis的数据进行槽位计算,这条数据属于哪个槽位,就存储对应槽位的小集群中

分片的规则:根据Key进行槽位运算:CRC16【K】 & 16383 = 0 ~ 16383

在这里插入图片描述

在这里插入图片描述

3 Redis事务机制


事务定义:事务是数据库操作的最小工作单元,包含原子性、一致性、隔离性、持久性

Redis事务:Redis一般不用事务

  • Redis本身是单线程的,所以本身没有事务等概念

  • Redis 支持事务的本质是一组命令的集合事务支持一次执行多个命令,串行执行每个命令。将一组需要一起执行的命令放在multiexec之间

  • 一旦Redis开启了事务,将所有命令放入一个队列中,提交事务时,对整个队列中的命令进行执行

  • redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令

  • 没有隔离性:批量的事务命令执行前在缓存队列中,没有事务交叉,不存在脏读幻读等问题

  • 不能保证原子性:单条命令是原子性执行的,但事务不保证原子性,且没有回滚机制,事务中任意命令执行失败,其余的命令仍会被执行。

  • 过程

    • 开启事务
    • 提交命令
    • 执行事务
  • 命令

    • multi:开启事务
    • exec:执行事务
    • discard:取消事务

测试

  • 正常使用

    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    set user2 hadoop4
    exec
    get user1
    get user2
    

都执行

  • 语法【编译】错误

    flushdb
    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    sets user2 hadoop4
    exec
    get user1
    get user2
    

都不执行

  • 类型【运行】错误

    flushdb
    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    lpush user2 hadoop4 # 运行错误
    exec
    get user1
    get user2
    

    user1执行,user2不执行

  • 取消事务

    flushdb
    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    set user2 hadoop4
    discard
    get user1
    get user2
    

都不执行

总结:

  • Redis 的事务机制很弱,在事务回滚机制上,只能对基本的语法错误进行判断。
  • 事务是Redis实现在服务端的行为,用户执行multi命令时,服务器会将对应这个用户的客户端对象设置为一个特殊的状态,在这个状态下后续用户执行的命令不会被真的执行,而是被服务器缓存起来,直到用户执行exec命令为止,服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行。

4 Redis过期策略与内存淘汰机制


Redis使用的是内存,内存如果满了,怎么解决?

4.1 过期策略


设计思想:避免内存满,指定Key的存活时间,到达存活时间以后自动删除。命令:expire/setex

  • 定时过期:指定Key的存活时间,一直监听这个存活时间,一旦达到存活时间,自动删除
    • 需要CPU一直做监听,如果Key比较多,CPU的消耗比较严重
  • 惰性过期:指定Key的存活时间,当使用这个Key的时候,判断是否过期,如果过期就删除
    • 如果某个Key设置了过期时间,但是一直没有使用,不会被发现过期了,就会导致资源浪费
  • 定期过期:每隔一段时间就检查数据是否过期,如果过期就进行删除
    • 中和的策略机制

Redis中使用了惰性过期定期过期两种策略共同作用

4.2 内存淘汰机制


设计思想:内存满了,怎么淘汰

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据, Redis 源码中的默认配置

实际项目中设置内存淘汰策略:maxmemory-policy allkeys-lru,移除最近最少使用的key。

  • 缓存使用:allkeys-lru
  • 数据库使用:volatile-lru / noeviction

5 Redis高频面试题


在应用程序和MySQL数据库中建立一个中间层:Redis缓存,通过Redis缓存可以有效减少查询数据库的时间消耗,但是引入redis又有可能出现缓存穿透缓存击穿缓存雪崩等问题。

在这里插入图片描述

4.1 缓存穿透


缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。

总的来说,查询Key,缓存和数据源都没有,频繁查询数据源。比如用一个不存在的用户 id 获取用户信息,无论论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

解决缓存穿透的方案主要有两种:

  • 当查询不存在时,也将结果保存在缓存中。但是这可能会存在一种问题:大量没有查询结果的请求保存在缓存中,这时我们就可以将这些请求的key设置得更短一些;
  • 提前过滤掉不合法的请求,可以使用Redis中布隆过滤器

布隆过滤器可能存在误判,意思就是某个数据可能不存在,但是可能误判为存在。

在这里插入图片描述

4.2 缓存击穿


缓存击穿:key对应的数据库存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

总的来说,查询Key,缓存过期,大量并发,频繁查询数据源。

业界比较常用的做法:使用互斥锁。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db(查询数据库),而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,就是只让一个线程构建缓存,其他线程等待构建缓存的线程执行完,重新从缓存获取数据。

在请求数据库这一步进行上锁,这个时候只有一个线程可以抢到这个锁,这个线程查询到数据库再重新将数据写入缓存,其他线程再去缓存中查询。

4.3 缓存雪崩


缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

总的来说,缓存不可用(服务器重启或缓存失效),频繁查询数据源。

与缓存击穿的区别在于这里针对很多key缓存,前者则是某一个key。缓存正常从Redis中获取,示意图如下:

在这里插入图片描述

缓存失效瞬间示意图如下:

在这里插入图片描述

缓存失效时的雪崩效应对底层系统的冲击非常可怕!大多数系统设计者考虑用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就时将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

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

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

相关文章

防火墙虚拟系统

防火墙虚拟系统 防火墙虚拟系统的应用场景 大中型企业的网络隔离 通过防火墙的虚拟系统将网络隔离为研发部门、财经部门和行政部门。各部门之间可以根据权限互相访问,不同部门的管理员权限区分明确。 云计算中心的安全网关 通过配置虚拟系统,可让部署…

论文生成新纪元:探索顶尖AI写作工具的高效秘诀

在学术探索的征途中,AI论文工具本应是助力前行的风帆,而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时,遭遇不靠谱AI工具的沮丧与无奈。毕竟,时间可以被浪费,但金钱和信任却不可轻弃。 作为一名资深的AI…

昇思25天学习打卡营第3天|onereal

前几天不能运行代码,经过排查是因为我的浏览器是搜狗的,换成Chrome问题解决了。按照提示学习了《应用实践/计算机视觉/FCN图像语义分割.ipynb》并且尝试运行代码,开始训练,最后看到图片变化。 网络流程 FCN网络的流程如下图所示&…

机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)

文章目录 前言一、普通实现1 数据集准备2 逻辑回归模型3 损失函数4 计算损失函数的梯度5 梯度下降算法6 训练模型二、多项式特征实现非线性分类1 数据准备与多项式特征构造2 逻辑回归模型三、逻辑回归 --- 正则化实现1 数据准备2 逻辑回归模型3 正则化损失函数4 计算损失函数的…

关于服务器的一些知识

1. 云服务器 和 轻量应用服务器 腾讯云中的"云服务器"(Cloud Virtual Machine, CVM)和"轻量应用服务器"(Lite Cloud Server)都是提供云端计算资源的服务,但它们在定位、特性和使用场景上存在一些差…

超越边界:探索深度学习的泛化力量

深度学习的泛化能力 一. 简介1.1 深度学习的定义1.2 什么是泛化能力1.3 深度学习模型的泛化能力1.4 提升深度学习模型的泛化能力 二. 泛化能力的重要性2.1 深度学习中泛化能力的作用2.1.1 防止过拟合2.1.2 处理噪声和不完整数据2.1.3 对于数据分布的变化具有适应性 2.2 泛化能力…

双指针dd d df f

像二分这样的算法,我们甚至可以不用管,直接在问题空间之内搜索,但是双指针也非常好用,帮助我们来减少枚举对象,我们来总结一下这经典的三个题目: 最长上升不重复子序列活动 - AcWings 首先一定要写…

使用单调队列求滑动窗口最大值

单调队列:队列元素之间的关系具有单调性(从队首到队尾单调递增/递减),队首与队尾进行插入与删除操作,使队列保持单调递增/递减,由双端队列deque实现。 通过例题对单调队列进行分析掌握: 使用单…

最小化安装的CentOS7部署KVM虚拟机

正文共:1666 字 21 图,预估阅读时间:2 分钟 目前安装KVM主要有几种方式,第一种就是软件选择安装“带GUI的服务器”,然后选择虚拟化相关的附加环境(KVM部署初体验);第二种就是不安装G…

【移动应用开发期末复习】第五/六章

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…

linux高级编程(进程)(1)

进程: 进程的含义? 进程是一个程序执行的过程,会去分配内存资源,cpu的调度 进程分类: 1、交互式进程 2、批处理进程 shell脚本 3、 守护进程 进程与程序的区别: 1)程序是…

力扣每日一题 特别的排列 DFS 记忆化搜索 位运算 状态压缩DP

Problem: 2741. 特别的排列 👨‍🏫 参考题解 🍻 暴搜 ⏰ 时间复杂度: O ( N ) O(N) O(N) class Solution {public int specialPerm(int[] nums) {boolean[] visited new boolean[nums.length];return dfs(nums, 0, -1, visit…

Stm32的DMA的学习

一,介绍 二,DMA框图 三,DMA通道 四,相关HAL库函数 五,配置DMA 六,Stm32CubeMX配置 【13.1】减少CPU传输负载 DMA直接存储器访问—Kevin带你读《STM32Cube高效开发教程基础篇》_哔哩哔哩_bilibili

机票、火车票,YonSuite让企业支出笔笔可控

在数字化浪潮的推动下,企业的商旅管理正迎来一场深刻变革。传统的手动预订、报销模式已无法满足现代企业对效率和成本控制的双重要求。YonSuite商旅费控,作为一款领先的企业商旅管理平台,正以其独特的优势,帮助企业实现机票、火车…

【Android】多种方式实现截图(屏幕截图、View截图、长图)

目录 一、截图原理二、实现方式1. View截图2. WebView截图3. 屏幕截图 三、格式转换方法 一、截图原理 我们的手机一般同时按下音量-键和电源键就会将当前屏幕显示的内容截取下来,那里面具体经过哪些流程呢? Android中每一个页面都是一个Activity&#…

MySQL进阶_3.MySQL日志

文章目录 第一节、MySQL事务日志1.1、redo日志1.1.1、为什么需要REDO日志1.1.2、REDO日志的好处、特点1.1.3、redo的组成1.1.4、redo的整体流程 1.2、Undo日志1.2.1、如何理解Undo日志1.2.2、Undo日志的作用1.2.3、undo log的生命周期 第一节、MySQL事务日志 事务有4种特性&am…

Mybatis 系列全解(2)——全网免费最细最全,手把手教,学完就可做项目!

Mybatis 系列全解(2) 1. ResultMap结果集映射2. 日志2.1 日志工厂2.2 log4j 3. 分页3.1 实现SQL分页3.2 RowBounds 分页3.3 分页插件 4. 使用注解开发4.1 面向接口编程4.2 使用注解4.3 Mybatis 详细执行过程4.4 CRUD 增删改查 5. Lombok 1. ResultMap结果…

无人门店社区拼团小程序系统源码

​打造便捷购物新体验 🛒 引言:社区购物新趋势 随着科技的飞速发展,无人门店和社区拼团已经成为购物的新趋势。而结合这两者的“无人门店社区拼团微信小程序”更是为我们带来了前所未有的便捷购物体验。无需排队、无需现金交易,只…

营销能力大提升:6步策略助你成为市场精英

作为一名拥有9年经验的营销老兵,道叔有一些心得想要分享给每一位在营销领域奋斗的朋友。 在这个快速变化的行业里,除了掌握营销的专业知识,还有一些技能和视角是我们必须掌握的。 1. 培养业务视角 你有没有注意到,现在企业在投…

[word] 如何在word中插入地图? #学习方法#其他

如何在word中插入地图? 人事部门在给即将入职的新员工发送入职资料时,为了方便新员工能快速找到公司的具体位置,一般都会在word资料中插入公司所在位置的地图。今天,小编就分享一个在word中插入地图的方法。 第一步:…