JAVA面试专题-Redis

你在最近的项目中哪些场景使用了Redis

缓存

缓存穿透

缓存穿透:查询一个不存在的数据,mysql查询不到数据也不好直接写入缓存,导致每次请求都查数据库。
解决方案一:缓存空数据,即使查询返回的数据为空,也把这个空结果进行缓存(如key:1,value:null)。
优点:简单
缺点:消耗内存(总有空数据),不一致问题(来真的数据了)

解决方案二:布隆过滤器(可以使用redisson实现):查询之前先访问布隆过滤器,如果不存在就直接返回

优点:内存占用少,没有多余key
缺点:实现复杂,存在误判(bitmap位图越小误判越大,数组越大误判越小,但有内存消耗,一半百分之五以内的误判都可以接收)

布隆过滤器作用:可以用于检索一个元素是否在一个集合中(bitmap位图,数组每个单元只能存储0/1)。

 缓存击穿

缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求,只能访问数据库,会把db压垮。

解决方案一:互斥锁
未命中后获取互斥锁(如setnx),处理完后释放锁,其他线程拿到锁才能运行

解决方案二:逻辑过期
在设置key时设置过期时间字段存入缓存,查询时如果过期,获取互斥锁后直接返回过期数据,同时开启新线程进行缓存重建释放锁,其他线程如果获取互斥锁失败后,仍然返回过期数据。

 缓存雪崩

缓存雪崩:同一时间大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库

 解决方案:
1. 给不同的Key的TTL添加随机值,避免同时过期
2. 利用Redis集群提高服务的可用性(哨兵模式,集群模式)
3. 给缓存业务添加降级限流策略(nginx或Spring cloud gateway)
4. 给业务添加多级缓存

《缓存三兄弟》

穿透无中生有key,布隆过滤null隔离。
缓存击穿过期key,锁与非期解难题。
雪崩大量过期key,过期时间要随机。
面试必考三兄弟,可用限流来保底。

先删除缓存还是先修改数据库-双写一致性

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

写操作:延迟双删:先删除缓存,修改数据库,延时一段时间再删除缓存

分布式锁(强一致性,性能低)

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
排他锁:独占锁write,加锁之后,阻塞其他线程读写操作

 异步通知(允许延时一致的业务):

修改数据后写入数据库同时发送消息到MQ,受到MQ消息后更新缓存,主要依赖于MQ的可靠性。

阿里的组件canal组件也可以实现数据同步,不需要更改业务代码,部署服务后,它会把自己伪装成mysql的一个从节点,mysql数据更新后,canal会读取binlog数据,然后通过canal客户端获取到数据,更新缓存即可。

Redis持久化

RDB

RDB(Redis Database Backup file)Redis数据备份文件,也叫Redis数据快照,可以把内存中的所有数据记录到磁盘中,当Redis故障时,从磁盘读取快照文件,恢复数据。

主动备份:save bgsave(不影响主进程,一般用这个)
被动备份:redis.conf修改文件

RDB执行原理:物理内存通过进程中的页表交换数据,bgsave开始时会fork主进程得到子进程(复制页表),子进程完成fork后读取内存数据并写入RDB文件,fork采用copy-on-write技术(主进程读取内存时,访问共享内存;主进程执行写操作时,从内存中拷贝一份数据副本执行写操作,以后主进程读也从副本读)

AOF

AOF(Append Only File)追加文件,redis处理的每一个写命令都会记录在AOF文件中,可以看做是命令日志文件。

因为是记录命令,所以AOF文件会很大,通过bgrewriteaof命令,让AOF执行重写功能,只有最后一次有意义。也可以在配置文件里设置触发阈值自动重写。

Redis过期策略

惰性删除

设置key过期时间后,不去管它,下次使用该key时,检查是否过期,过期删除。
优点:CPU友好,不用浪费时间检查
缺点:内存不友好,不用就永远不会释放

定期删除

每隔一段时间对key检查,从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key。氛围SLOW(执行频率10hz,每次不超过25ms)和FAST(每次时间循环尝试执行,间隔不低于2ms,耗时不超过1ms)两种模式。
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对cpu的影响,也能释放过期key占用的内存
缺点:难以确定删除操作的时长和频率

所以:Redis的过期删除策略为:惰性删除+定期删除配合使用

数据淘汰策略

使用建议:
1. 优先使用allkeys-lru策略,把最近最常访问的数据留在缓存中,如果业务有明显的冷热数据区分建议使用。
2. 访问数据频率差别不大,没有明显冷热区分,建议使用allkeys-random随机淘汰
3. 如果有置顶要求,使用volatile-lru策略,同时置顶数据不设置过期时间
4. 如果业务有短时高频访问的数据,建议使用lfu策略

分布式锁

