Redis相关面试题(二)
一、Bit中不同命令使用的场景
二、什么是缓存击穿,缓存穿透,缓存雪崩?
缓存击穿:是指当某一个key的缓存过期时大并发量的请求同时访问key,瞬间击穿服务器直接访问到数据库,使得数据库处于负载情况
缓存穿透:是指缓存服务器中没有缓存数据,数据库中也没用符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去作用
缓存击穿是只击穿服务器端访问数据库,而缓存穿透是服务器端和数据库都没有的情况
缓存雪崩:是指当大量缓存同时过期或者缓存服务宕机,所有请求都直接访问数据库,造成数据高负载,影响性能,甚至数据库宕机
对于缓存击穿可以用异步加载、互斥锁和提前预热的办法解决
对于缓存穿透的防止常用的是布隆过滤器和黑名单的方式
布隆过滤器是一种比较巧妙的概率性数据结构,它可以告诉你数据一定不存在或可能存在,相比Map、Set、List等传统的数据结构,它占用的内存少、结构更高效
对于缓存雪崩的情况可以设置不同的过期时间和集群的方法实现
三、Redis的集群方式是什么?
典型回答
Redis有三种主要的集群模式,用于在分布式环境中实现高可用性和数据复制,模式主要是:主从模式、哨兵模式和Redis Cluster模式
1. 主从模式
主从模式是Redis中最简单的集群模式,这个模式主要是为了解决单点故障的问题,所以将数据复制多个副本中,这样即使有一台服务器出现故障,其他服务器依旧可以继续提供服务。
主从模式中主要包括一个主节点和多个从节点,主节点负责处理所有读和写操作,而从节点则复制主节点的数据,并且只处理读操作,当主节点出现故障时,可以将包含数据较多的从节点升级为主节点,实现故障转移,但是这个步骤需要手动实现
优点:简单明了,适用于读多写少的场景
缺点:不具备自动转移功能的能力,没办法容错和恢复
2.哨兵模式
为了解决主从模式的不能自动容错及恢复的问题,Redis引入了一种哨兵模式的集群架构。
哨兵模式是在主从模式的基础上加入了哨兵节点,哨兵节点是一种特殊的Redis节点,用于监控主节点和从节点的状态。当主节点出现故障时,哨兵节点可以自动进行故障转移,选择一个包含数据较多的从节点升级为主节点,并通知其他节点和应用程序进行更新。
优点:解决了主从模式的不能自动转移故障的问题,提供了自动化监控和故障恢复机制
缺点:虽然可以自动故障转移但是还是不支持自动的数据分区,并且随着节点数量的增加,管理和配置的复杂性会增大
3.Cluster模式
Redis Cluster模式是Redis中推荐的一种分布式集群解决方案,它将数据自动分片到多个节点上,每个节点负责一部分数据
优点:真正实现了分布式存储,每个节点都可以处理读写请求,具备良好的水平扩展能力,内置数据分割、故障排查、和转移能力
缺点:相比于其他模式,更加复杂,需要更多的网络资源和配置管理,客户端需要支持集群特性,跨slot的数据操作可能涉及多个节点,有一定的复杂度
四、Redis过期键的删除策略?
Redis的Key是可以设置过期时间的,Redis的key有着两种删除策略:1.惰性删除,2.定期删除
1. 惰性删除:当key过期时,先放着不管,当每次从键空间中获取key时,检查取得的键是否已经过期,如果已过期的话,就删除该键,如果没有过期,就返回该键
2.定期删除:每隔一段时间就对数据库进行一次扫描检查,删除里面的过期键,至于要删除多少键,检查多少数据库,要由算法决定
五、Redis的内存删除策略有哪些?
Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
Redis提供了8种数据淘汰策略
LRU全称Least recently used, 淘汰的是最近最少被使用的数据项。(时间概念) 最近最少
LFU全称Least-frequently used,淘汰的是访问频率最低的数据项。 一直最少
- 默认策略
noeviction 不淘汰数据,写不进去返回错误 - 只针对设置过期的keys
1. volatile-lru 根据LRU算法挑选数据淘汰
2. volatile-lfu 根据LFU算法挑选数据淘汰
3. volatile-random 随机挑选数据淘汰
4. volatile-ttl 挑选越早过期的数据进行删除 - 所有keys
1. allkeys-lru 根据LRU算法挑选数据淘汰
2. allkeys-lfu LFU算法挑选数据淘汰
3. allkeys-random 随机挑选数据淘汰
六、阐述Redis的主从同步机制?
Redis的主从同步机制是一种特别重要的特性,它允许数据从一个Redis主服务器复制到一个或多个从服务器。这种机制不仅可以提高系统的读取性能,还可以用于数据备份和高可用架构的设计
主要步骤:
第1-4步属于全量,第5步属于增量
- 从服务器向主服务器发送同步命令:sync
- 主服务器接收到同步命令后,会执行bgsave命令,在后台生成一个rdb文件,并使用一个缓存区记录从现在开始执行的所有写命令
- 当主服务器执行完bgsave命令后,会将生成的rdb文件发送给从服务器
- 从服务器接收到这个rdb文件,然后加载到内存;之后主服务器会把刚刚在缓存区的命令同步过来,从服务器就会执行这些命令
- 以上处理完之后,主数据库每执行一个写命令,都将写命令发送给从数据库
七、Redis和Mysql数据库数据如何保持一致性?
我们在实际项目中经常使用到Redis缓存用来缓解数据库压力,但是当更新数据库时,我们一般采用延时双删策略。目前常用的做法是查询一个接口,先查询Redis,如果不存在则查询数据库,并将结果放入到Rdis中。
7.1 常见的更新策略
- 先删缓存,再更新数据库
- 先更新数据库,再删缓存
- 普通双删
- 延时双删
7.1.1 先删缓存,再更新数据库
- 线程A删除缓存数据,此时还没有更新数据库
- 线程B 查询缓存没有数据,查询数据库还是旧数据,放入缓存
- 线程C以及其他线程使用旧缓存数据,缓存和数据库不一致
7.1.2 先更新数据库,再删除缓存
- 线程A更新数据库,此时还没有删除缓存
- 线程B以及其他线程此时还是使用的旧缓存数据,和数据库不一致
7.1.3 普通双删
- 线程A先删除缓存,再更新数据库,然后再删除一次缓存
- 线程B查询缓存时没有数据,在线程A更新数据库之前,查询到旧数据,此时系统时间切换到线程A执行删除缓存,然后又到线程B放入缓存旧数据
- 线程C针对线程A,查询到缓存没有数据,查询数据库的旧数据,然后将旧数据放入到缓存中
这些都不能满足缓存和数据一致性
7.1.4 延时双删
- 线程A先删除缓存,之后再更新数据库
- 线程B和线程C查询数据时,才发现缓存中没有数据,就去查询数据库,线程B查询到的是旧数据,线程C查询到的是新数据,之后都放入到缓存中。
- 线程A延时3-5秒(时间一般要大于SQL执行时间+线程切换时间)后,再将缓存删除。之后其他线程再次查询缓存,发现没有数据,再去查询数据库并且放入缓存都是新数据
- 极端情况下,就是如线程D,延时时间超过线程A的延时时间后,再次将旧数据放入到缓存中,这时缓存和数据库的数据还不是一致的,所以延时双删也不是一定能够保证缓存和数据保持一致的
7.2 建议的解决方案
- 当发现缓存没有数据后,在执行查询数据库前,对该key进行加锁,查询数据库并放入缓存后再解锁,这样可以避免缓存击穿问题,当某个redis数据不存在时,大量线程并发查询数据库。
- 在需要执行双删前,对该Key进行加锁,之后执行删除缓存,更新数据库,放入新数据到缓存,在解锁。保证缓存和数据一致性。
- 加锁的Key都需要设置过期时间,避免因为宕机造成死锁。
相关文章:

