Redis缓存知识点汇总

Redis缓存知识点汇总

请先思考如下问题
1.Redis的缓存击穿,穿透,雪崩是什么意思?原因和解决方案有哪些?
2.Redis支持宕机数据恢复,他的持久化方式及其原理是什么?
3.如何保证双写一致性,即如何保证Redis缓存与数据库的数据一致性?
4.Redis如何实现缓存过期删除?淘汰策略都有哪些?
5.Redis如何实现分布式锁,可重入锁?锁超时,但是业务还没执行完怎么办?
6.Redisson的看门狗机制?
7.Redis为什么那么快?单线程,多路复用?为什么不使用多线程。

1.缓存穿透

原因:Redis缓存穿透是指在高并发场景下,大量请求同时查询一个不存在的数据,这些请求会直接穿透Redis缓存,进而查询数据库,导致数据库压力过大,甚至可能崩溃。这种情况通常发生在缓存中没有命中数据,而数据库中也没有对应的数据,属于恶意访问场景。
解决
1.布隆过滤器:使用布隆过滤器来预先判断数据库是否存在相应的数据。
2.缓存空值:查询结果后若数据库没有值,则缓存空值到redis中,就不会击穿到数据库中。

布隆过滤器: 布隆过滤器的工作原理基于以下几个步骤:
初始化
创建一个大小为m的位数组,初始时所有位都设置为0。同时选择多个不同的哈希函数,这些哈希函数可以将元素映射到位数组中的一个位置。
插入元素
当要插入一个元素时,使用这k个哈希函数计算出k个不同的位位置,并将这些位置的值设置为1。
查询元素
当要查询一个元素是否在集合中时,同样使用这k个哈希函数计算出k个位位置,检查这些位置是否都为1。如果所有位置都为1,则认为元素可能在集合中;如果任一位置为0,则元素一定不在集合中。在这里插入图片描述

1.布隆过滤器为什么使用多个hash函数来计算?
答:利用多个hash函数计算的结果拼接在一起,唯一性更大,能减小hash冲突的概率,从而减小误报的概率。
2.如何确定布隆过滤器位数组的大小?
答:根据预先插入的数据个数以及能接受的误报率 再利用公式计算可得到数组大小。

2. 缓存击穿

原因:缓存击穿是指当某个热点数据(通常是访问频率极高的数据)在缓存中失效时,大量的请求同时到达,导致这些请求都直接查询数据库,从而对数据库造成巨大的压力,甚至可能导致数据库服务不可用的情况,属于用户正常的请求场景,非恶意访问。
解决
1.分布式锁:使用分布式锁来保证同一时刻只有一个请求到达数据库。
2.逻辑过期:热点数据设置永不过期,额外添加一个过期时间字段,查询的时候发现数据过期需要重建缓存。

3. 缓存雪崩

原因:大量的缓存在同一时间过期,导致请求击穿到数据库。
解决:给不同的key设置随机的时效时间。

缓存问题的保底策略,分布式锁,限流降级,集群

4. Redis如何保证与数据库的数据一致性

原因:修改了数据库,如何保证数据库和缓存的数据一致性。
解决
1.延时双删:多线程场景下,不论是先删除缓存,再修改数据库,还是先修改数据库再删除缓存都不可行,因为这些操作不是原子性操作,在多线程切换的时候很容易会造成数据不一致的情况。如果不需要保证强一致性,最优解决办法就是延迟双删策略,先删除缓存,再修改数据库,再等一会儿删除缓存。但延时双删也不能完全保证数据一致性,因为最后一次删除缓存的时间并不能保证一定在其他线程写入缓存之后。
2.分布式锁:分布式锁可以保证强一致性,缓存的删除,写入与数据库修改满足原子性,不受线程切换的影响。

如何更新redis缓存:
弱一致性:可参考阿里的canal中间件的实现,伪装成mysql的一个从节点,通过监听sql的binlog日志来更新缓存。
强一致性:redission的读写锁来处理数据库修改和缓存的更新
在这里插入图片描述

