在用redis当中可能遇到的问题解决方案以及redis中的一些名词解释

在用redis当中可能遇到的问题解决方案以及redis中的一些名词解释

    • Redis篇
        • 一、缓存穿透:
          • 解决方案:
            • 缓存空数据
            • 布隆过滤器
        • 二、缓存击穿
          • 解决方案
            • 互斥锁,强一致性,性能差,速度慢
            • 逻辑过期,数据不同步,性能优
        • 三、缓存雪崩
          • 解决方案
        • 四、双写一致
          • 解决方案
            • 允许业务延时一致的业务,采用异步通知
            • 强一致性的,采用Redisson提供的读写锁
        • 五、Redis持久化
          • RDB
          • AOF
        • 六、数据过期策略
          • 惰性删除
          • 定期删除
        • 七、数据淘汰策略
          • LRU
          • LFU
        • 八、redis分布式锁是如何实现的
            • 分布式锁主要利用Redis的setnx命令
            • Redisson实现分布式锁如何合理的控制锁的有效时长
        • Redisson的这个锁,可以重入吗
        • Redisson锁能解决主从一致的问题吗
        • 九、Redis集群有哪些方案,
          • 主从同步
          • 全量同步
          • 主从增量同步(slave重启或后期数据变化)
        • 十、怎么保证Redis的高并发高可用
          • 使用的redis是单点还是集群
          • 分片集群结构
          • 解释I/O多路复用模型
          • Redis网络模型
          • Redis网络模型

Redis篇

一、缓存穿透:

名次解释:查询一个不存在的数据,musql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库

解决方案:
  • 缓存空数据

-让查询返回的数据为空,这个空数据缓存在Redis当中,优点:简单 *缺点:消耗内存,可能会发生不一致问题,

  • 布隆过滤器
  • 在查询Redis前,先查询布隆过滤器中该数据是否存在,不存在直接过滤掉
    在这里插入图片描述
二、缓存击穿

名次解释:给某一个Key设置了过期时间,当key过期的时候,恰好这个时间段有大量的靠key查询的请求发过来,这些请求可能一瞬间将DB压垮

解决方案

在这里插入图片描述

三、缓存雪崩

名次解释:缓存雪崩是指在统一时间内大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库
在这里插入图片描述

解决方案
  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性(哨兵模式,集群模式)
  • 给缓存业务添加降级限流策略(ngxin或spring cloud gateway)
  • 给业务添加多级缓存 guava或caffeine
四、双写一致

问题:redis作为缓存,mysql的数据怎么保证和redis的数据一样

解决方案

在这里插入图片描述

允许业务延时一致的业务,采用异步通知
  • 使用MQ中间中间件,更新数据之后,通知缓存删除,在此当中保证MQ的可靠性

  • 利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存

    Canal是一个用于MySQL数据库增量日志解析的开源工具,常用于数据库镜像、实时备份、索引维护和缓存刷新等。它模拟MySQLslave与master交互,解析binlog并提供数据同步。文章介绍了Canal的工作原理、架构、高可用机制以及配置和应用示例,包括与Redis和ES的同步,并提供了实战代码示例。

强一致性的,采用Redisson提供的读写锁
  • 共享锁,读锁readlock

  • 排他锁:独占锁,加锁之后,其他线程读写受阻

五、Redis持久化
RDB

basave开始时会fork(克隆)主进程得到子进程,子进程共向内存数据(页表),页表储存着虚拟内存和物理内存之间的映射关系,完成fork操作之后读取数据并且写入RDB文件,
在这里插入图片描述

AOF

aof默认是关闭的,通过redis.conf文件来打开,配置项有三种,always,everysec,no,通过执行bgrewriteof命令,可以让redis使用重写功能,auto-aof-rewrite-pencentage 100(增长超过多少百分比触发)

六、数据过期策略
惰性删除

设置过期时间后,不去管它,当需要用到的时候,验证是否过期,如果过期,则删掉它,否则,就返回该key

