八股学习 Redis

八股学习 Redis

  • 使用场景
  • 常见问题
  • 问题1、2
    • 示例场景
    • 缓存穿透
    • 解决方案一
    • 解决方案二
  • 问题3
    • 示例场景
    • 缓存击穿
    • 解决方案
  • 问题4
    • 示例场景
    • 缓存雪崩
    • 解决方案
  • 问题5
    • 示例场景
    • 双写一致性
    • 强一致方案
    • 允许延时一致方案
  • 问题6
    • RDB方式
    • AOF方式
    • 两种方式对比
  • 问题7
    • 示例场景
    • 惰性删除
    • 定期删除

使用场景

缓存:穿透、击穿、雪崩、双写一致、持久化、数据淘汰、淘汰策略;
分布式锁:setnx、redisson;
计数器保存token消息队列延迟队列:数据类型;


常见问题

  • 什么是缓存穿透,怎么解决?

  • 什么是布隆过滤器?

  • 什么是缓存击穿,怎么解决?

  • 什么是缓存雪崩,怎么解决?

  • Redis双写问题?

  • Redis作为缓存如何实现持久化?

  • Redis的数据过期策略有哪些?

  • Redis的数据淘汰策略有哪些?

  • Redis分布式锁如何实现?

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

  • Redis集群有哪些方案?

  • 什么是 Redis 主从同步?

  • 使用的Redis是单点还是集群?哪种集群Redis分片集群中数据是怎么存储和读取的?

  • Redis集群脑裂

  • 怎么保证Redis的高并发高可用?

  • 用过Redis的事务吗?事务的命令有哪些?

  • Redis是单线程的,但是为什么还那么快?


问题1、2

缓存穿透、布隆过滤器

示例场景

在这里插入图片描述

缓存穿透

查询一个不存在的数据,mysql查不到,因此不会直接写入,导致频繁查询数据库;

解决方案一

缓存空数据,即使查询返回数据为空,也仍把空结果缓存;
优点:简单;
缺点:内存消耗,可能导致不一致问题;

解决方案二

布隆过滤器:
在这里插入图片描述
作用:检索一个元素是否在集合中;
在这里插入图片描述

优点:内存占用少,没有多余key;
缺点:实现相对复杂,存在误判;

在这里插入图片描述


问题3

缓存击穿

示例场景

在这里插入图片描述

缓存击穿

给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮;

解决方案

在这里插入图片描述
互斥锁
优点:强一致;
缺点:性能差;
逻辑过期
优点:高可用,性能优;
缺点:不能保证数据绝对一致;


问题4

缓存雪崩

示例场景

在这里插入图片描述
在这里插入图片描述

缓存雪崩

指在同一时间段大量的缓存key同时失效或者Redis宕机,导致大量请求到达数据库,带来巨大的查询压力;

解决方案

  • 给不同的key的TTL添加随机值;
  • 利用Redis集群提高服务可用性:哨兵模式、集群模式;
  • 给缓存业务添加降级限流策略:ngxin或spring cloud gateway
  • 给业务添加多级缓存:Guava或者Caffeine

问题5

示例场景

双写一致性
在这里插入图片描述

双写一致性

当修改了数据库的数据,也要同时更新缓存的数据,缓存数据于数据库数据要保持一致;

强一致方案

Redisson提供的读写锁
共享锁:读锁readLock,加锁后,其他线程可以共享读操作;
排它锁:独占锁writeLock,加锁后,阻塞其他线程读写操作;
在这里插入图片描述

允许延时一致方案

MQ中间件:更新数据后,通知缓存删除;
在这里插入图片描述

canal中间件:监听binlog数据更新缓存,不需要修改业务代码;

在这里插入图片描述


问题6

Redis持久化

RDB方式

bgsave开始时会fork主进程得到子进程,子进程 (不是子线程)共享主进程的内存数据,完成fork后读取内存数据并写入RDB文件;
fork采用的是copy-on-write技术

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作;
    在这里插入图片描述

AOF方式

AOF全称为Append Only File(追加文件),Redis处理的每一个读写命令都会记录在AOF文件中,可以看作是命令日志文件;
在这里插入图片描述
需要注意的是,AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:
在这里插入图片描述
AOF命令的记录频率也可以通过redis.conf文件来配置:
在这里插入图片描述
在这里插入图片描述
因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果;
在这里插入图片描述
Redis也会在触发阈值时自动去重写AOF文件,阈值也可以在redis.conf中进行配置:
在这里插入图片描述

两种方式对比

RDB和AOF各有优缺点,如果对数据安全性要求较高,在实际开发中往往结合两者来使用;
在这里插入图片描述


问题7

Redis数据过期策略

示例场景

Redis对数据设置数据的有效时间,数据过期以后,就需要将数据从内存中删除掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略(数据过期策略)。

惰性删除

设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key;
优点:对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查;
缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放;

定期删除

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

  • SLOW模式:定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz 选项来调整这个次数;
  • FAST模式:频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms;

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。
缺点:难以确定删除操作执行的时长和频率。

Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用

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

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

相关文章

行业案例:高德服务单元化方案和架构实践

目录 为什么要做单元化 高德单元化的特点 高德单元化实践 服务单元化架构 就近接入实现方案 路由表设计 路由计算 服务端数据驱动的单元化场景 总结 系列阅读 为什么要做单元化 单机房资源瓶颈 随着业务体量和服务用户群体的增长,单机房或同城双机房无法支持服…

GO语言实现KMP算法