5. Redis如何持久化

原因:redis意外宕机后,需要有缓存恢复机制,一定频率的持久化机制保证了数据不会丢失。
解决
1.RDB:redis执行bgsave指令时,会fork一个子进程(不是线程)通过页表(linux不允许直接操作物理内存,页表是虚拟内存和物理内存的映射关系表)共享内存,按照一定的频率,将内存中的缓存数据同步到磁盘备份文件中。如果主进程此时有写操作,主进程利用copy-on-write复制一份页表,基于副本做修改,不影响子进程的页表读取。持久化过程中,主进程的读请求是在副本上完成。
在这里插入图片描述2.AOF:redis会记录每一条redis命令,然后存储到AOF文件中,类似mysql的binlog日志文件。但一条数据的指令可能会有很多条,只有其中几个是必要的。此策略需要设置存储指令的频率,设置太高影响性能,设置太低会造成一定时间内的数据丢失。还需要设置压缩频率,要不然文件会越来越大。

如何选择持久化模式?
rdb占用体积小,恢复速度快,但是宕机会丢失更多的数据。io读写导致不能做到实现每秒备份一次。
aof占用体积大,恢复速度慢,但几乎秒级的备份机制几乎可以做到不丢失数据。
如果业务对数据安全性要求较高,可以使用AOF+RDB。如果业务容对数据丢失忍度较高,对性能要求较高,建议使用RDB。

6. 数据过期策略

redis采用“惰性删除”+“定时删除”策略。
问:key过期后会立马进行删除吗?
答:不会,惰性删除和定时删除同时启用,但还要看设置的定时删除策略中的频率配置。
1.惰性删除:查询请求过来的时候,才对过期的key进行删除。会导致一直没有查询某个key的时候,缓存没删除,内存一直被占用。
2.定时删除:定时的扫描删除过期的key,slow模式每100ms执行一次,每次清理时间不超25ms。fast模式每2ms执行一次,每次清理时间不超1ms。
10. 数据淘汰策略
原因:当redis内存不够时,需要清除掉一部分缓存,来让新缓存添加进来。
解决
1.allkeys-lru:所有缓存,最近一次使用时间最远的将被淘汰掉。
2.volatiel-lru:设置了过期时间的缓存,最近一次使用时间最远的将被淘汰掉。
3.allkeys-lfu:所有缓存,使用频率最低的将被淘汰掉。
4.volatiel-lfu:设置了过期时间的缓存,使用频率最低的将被淘汰掉。
5.noevcatino:不淘汰,拒绝添加新缓存。
6.allkeys-random:所有缓存随机淘汰
7.volatiel-random:设置了ttl过期时间的缓存,随机淘汰。
8.valatiel-ttl:设置了ttl过期时间的缓存,剩余缓存时间最小的淘汰。

7. Redis实现分布式锁的原理

在这里插入图片描述
业务开始时,利用redis的set nx指令来添加锁,业务结束时,利用del指令来删除锁,达到了分布式锁的效果。
但如果不设置超时时间,服务宕机就会一直锁住得不到释放。所以需要添加锁的过期时间。
过期时间不好预估,添加过期时间之后,有可能业务才执行一半就过期了,会造成数据问题。如果主线程一直没有主动释放锁,说明业务还未结束,需要有个线程来不断的给主线程自动续期。续期逻辑是先判断锁是否存在,如果不存在说明业务执行完解锁了,结束子线程。如果存在且还有1/3的时间即将超期,则会使用set nx再次续期。
redission客户端就帮我们实现了这个功能,他是用set key value nx time 指令来实现如果缓存中不存在key,则添加key,并设置过期时间。然后利用看门狗机制,保证业务执行超时的时候锁会自动续期,不至于执行一半超时解锁。主要原理是,redisson在添加锁的时候,会另起一个线程来监控添加锁的那个主线程是否结束,如果结束的话就释放锁,如果没结束,但是马上超期了,就利用set nx指令来自动续期。