优点:对Cpu友好,只有在用到该内存时,才会对该值进行检查

缺点:长时间不用的话过期的key值堆积

定期删除

每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key),分为两种模式

slow模式是定时任务,执行频率默认10hz,每次不超过25ms

fast模式执行频率不固定,但两次间隔时间不超过2ms

优点:可以限制删除操作执行的时长和频率来减少删除操作对CPU的影响,

缺点:难以确定删除操作执行的时长和频率

七、数据淘汰策略

CTemp%5C1727269554012.png&pos_id=img-LdwbyIj5-1743062150316)

当Redis中的内存不够时
此时再向Redis中添加新的数据,那么Redis就会使用一种策略将内存中的数据删除掉

LRU

最近最少使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高

LFU

最少频率使用。会统计每个key值得访问频率

  • 优先使用allkeys-lru策略,把最近最常访问得数据留在缓存当中,如果有明显得冷热数据区分,建议使用
  • 如果数据访问频率差距不大,allkeys-random
  • 有置顶需求,volatile-lru策略,同时置顶数据不设置过期时间
  • 业务中有短时间内高频访问得数据,可以使用allkeys-lfu或者volatile-lfuf
八、redis分布式锁是如何实现的
分布式锁主要利用Redis的setnx命令

我们当使用的rdisson实现的分布式锁,底层是setnx和lua脚本(保证原子性性),在代码中,加锁,设置过期时间等操作都是基于Lua脚本完成

Redisson实现分布式锁如何合理的控制锁的有效时长

在redisson的分布式锁中,提供了一个WatchDog(看门狗),一个线程获取锁成功以后,WatchDog会给持有锁的线程续期(默认是每十秒续期一次)
在这里插入图片描述

Redisson的这个锁,可以重入吗

可以重入,多个锁重入需要判断是否是当前线程,在redis中进行存储的时候使用的hash结构,来存储线程信息和重入的次数

Redisson锁能解决主从一致的问题吗

不能解决,但是可以使用redisson提供的红锁来解决,但性能低,如果非要保证数据的强一致性,采用zoo keeper实现的分布式锁

九、Redis集群有哪些方案,

三种,主从同步,哨兵模式,Redis分片集群

主从同步

缺点 不能保证Redis的高可用性,当主节点宕机之后,就丧失了写数据的能力

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离,一般都是一主多从,主节点负责写数据,从节点负责读数据

全量同步

replication id:简称Replid,是数据集的标记,id一致说明是统一数据集,每一个master都有唯一的replid,slave则会继承master节点的replid

offset: 偏移量,随着记录在repl_baklog中的数据增多而逐渐增大,slave完成同步时也会记录当前同步的offset,如果slave中的offset小于master中的offset,说明slave数据落后于master,需要更新

步骤

1,salve执行replicaof命令,建立连接,请求数据同步,

2,master判断是否是第一次同步(replid是否一致),是第一次,返回master的数据版本信息replid,offset,slave保存版本信息

3,master执行bgsave,生成RDB文件,发送RDB文件,slave清空本地数据,加载RDB文件

4,master,记录RDB期间的所有命令,发送repl_baklog中的命令,slave执行收到的命令

主从增量同步(slave重启或后期数据变化)

1,slave重启,发送psync replid offset,master判断请求replid是否一致,不是第一次,回复continue,去repl_baklog中获取offset后的数据,发送offset后的命令,slave执行命令

十、怎么保证Redis的高并发高可用

哨兵模式:实现主从集群的自动故障恢复(监控,自动故障恢复,通知)

哨兵选主规则

  • 首先判断主从节点断开时间长短,如超过指定值就排除该节点

  • 判断从节点的额slave-priority值,越小优先级越高

  • 如果以上一样,则判断slave节点的offset值,越大优先级越高

  • 判断slave节点id值得大小

使用的redis是单点还是集群

主从(1+1)+哨兵,单节点内存不超过10G,如果内存不足,可以给不同得服务分配独立的Redis主从节点