Redis相关面试题(二)
一、Bit中不同命令使用的场景 二、什么是缓存击穿,缓存穿透,缓存雪崩? 缓存击穿:是指当某一个key的缓存过期时大并发量的请求同时访问key,瞬间击穿服务器直接访问到数据库,使得数据库处于负载情况 缓存穿透…...
Docker Compose与私有仓库
Docker Compose与私有仓库 docker-compose -v 查看版本信息 Docker Compose的应用 创建APACHE容器 vim docker-compose.yaml yaml文件缩进严格;冒号后有内容需要加空格,冒号后无内容一般不加空格 冒号后的内容中若包含路径‘/’或‘:’时…...

AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
AI学习记录已经发了十几篇,大佬们可以看看,如果有帮助动动小手点赞 token入门版,有空会更新具体代码操作 GPT4当中,我们提问问题是按照token进行扣费的,那到底什么是token? 在不同的语言模型当中&#x…...

Java线程池和执行流程
在 Java 中,常见的四种线程池包括: 1. newFixedThreadPool(固定大小线程池) 应用场景:适用于需要限制线程数量,并且任务执行时间比较均匀的场景,例如服务器端的连接处理。优点:线程数…...

进程信号的产生与处理
目录 前言 一.信号的概念 二.信号的产生 1.键盘产生 2.系统调用 3.软件条件 4.异常 三.信号的保存 四.信号的处理 信号处理的方式 设定屏蔽信号 自定义处理信号 信号处理的时机 前言 进程信号(Process Signals)是操作系统与运行进程之间进行通…...