8. Redisson的可重入锁如何实现?

基于Redis实现的分布式锁,它允许同一个线程在不释放锁的情况下多次获得锁,并在所有锁操作完成后,锁才真正被释放。以下是Redisson可重入锁实现的主要原理:
在这里插入图片描述

使用Hash结构:Redisson使用Redis的Hash数据结构来存储锁的信息。其中,key表示锁的名称,field标识线程的持有者(通常是线程ID),value为锁的重入次数。

锁的获取:当一个线程尝试获取锁时,Redisson会使用Lua脚本来保证操作的原子性。如果锁不存在(即Redis中没有对应的key),则创建一个新的锁,并设置重入次数为1。如果锁已经存在,并且当前线程是锁的持有者,则增加重入次数。

锁的释放:当线程完成操作并释放锁时,Redisson会减少锁的重入次数。只有当重入次数减至0时,锁才会真正被释放。

锁的过期时间:在获取锁的同时,Redisson会为锁设置一个过期时间,以避免死锁的发生。如果锁在一定时间内没有被释放,它将自动过期并被删除。

自动续期:Redisson还提供了看门狗机制,它会在锁的过期时间到达之前自动续期,确保锁不会因为过期而被意外释放。

线程安全:在释放锁时,Redisson会检查Redis中存储的线程ID与当前线程的ID是否匹配,确保只有锁的持有者才能释放锁。

通过这些机制,Redisson实现了一个可重入的分布式锁,允许同一个线程多次获取和释放锁,同时保证了锁的安全性和可靠性。

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

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

相关文章

Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)

一、gitlab设置: 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置,选择网络,在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

仓颉编程笔记1:变量函数定义,常用关键字,实际编写示例

本文就在网页版上体验一下仓颉编程,就先不下载它的SDK了 基本围绕着实际摸索的编程规则来写的 也没心思多看它的文档,写的不太明确,至少我是看的一知半解的 文章提供测试代码讲解、测试效果图: 目录 仓颉编程在线体验网址&…

Linux 文件 I/O 基础

目录 前言 一、文件描述符(File Descriptor) 二、打开文件(open 函数) 三、读取文件(read 函数) 四、写入文件(write 函数) 五、关闭文件(close 函数) …

Vue项目中env文件的作用和配置

在实际项目的开发中,我们一般会经历项目的开发阶段、测试阶段和最终上线阶段,每一个阶段对于项目代码的要求可能都不尽相同,那么我们如何能够游刃有余的在不同阶段下使我们的项目呈现不同的效果,使用不同的功能呢?这里…

20241130 RocketMQ本机安装与SpringBoot整合

目录 一、RocketMQ简介 ???1.1、核心概念 ???1.2、应用场景 ???1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收? ? ? ? ? 4.1、添加maven依赖 ???4.2、yaml配置 ???4.3、…

“宠物服务的跨平台整合”:多设备宠物服务平台的实现

2.1 SSM框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架是属于重量级…

Word表格另起一页解决办法

Word表格另起一页解决办法 表格设置根据内容自动调整,取消指定高度第1步 第2步

iOS Masonry对包体积的影响

01 Masonry介绍 Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁。Masonry简化了NSLayoutConstraint的使用方式,让我们可以以链式的方式为我们的控件指定约束。 常用接口声明与实现: 使用方式…

抖去推碰一碰系统技术源码/open SDK转发技术开发

抖去推碰一碰系统技术源码/open SDK转发技术开发 碰一碰智能系统#碰碰卡系统#碰一碰系统#碰一碰系统技术源头开发 碰碰卡智能营销系统开发是一种集成了人工智能和NFC技术的工具,碰碰卡智能营销系统通过整合数据分析、客户关系管理、自动化营销活动、多渠道整合和个…

JS中的闭包和上下文

