redis面试题详解

news2024/12/23 1:08:59

缓存

缓存穿透

缓存穿透:查询一个不存在的数据,MySQL查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。

解决方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存

解决方案二:布隆过滤器

 Redission,Guava都提供了对布隆过滤器的实现方法,可以设置一个误判率,一般在%5以内,不至于在高并发下压倒数据库。

缓存击穿

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

解决方案一:互斥锁

解决方案二:逻辑过期

 缓存雪崩

缓存雪崩:是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案一:给不同的key的TTL添加随机值

解决方案二:利用Redis集群提高服务的可用性(哨兵模式,集群模式)

解决方案三:给缓存业务添加降级策略 (nginx或spring cloud gateway)

解决方案四:给业务添加多级缓存(Guava或Caffeine)

双写一致性

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

根据业务场景分两种。

一致性要求高:

读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间

写操作:延迟双删

 这两个操作都会导致脏数据,于是采用延迟双删策略,删除两次缓存

 数据库一般是主从模式,需要延时一会,让主节点把数据同步到从节点

 允许短暂不一致:

方案一:异步通知保证数据的最终一致性(使用mq中间件,更新数据之后,通知缓存删除)

 方案二:使用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取

binlog数据更新缓存

 持久化

在redis中提供了两种数据持久化的方式:1,RDB  2,AOF

RDB:redis数据备份文件,也叫redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当redis实例故障重启后,从磁盘读取快照文件,恢复数据

 AOF:追加文件,redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件

数据过期策略

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

惰性删除:设置该key过期时间后,我们能不去管他,当需要该key时,我们再检查其key是否过期,如果过期,我们就删掉它,反之返回该key。

优点:对cpu友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直在内存中,内存永远不会释放。

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

定期删除有slow和fast两种模式,slow执行频率默认10hz,每次不超过25ms;fast模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

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

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

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

数据淘汰策略

数据淘汰策略:当redis中的内存不够用时,此时再向redis中添加新的key,那么redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

noeviction:不淘任何key,但是内存满时不允许写入新数据,默认就是这种策略

volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰

allkeys-random:对全体key,随机进行淘汰。

volatile-random:对全体设置了ttl的key,随机进行淘汰。

allkeys-lru:对全体key,基于LRU算法进行淘汰

volatile-lru::对全体设置了ttl的key,基于LRU算法进行淘汰

allkeys-lfu:对全体key,基于LFU算法进行淘汰

volatile-lfu::对全体设置了ttl的key,基于LFU算法进行淘汰

 分布式锁

服务时集群的话用syconize锁只能在本地起作用,所以要用分布式锁。

redis实现分布式锁主要利用Redis的setnx命令,setnx是SET if not exists(如果不存在,则SET)的简写。

 

设置超时时间是为了防止因业务超时或服务宕机导致死锁。

 redis实现的锁可重入。

redisson实现的分布式锁-主从一致性

 

 

redis中提供的集群方案总共有三种:主从模式,哨兵模式,分片集群。

 主从模式

 

 哨兵模式

分片集群

 分片集群解决海量数据存储和高并发写的问题。

其他redis面试题

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

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

相关文章

WSL2安装Ubuntu及一些问题

文章目录 安装wsl2设置wsl版本安装Linux发行版问题问题1问题2 迁移导出注销原系统导入 windows和linux互传文件解决raw.githubusercontent.com无法访问的问题 安装wsl2 安装条件 内部版本 19041 及以上 (win10 2004以上或者win11) 查看方法:按 Windows健 R -->…

mathtype7.4数学计算工具下载安装教程

很多朋友使用word写文档或者论文,但是又要插入很多数学计算公式的情况,使用word本身的公式和符号并不是很方便用,今天分享给大家一个实用的数学工具mathtype。 MathType软件可以选择下载Windows版本MathType 7或Mac版本MathType 7。MathType…

OpenGL超级第11章学习笔记:高级数据管理

前言 本篇在讲什么 OpenGL蓝宝书第十一章学习笔记之高级数据管理 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&#x…

export 和 export default 的区别

一、铺垫 ES6模块化主要包含以下3种用法: ① 默认导出和默认导入---export default ② 按需导出和按需导入---export ③ 直接导入并执行模块中的代码 二、默认导出 语法:export default 需要共享的成员 创建一个共享的数据 order.js let name…

云服务器上的数据库莫名被删除?

云服务器上的数据库莫名被删除? 前言排查问题及解决后续 前言 如题,之前,自己买了一个云服务器,用来练手,然后搭了一个自己的网站部署了上去。本来也就是练练手,没想到前几天去用的时候发现死活登录不上去…

SSTI——java里的ssti