可以使用setnx命令,或者直接用redisson(底层是setnx和lua脚本)

看门狗机制

每隔一段时间自动做一次续期(默认每隔十秒续期一次)

 可重入性

 基于redssion实现的分布式锁可重入,利用hash结构记录线程id和重入次数

主从一致性

RedLock(红锁):布置在一个redis实例上创建锁,应该实在多个redis实例上创建锁(n/2+1)。
但是红锁这个思想,实现复杂,性能差,运维繁琐,因为redis是基于AP思想啊(可用性),如果要实现主从一致,可以利用CP思想(一致性)的zookeeper来实现。

Redis集群方案

主从复制

单节点redis的并发能力是有上限的,要提高并发能力就要搭建主从集群,实现读写分离,往主节点里写,从节点里读。

 主从全量同步

slave节点执行replicaof命令建议连接,请求master数据同步(发送replid和offset),master判断是否是第一次同步(replid是否一致),如果是第一次,就向slave返回master的数据版本信息(replid,offset),slave保存版本信息,master执行bgsave生成RDB文件并向slave发送,slave清空本地数据,加载RDB文件。在这个发送期间,主节点记录RDB期间的所有命令存入到repl_baklog中发送到slave,slave执行接收到的命令。

 主从增量同步

适用于slave重启或后期数据变化,从节点发送replid和offset,主节点判断是否一致,如果不是第一次,就回复continue,之后去repl_back中获取offset后的数据,发送命令。

哨兵机制

Sentinel哨兵机制实现主从集群的自动故障恢复。

 服务状态监控

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令
主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
客观下线:如果超过sentinel数量一半的哨兵都认为该实例主观下线,该实例客观下线。

哨兵选主规则

判断主与从断开时间长短,超过指定值就排该从节点
然后判断从节点的slave-priority值,越小优先级越高
如果优先级一样,判断offset值,越大优先级越高
判断slave节点的运行id大小,越小优先级越高

集群脑裂

主节点和从节点和哨兵处于不同网络分区,使得哨兵灭有能够心跳感应到主节点,所以选举出了一个新的主节点,这样就存在了两个master,像大脑分裂一样,导致客户端孩子啊老主节点写入数据,新节点无法同步数据,网络恢复后,哨兵会将老的主节点降为从节点,再从新master中同步数据,导致数据丢失。
解决:修改redis配置,设置最小的从节点数量以及缩短主从数据同步的延迟时间。

 分片集群结构

主从和哨兵可以解决高可用,高并发读的问题,但是没有解决海量数据存储和高并发写问题,这时可以使用分片集群。
分片集群特征:
集群中有多个master,每个master保存不同数据
每个master有多个slave节点
master之间通过ping监测彼此健康状态
客户端请求可以访问集群任意节点,最终都会转发到正确节点

分片集群结构:数据读写

引入哈希槽概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

 Redis是单线程的为什么速度这么快?

Redis是存内存操作,执行速度非常快
采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题
使用I/O多路复用模型,非阻塞IO

I/O多路复用模型

redis是纯内存操作,执行速度非常快,性能瓶颈是网络延迟而不是执行速度,I/O多路复用模型实现了高效的网络请求

常见的IO模型

阻塞IO:等待数据和从内核拷贝数据到用户空间都需要阻塞等待
非阻塞IO:recvform阶段立即返回结果而不阻塞第二阶段依旧阻塞
IO多路复用:利用单个线程来同时监听多个Socket,并在某个Socket可读,可写时得到通知,避免无效等待,充分利用cpu资源。

Redis网络模型

 提供了连接应答处理器,命令回复处理器(多线程回复事件),命令请求处理器(命令转换使用多线程,增加速度,命令执行依旧是单线程)。

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

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

相关文章

微信小程序开发核心:样式,组件,布局,矢量图标

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

MAC 本地搭建Dify环境

Dify 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过…

国内首个图计算平台团体标准发布,创邻科技参与编撰