变量提升 和 函数提升 这里要提到一个提升的概念,即在JS中,在解析代码之前还有一个预处理的过程,这个过程中会把部分变量和函数声明提前到代码的最顶部, 会在其他所有代码之前执行。虽然当我们按照规范(严格模式或者T…

17_HTML5 Web 存储 --[HTML5 API 学习之旅]

HTML5 Web 存储(Web Storage)是 HTML5 引入的一种在用户浏览器中存储数据的机制。它提供了比传统的 cookies 更加方便和强大的功能,包括更大的存储空间、更好的性能以及更简单的 API。Web 存储主要分为两种类型:localStorage 和 s…

如何在 Ubuntu 22.04 上使用 systemctl 管理 systemd 服务教程

简介 Systemd 是许多现代 Linux 发行版提供核心功能的默认服务管理器,而 systemctl 是用户与 systemd 服务交互的方式。这使得 systemctl 成为 Linux 管理员工具箱中重要的一部分。 在本文中,我们将探讨如何使用 systemctl 在使用 systemd 的系统上执行…

Unity3d UGUI如何优雅的实现Web框架(Vue/Rect)类似数据绑定功能(含源码)

前言 Unity3d的UGUI系统与Web前端开发中常见的数据绑定和属性绑定机制有所不同。UGUI是一个相对简单和基础的UI系统,并不内置像Web前端(例如 Vue.js或React中)那样的双向数据绑定或自动更新UI的机制。UGUI是一种比较传统的 UI 系统&#xff…

影刀进阶应用 | 知乎发布想法

文章目录 影刀进阶应用 | 知乎发布想法一、流程流程解释: 二、单条想法发布2.1 素材生产2.2 **进入发布流程**2.3 **输入文本**2.4 插入图片2.5 发布查看 三、批量发布 影刀进阶应用 | 知乎发布想法 一、流程 流程解释: 素材生产 :用AI生成待…

Win Server远程提示密码到期

背景 由于安全问题,取消了堡垒机直接托管资产的模式,需要用户通过堡垒机先登录操作机,然后通过操作机运维对应服务器 问题现象 调整运维模式后,发现原来堡垒机直接运维服务器时候,用户密码到期,可以要求…

GXUOJ-算法-第二次作业

1.矩阵连&#xff08;链&#xff09;乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…

在线学习平台-项目技术点-前台

报错解决方法 1、P166-尚硅谷_在线教育_Nuxt整合错误_nuxt friendly-errors-CSDN博客 2、P168 3、P170 4、P173 npm remove axios npm install axios0.18.0 1、服务端渲染技术NUXT 1.1服务端渲染SSR 服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容&…

【探花交友】day03—MongoDB基础

目录 课程介绍 1、通用设置 1.1 需求分析 1.2 查询通用设置 1.2 陌生人问题 1.3 通知设置 1.4 黑名单管理 2、MongoDB简介 1.1、MongoDB简介 1.2、MongoDB的特点 1.3 数据类型 3、MongoDB入门 2.1、数据库以及表的操作 2.2、新增数据 2.3、更新数据 2.4、删除数…

基于Spring Boot + Vue3实现的在线商品竞拍管理系统源码+文档

前言 基于Spring Boot Vue3实现的在线商品竞拍管理系统是一种现代化的前后端分离架构的应用程序&#xff0c;它结合了Java后端框架Spring Boot和JavaScript前端框架Vue.js的最新版本&#xff08;Vue 3&#xff09;。该系统允许用户在线参与商品竞拍&#xff0c;并提供管理后台…

JVM学习-内存结构(二)

一、堆 1.定义 2.堆内存溢出问题 1.演示 -Xmx设置堆大小 3.堆内存的诊断 3.1介绍 1&#xff0c;2都是命令行工具&#xff08;可直接在ideal运行时&#xff0c;在底下打开终端&#xff0c;输入命令&#xff09; 1可以拿到Java进程的进程ID&#xff0c;2 jmap只能查询某一个时…