1.Velocity 2.FreeMarker 因为从来没接触过java语言 所以对这些也是基本上一窍不通 这里只简单的提及 不做具体介绍 会找一下题来做 但是没有找到有关java ssti的题目 confusion1 看一下描述 打开题目 没发现什么东西 但是 login register页面显示访问不成功 查看源代码找到…

【转载】陆奇最新演讲全文实录:大模型带来的新范式(附下载文档)

《新范式 新时代 新机会》为主题的分享活动,陆奇博士以“新范式”为核心,分享了他对当前技术变革的观点,基于演讲整理了文字稿,也同步分享完整的PPT和视频,欢迎大家一起交流。 下载PDF文件: 《ChatGPT研究…

yolov8 人体姿态关键点检测

参考: https://github.com/ultralytics/ultralytics https://github.com/TommyZihao/Train_Custom_Dataset/tree/main/%E5%85%B3%E9%94%AE%E7%82%B9%E6%A3%80%E6%B5%8B ##安装 pip install ultralytics -i https://pypi.douban.com/simple1、命令行运行 pip安装好…

图像金字塔

​ 图像金字塔是由一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点。下图是一个图像金子塔的示例。从图中可以看到,图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低…

静电监控系统选购策略:有效提高系统可靠性与性价比

随着工业自动化和信息化程度的提高,静电在工业生产中的影响越来越显著。静电的存在会对电子设备、传输介质等产生不良影响,甚至会导致产品损坏和火灾事故的发生。因此,静电监控系统的选购对于工业生产的稳定具有重要意义。 一、功能需求 静…

Java实训日志06

文章目录 八、项目开发实现步骤(八)创建服务接口1、创建学校服务接口2、创建状态服务接口3、创建学生服务接口4、创建用户服务接口 (九)创建服务接口实现类1、创建学校服务接口实现类2、创建状态服务接口实现类3、创建学生服务接口…

【CMake 入门与进阶(10)】 CMakeLists.txt 语法规则_循环语句(附使用代码)

cmake 中除了 if 条件判断之外,还支持循环语句,包括 foreach()循环、while()循环。 foreach 循环 1、foreach 基本用法 foreach 循环的基本用法如下所示: foreach(loop_var arg1 arg2 ...)command1(args ...)command2(args ...)... endfore…

chatgpt赋能python:Python编写计算器的方法

Python编写计算器的方法 介绍 计算器是一款常见的实用工具,它能够进行基本的算数运算,如加减乘除等。在Python中,我们可以利用各种库和函数来实现计算器的功能,从而方便地进行数值计算。 怎么编写计算器 在Python中&#xff0…

WINS服务的作用和效率

WINS服务的作用和效率 目录 WINS服务的作用和效率 一、WINS服务 二、配置 2.1、服务端 2.2、客户端 2.3、配置方法 三、效果 3.1、计算机-网络(过去的“网上邻居”) 3.2、局域网打印机共享 3.3、基于NetBios名称的数据库客户端连接 一、WINS服…

爆肝万字带你超级详细全面了解Linux命令大全

🍁前言 👑作者主页:👉CSDN丨博客园 🏆学习交流:👉在下周周ovoの社区 对这篇万字博客目录总结如下: 关机命令、重启命令,创建用户、删除用户、修改密码、切换用户、切换到…

Centos8 如何给磁盘扩容

今天发现 在home目录下无法写入文件,经过查看磁盘空间,发现/dev/mapper/cl-home空间满了。于是乎,给磁盘进行扩容,扩充成功,下面将操作步骤分享出来。 查看空间 [rootasrcent8 ~]# df -k 文件系统 1K…

jsp与java bean

软件开发应具有较高的可维护性,以方便后续的代码维护,而实现高可维护性的有效途径是要实现软件的低耦合、高内聚。软件设计分层的概念主要就是将软件各部分进行解耦合设计,对于JSP动态开发技术而言, JavaBean是最基础的分层技术。…

Java集合框架:栈、Stack详解

目录 一、栈 二、栈的使用 1. Stack类 2. 栈的模拟实现 三、栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环(如:逆序打印链表) 3. 栈的oj题练习(oj题中都用到了栈这种数据结构) 四、栈,虚拟机…

Stable diffusion webui 本地安装教学

Stable diffusion AI的绘图工具,这是一种扩散模型,可以通过不断去噪来获得最终的艺术作品。这款工具是当前最受欢迎的AI绘图工具之一,不仅是还是开源的,而且其中的AUTOMATIC111 Stable-diffusion-webui版本深受AI绘图玩家的喜爱&a…

三、Docker的基本组成和常用命令(一)

文章目录 Docker的基本组成镜像(image)容器(container)仓库(repository)总结 Docker的常用命令帮助命令镜像命令docker imagesdocker searchdocker pulldocker rmi Docker的基本组成 镜像(image) Docker 镜像(Image)就是一个只读的模板。镜像可以用来创…