redis集群脑裂:是由于主节点和从节点的sentinel处于不同的网络分区,使得sentinel没有能够心跳感知到主节点,所以通过选举的方式提升了一个从节点为主,这样就存在了两个主节点,导致客户点在老地节点那边写数据,新节点无法同步数据,当网络恢复后,sentinel会将老的主节点将为从节点,这是再从新的master同步数据,
在这里插入图片描述

解决方法:修改redis的配置,设置最小的从节点数量,缩短同步的延迟时间

分片集群结构
解释I/O多路复用模型

单个线程同时监听多个,Socket,再某个Socekt进程可读可写时,得到通知,从而避免无效的等待,多数用epoll模式实现,它在通知socket就绪的同时,将socket写入用户空间,不会每个遍历,节省了时间

Redis网络模型

就是使用I/O多路复用结合时间的处理器来应对多个Socket请求

连接应答处理器

命令恢复处理器,在Redis6.0之后,使用多线程来处理

命令请求处理器,在Redis6.0之后,将命令的转换使用了多线程,增加命令的转换速度

无效的等待,多数用epoll模式实现,它在通知socket就绪的同时,将socket写入用户空间,不会每个遍历,节省了时间

Redis网络模型

就是使用I/O多路复用结合时间的处理器来应对多个Socket请求

连接应答处理器

命令恢复处理器,在Redis6.0之后,使用多线程来处理

命令请求处理器,在Redis6.0之后,将命令的转换使用了多线程,增加命令的转换速度

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

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

相关文章

一文详解QT环境搭建:Windows使用CLion配置QT开发环境

在当今的软件开发领域,跨平台应用的需求日益增长,Qt作为一款流行的C图形用户界面库,因其强大的功能和易用性而备受开发者青睐。与此同时,CLion作为一款专为C/C打造的强大IDE,提供了丰富的特性和高效的编码体验。本文将…

【区块链安全 | 第二十四篇】单位和全局可用变量(二)

文章目录 单位和全局可用变量(Units and Globally Available Variables)特殊变量和函数1. 区块和交易属性2. ABI 编码和解码函数3. bytes 成员函数4. string 成员函数5. 错误处理6. 数学和加密函数7. 地址类型成员函数8. 与合约相关9. 类型信息 单位和全…

一种监控录像视频恢复的高效解决方案,从每一帧中寻找可能性

该软件旨在恢复从监控设备中删除或丢失的视频。该程序经过调整以处理大多数流行供应商的闭路电视系统中使用的专有格式,并通过智能重建引擎进行了增强,能够为监控记录提供任何通用解决方案都无法实现的恢复结果。如果不需要持续使用该软件,则…

网红指路机器人是否支持环境监测功能?

嘿呀,你可知道?如今的叁仟网红指路机器人那可太牛啦!它们可不单单局限于为行人指明方向,还纷纷兼职当起了 “环境小卫士”,为咱们的城市生活注入了前所未有的超智能便利。就拿那个依托叁仟智慧杆打造的数智指路机器人来…

Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录

目前只找到一张一张表导出的方式 使用information_schema传入表名查询 字段名根据需要自行删减,一般保留序号、字段名、类型、说明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序号, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 类型(长度), COLUMNS.N…

MySQL主从数据库搭建

此方案可适用于Centos 7、OpenEuler、Ubuntu操作系统。 在国产银河麒麟V10中,虚拟机中启动的麒麟系统使用当前方案并未遇到问题,但是在服务器上安装时,执行到初始化时出现了找不到依赖问题(目前已解决安装问题),后续我会继续更新该问题解决方案。 1. 创建主、从安装目录…

`git commit --amend` 详解:修改提交记录的正确方式

文章目录 git commit --amend 详解:修改提交记录的正确方式1. 修改提交信息2. 补充遗漏的文件3. 结合 --amend 进行交互式修改4. 已推送提交的修改总结 git commit --amend 详解:修改提交记录的正确方式 git commit --amend 用于修改最近一次的提交&…