前言 本文结合朱战立教授编著的《数据结构—使用c语言(第五版)》(以下简称为《数据结构(第五版)朱站立》)中4.4.2章节内容编写,KMP的相关概念可参考此书4.4.2章节内容。原文中代码是C语言&…

Windows核心编程—匿名管道双向通信

注:父进程要创建两个匿名管道,并且STARTUPINFO 里面的两个字段很重要 A进程 void CMFCApplication1Dlg::OnBnClickedButton1() {SECURITY_ATTRIBUTES sa {};sa.nLength sizeof(SECURITY_ATTRIBUTES);sa.bInheritHandle TRUE;CreatePipe(&m_hRead…

基于springboot+vue的洪涝灾害应急信息管理系统设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

centos修改/etc/resolv.conf 重启network后又恢复到原来的状态

博主使用的是centos7 问题描述:centos修改/etc/resolv.conf 执行 service network restart 后,/etc/resolv.conf 又恢复到原来的状态 解决方法:/etc/resolv.conf 保存 DNS 是暂时的,当重新启动 network 时,/etc/resol…

MySQL:索引

目录 1.MySQL索引是干什么的 2.铺垫知识 3.单个page的理解 4.页目录 单页情况 多页情况 1.MySQL索引是干什么的 MySQL的索引是提高查询效率,主要提高海量数据的检索速度。 2.铺垫知识 操作系统与磁盘之间IO的基本单位是4kb。 数据库是一个应用层软件&#…

【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解

分布式系统理论:CAP 与 BASE 详解 一、CAP 定理 背景与定义:1998 年由加州大学科学家埃里克布鲁尔提出,分布式系统存在一致性(Consistency)、可用性(Availability)、分区容错性(Part…

大数据技术Kafka详解 ⑤ | Kafka中的CAP机制

目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新…

linux自动分区后devmappercentos-home删除后合并到其它分区上

删除其他分区,合并到对应分区上增加磁盘空间 删除开机默认挂载 /dev/mapper/centos-home vim /etc/fstab 把 /dev/mapper/centos-home 这一行删除掉命令行取消挂载 /dev/mapper/centos-home umount /dev/mapper/centos-home删除掉逻辑卷 home lvsdf -hlvremove /…

东芝3525AC彩色复印机复印默认成黑白模式方法

同样适用2010AC等机型 东芝3525AC彩色激光数码复合机基本参数 产品类型:激光数码复合机 颜色类型:彩色 速度类型:中速 复印速度:彩色:35cpm,黑白:35cpm 涵盖功能:复印/打印/扫描…

T-SQL编程

目录 1、T-SQL的元素 1.1 标识符 1. 常规标识符 2. 分隔标识符 1.2 变量 1. 全局变量 2. 局部变量 1.3 运算符 1. 算数运算符 2. 赋值运算符 3. 位运算符 4. 比较运算符 5. 逻辑运算符 6. 字符串连接运算符 7. 一元运算符 8. 运算符的优先级和结合性 1.4 批处…

SpringBoot-Day1

1.Springboot入门 创建Maven工程 导入spring-boot-stater-web起步依赖 编写Controller 提供启动类 2.yml配置信息书写与获取 书写 # 发件人信息 email:user: 172349823457qq.comcode: sajdajlwhjfgfkllwhost: smtp.qq.comauth: true ​ # 学生爱好 hobbies:- 打篮球- 踢…

【Linux】从零开始:编写你的第一个Linux进度条小程序

Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具 文章目录 一、知识铺垫1.1 回车与换行概念1.2 缓冲区 二、实现简单倒计时三、进度条3.1 Verrs…

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发二

目录 1 -> 声明式UI开发指导 1.1 -> 开发说明 1.2 -> 创建页面 1.3 -> 修改组件样式 1.4 -> 更新页面内容 2 -> 创建简单视图 2.1 -> 构建Stack布局 2.2 -> 构建Flex布局 2.3 -> 构建食物数据模型 2.4 -> 构建食物列表List布局 2.5 -…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想:数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架: create-react-app ,目前使用它安装默认是19版本,我们这里降为18…

分多个AndroidManifest.xml来控制项目编译

使用场景 公司项目和我的项目的AndroidManifest.xml混在一起,我需要区分开来编译观察app运行 1.在app/src/main/ 下写多个AndroidManifest.xml AndroidManifest.own.xmlAndroidManifest.com.xml 2.编写powershell脚本 第一对脚本com-build.ps1和reset-com-mani…

linux进程

课本概念:程序的⼀个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合.课本上称之为PCB&…

Hadoop•安装JDK

听说这里是目录哦 创建目录❤️‍🔥上传JDK安装包💗查看JDK是否上传成功💘安装JDK💖配置JDK系统环境变量💓验证JDK是否安装成功💞分发JDK安装目录💌分发系统环境变量文件💝若显示没有…

[Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025

文章目录 [Deep Learning] AnacondaCUDACuDNNPytorch(GPU)环境配置-20250. 引子1. 安装Anaconda1.1 安装包下载:1.2 启用安装包安装1.3 配置(系统)环境变量1.4 验证Anaconda是否安装完毕1.5 Anaconda换源 2. 安装CUDACuDNN2.1 判断本机的CUDA版本2.2 下载适合自己CU…

网络原理(四)—— 网络层、数据链路层 与 DNS

网络层 网络层这里重点介绍 IP 协议,首先先解析 IP 数据包: 先介绍第一行: 4位版本号是指使用了哪一个版本的 IP 协议,这里有 IPV4 和 IPV6 两种协议,现在主要使用的是 IPV4 这一个版本号, IPV6 在国内也…