统一响应结果封装,Result类的实现【后端 06】
统一响应结果封装,Result类的实现 在开发Web应用或API接口时,如何优雅地处理并返回响应结果是每个开发者都需要考虑的问题。统一响应结果封装(Unified Response Encapsulation)作为一种广泛采用的实践,不仅提高了API的…...

明日周刊-第20期
本周异形新电影上映,开始期待起来了,毕竟这是一个经久不衰的ip。还有就是马上来临的黑神话悟空,属于我们自己的3A大作,接下去的每一天都是新的期待。 文章目录 科技短讯资源分享随便说说一点心情 科技短讯 科技创新与突破 人工智…...
深入剖析 Spring 常用注解:功能与差异的全景洞察
《深入剖析 Spring 常用注解:功能与差异的全景洞察》 在当今的 Java 开发领域,Spring 框架无疑是最广泛使用的框架之一。而在 Spring 中,注解的运用极大地简化了开发流程,提高了代码的可读性和可维护性。本文将深入探讨 Spring 中…...
【隐私计算篇】隐私计算使用不当也会泄露原始数据
1. 背景信息 有个有趣的问题,刚好最近有讨论到,在这里也抛一下,就是隐私计算中我们经常谈到主流的一些技术,比如联邦学习、多方安全计算、安全求交、匿踪查询、可信执行环境等,然后笼统地会称这些技术实现了对隐私…...

C++第一讲:开篇
C第一讲:开篇 1.C历史背景1.1C创世主--本贾尼1.2C版本更新1.3C的重要性1.4C书籍推荐 2.C的第一个程序3.命名空间3.1namespace是什么3.2namespace的使用3.3namespace使用注意事项3.4命名空间的使用 4.C输入和输出5.缺省参数6.函数重载7.引用7.1什么是引用7.2引用的定…...

OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析
1. 背景 1.1. OceanBase Mysql gis空间表达式的应用场景及能力 在OceanBase 4.1版本中,mysql模式下支持了gis数据类型以及部分空间对象相关的表达式,随着客户使用空间数据的需求日益增长,需要快速地补齐空间数据存储和计算分析的能力&#…...

HSL模型和HSB模型,和懒人配色的Color Hunt
色彩不仅仅是视觉上的享受,它在数据可视化中也扮演着关键角色。通过合理运用色彩模型,我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL(Hue, Saturation, Lightness)和HSB(Hue, Saturation, Brightness&#x…...

什么是云原生?(二)
1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义,云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…...
pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝
torch-pruning官方提供了基于yolov8的剪枝代码,基于此代码改进博主实现了对yolov10n模型的剪枝。虽然实现了对yolov10n模型的剪枝,剪枝目标为移除60%的通道,然而实验是失败的,针对coco数据集进行操作,剪枝前的模型map时37,剪枝后只能恢复到22,比预计下降了15个点,剪枝后…...

LeetCode_sql_day15(262.行程与用户)
描述:262. 行程和用户 - 力扣(LeetCode) 取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 编写解决方案找出 "2013-10-01" 至 "2013-10-03" 期间非禁止…...

【MySQL】详解数据库约束、聚合查询和联合查询
数据库约束 约束类型 数据库的约束类型主要包括以下几种: 主键约束(Primary Key Constraint):确保表中的每一行都有唯一的标识,且不能为NULL。 外键约束(Foreign Key Constraint):…...
bug积累
1.只写 int p[len1 len2]; 时,实际上是在使用 C99 标准中引入的变长数组(VLA, Variable Length Array)的特性。变长数组允许在栈上分配其大小在运行时确定的数组。这意味着 len1 和 len2 的值可以在程序运行时确定,但仍然可以用来…...
版本控制案例:全球虚拟制片领导者Dimension借助Perforce Helix Core简化多供应商协作,控制访问权限,确保数据资产安全(下)
创建虚拟世界和人物角色需要一系列的软件工具。但最终愿景很少是由单一工作室独立完成的。对于大型项目,工作室需要通力合作,将全球的团队成员和数字资产联合起来。 Dimension Studio——体积内容捕捉和虚拟制片领域的领导者——不断将新技术和新方法融…...

Anaconda配置envs和pcks路径
问题 原先Anaconda安装在C盘,安装很多包后只剩几个G了,为了给C盘腾空间,卸载后重新安装在了D盘,但是创建了新环境后发现环境位置依旧在C盘,安装新的包仍然会占用C盘空间。 解决办法 查看conda的配置信息 执行如下命…...

推荐10个在线搭建框架平台
前言 在开发项目的时候,首先就是要搭建一个框架。这个框架可以是纯技术框架,也可以具备一定功能的开源框架。但是在搭建框架的时候,版本的冲突,环境的配置等是新手们一直头痛的问题,在构建开源框架的时候,…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...