2024年,由中国通信标准协会批准的团体标准《大数据 图计算平台技术要求与测试方法》(编号:T/CCSA 470—2023)(下称:标准)正式实施。该标准于1月4日在全国团体标准信息平台(https://w…

超越GPT-4,清华发布网页导航智能体AutoWebGLM

随着大语言模型(LLMs)的发展,Agent在网络导航等任务中展现出了前所未有的能力。想象一下,一个基于LLM的Agent能够在你享用早餐时为你总结在线新闻,这样的场景已经不再遥不可及。这种将LLMs融入日常任务的做法&#xff…

AI小白使用Macbook Pro安装llama3与langchain初体验

1. 背景 AI爆火了2年有余,但我仍是一个AI小白,最近零星在学,随手记录点内容供自己复习。 上次在Macbook Pro上安装了Stable Diffusion,体验了本地所心所欲地生成各种心仪的图片,完全没有任何限制的惬意。今天想使用M…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台,在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序,它使得管理和监控Kafka集群变得简单直观。本文将…

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分,它主要用于处理企业内部文件向外部传输的流程,确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括: 1、防止数据泄露:通过严格的审批流程和安全策略&…

【JavaWeb】Day61.SpringBootWeb案例——配置文件

配置文件 参数配置化 在我们之前编写的程序中进行文件上传时,需要调用AliOSSUtils工具类,将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时,需要一些参数: - endpoint //阿里云OSS域名 - accessKey…

JAVA基础---Stream流

Stream流出现背景 背景 在Java8之前,通常用 fori、for each 或者 Iterator 迭代来重排序合并数据,或者通过重新定义 Collections.sorts的 Comparator 方法来实现,这两种方式对 大数量系统来说,效率不理想。 Java8 中添加了一个…

【酱浦菌-模拟仿真】python模拟仿真PN结伏安特性

PN结的伏安特性 PN结的伏安特性描述了PN结在外部电压作用下的电流-电压行为。这种特性通常包括正向偏置和反向偏置两种情况。 正向偏置 当外部电压的正极接到PN结的P型材料,负极接到N型材料时,称为正向偏置。在这种情况下,外加的正向电压会…

如何编写测试用例

总结 测试用例需求来源 文档 用户角度 编写测试用例步骤 分析需求 写测试点 对需求的拆分 辅助完成测试用例的编写 编写测试用例 编写测试用例原则 能看懂 能执行 测试结果状…

kubernetes中Pod调度-Taints污点和污点容忍

一、污点的概念 所谓的污点,是给k8s集群中的节点设置的,通过设置污点,来规划资源创建是所在的节点 污点的类型 解释说明PreferNoshedule 节点设置这个污点类型后; 表示,该节点接收调度,但是会降低调度的概…

如何退出远程桌面连接?

远程桌面连接是一种便捷的远程访问方式,可以让用户在任何地方远程访问并控制另一台计算机。但是,在使用远程桌面连接过程中,有时我们需要及时退出连接,以保护数据安全或释放计算资源。本文将介绍如何退出远程桌面连接。 使用Windo…

IC设计数据传输 如何能保障安全高效?

IC(集成电路)设计数据,对于IC设计企业来说,其重要性不言而喻。所以IC设计数据传输过程中,其安全性和效率,也需要有保障。 首先我们来看看IC设计数据为什么重要,其重要性体现在多个方面&#xff…

分布式与一致性协议之Raft算法(二)

Raft算法 什么是任期 我们知道,议会选举中的领导者是有任期的,当领导者任命到期后,需要重新再次选举。Raft算法中的领导者也是有任期,每个任期由单调递增的数字(任期编号)标识。比如,节点A的任期编号是1。任期编号会…

Python基础学习之去除换行符

strip() 方法 strip() 方法用于去除字符串开头和结尾的空白字符,包括换行符(\n)、制表符(\t)和空格等。如果您想从字符串数据中去掉换行符,无论是单独存在的还是与其他空白字符一起,strip() 方…

自动驾驶中的深度学习和计算机视觉

书籍:Applied Deep Learning and Computer Vision for Self-Driving Cars: Build autonomous vehicles using deep neural networks and behavior-cloning techniques 作者:Sumit Ranjan,Dr. S. Senthamilarasu 出版:Packt 书籍…

算法设计与分析4.1 迷宫问题 栈与队列解法、打印矩阵、三壶问题、蛮力匹配

1.ROSE矩阵 实现&#xff1a; 使用算法2 分析&#xff1a; 每半圈元素值的增长规律变换一次 设增量为t&#xff0c;每半圈变换一次t <— -t . 设矩阵边长为i&#xff0c;每半圈的元素个数是2*(i-1)个&#xff0c;hc为记数变量&#xff0c;则1≤hc<2i-1&#xff0c;前1/…

[华为OD]C卷 找座位,在一个大型体育场内举办了一场大型活动,由于疫情防控的需要 100

题目&#xff1a; 在一个大型体育场内举办了一场大型活动&#xff0c;由于疫情防控的需要&#xff0c;要求每位观众的必须间隔至 少一个空位才允许落座。现在给出一排观众座位分布图Q,座位中存在已落座的观众&#xff0c;请计 算出&#xff0c;在不移动现有观众座位的情况…

Linux中ssh登录协议

目录 一.ssh基础 1.ssh协议介绍 2.ssh协议的优点 3.ssh文件位置 二.ssh原理 1.公钥传输原理&#xff08;首次连接&#xff09; 2.ssh加密通讯原理 &#xff08;1&#xff09;对称加密 &#xff08;2&#xff09;非对称加密 3.远程登录 三.服务端的配置 常用的配置项…