为什么package.json里的npm和npm -v版本不一致?

这个情况出现是因为package.json里的 npm 版本和系统实际使用的 npm 版本是两个不同的概念。让我来解释一下: 原因解释 全局 npm vs 项目依赖: npm -v显示的是系统全局安装的 npm 版本(位于/usr/bin/npm或类似路径)package.jso…

python系统之综合案例:用python打造智能诗词生成助手

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 python系列之综合案例 前言一、项目描述二、项目需求三、 项目实现1、开发准备2、代码实现 …

Java常用工具算法-1--哈希算法(MD5,SHA家族,SHA-256,BLAKE2)

1、概述 哈希算法(Hash Algorithm),又称散列算法,是一种将任意长度的输入数据(明文)转换为固定长度的输出(哈希值/摘要)的数学算法。 哈希值通常被称为摘要(Digest&…

OpenMCU(五):STM32F103时钟树初始化分析

概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化,AHB总线时钟,APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树,如下所示: 时钟源选择 从STM32F103的时钟树框图,我们可以…

【qt】文件类(QFile)

很高兴你能看到这篇文章,同时我的语雀文档也更新了许多嵌入式系列的学习笔记希望能帮到你 : https://www.yuque.com/alive-m4b9n 目录 QFile 主要功能QFile 操作步骤QFile 其他常用函数案例分析及实现功能一实现:打开文件并显示功能二实现:另…

基于AT89C52单片机的轮胎压力监测系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90545655?spm1001.2014.3001.5503 功能介绍: 采用MPX4115压力传感器进行轮胎压力检测;使用LCD液晶显示器显示轮胎压力;若压力过…

shell脚本--MySQL简单调用

实现功能 增 数据库的创建,数据表的创建已经实现 创建用户 删 删除数据库, 删除库下的某个表, 删除某个用户 改 暂无 查 查看所有的数据库, 查看某个库下的所有数据表, 查看某个表的结构, 查…

计算机网络 OSI参考模型

目录 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

2025年华为HCIP题库分享

1101、 【拖拽题】OPSF邻接关系建立的过程中需要使用不同的报文,那么请分别将以下各个状态和该状态使用的报文联系起来。 答题格式为:11 22 33 43 正确答案:【12】【21】【24】【33】 解析: 建立邻居关系 RouterA的一个连接到广…

DIskgenius使用说明

文章目录 一、概述1. 软件简介2. 系统要求 二、核心功能1. 分区管理(1) 查看磁盘分区(2) 创建与删除分区(3) 调整分区大小(4) 格式化分区 2. 数据恢复(1) 恢复已删除文件(2) 恢复丢失分区(3) 恢复误格式化分区 3. 磁盘复制(1) 克隆磁盘(2) 磁盘镜像 4. 文件操作(1) 文件复制与移…

linux--------------进程控制(上)

1.进程创建 1.1fork函数初识 在linux中fork函数是⾮常重要的函数&#xff0c;它从已存在进程中创建⼀个新进程。新进程为⼦进程&#xff0c;⽽原进 程为⽗进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;⾃进程中返回0&#xff0c;⽗进程返回⼦进程id…

windows免密SSH连接 ubuntu教程

文章目录 前情提要step1. 在windows下生成SSH密钥step2. SSH公钥copy到ubuntu的~/.ssh/authorized_keys内step3. 修改文件权限&#xff08;这一步完成后就可以实现免密SSH连接了&#xff09; 前情提要 ubuntu下安装SSH服务 sudo apt-get install openssh-serverwindows下安装…

中级:数组算法面试题全解析

一、引言 在Java面试中&#xff0c;数组相关的算法题是考察候选人基础算法能力的常见类型。面试官通过这些问题了解候选人在面对具体问题时的逻辑思维和代码实现能力。本文将深入剖析常见的数组算法面试题&#xff0c;结合实际开发场景&#xff0c;帮助读者全面掌握这些知识点…