Java面试汇总——redis篇

1、什么是缓存穿透 ? 怎么解决 ?

        缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存就形同虚设(只有数据库查到了,才会让redis缓存,但现在的问题是查不到),会频繁的去访问数据库。

       解决方案:

  • 缓存空对象:如果该数据在缓存和数据库中都不存在,就缓存一个空值到redis中,并且超时时间设置得短一点,如2分钟,以防占用太多redis空间。
  • 布隆过滤:布隆过滤器是处于redis之前的一段过滤器,底层是根据哈希来实现的,客户端的所有请求都会通过该过滤器进行过滤,由于哈希的性质,若该过滤器都查不到数据,则直接返回错误信息;若查到了则放行,但也不一定存在该数据(存在哈希冲突)。

2、什么是缓存击穿? 怎么解决 ?

        缓存击穿也叫热点Key问题,一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。

        解决方案:

  • 互斥锁:只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求。
    • 优点:强一致性。
    • 缺点:性能差。
  • 逻辑过期:①在缓存中多设置一个逻辑过期字段,而不真正设置过期时间。②查询时,通过过期字段来判断当前key是否过期。③若过期,则另外开一个线程去数据库查询并同步缓存数据,当前线程则返回旧数据。
    • 优点:性能高,具有高可用性。
    • 缺点:无法保证数据绝对一致。

3、什么是缓存雪崩? 怎么解决 ?

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

       解决方案:

  • 给不同的Key的TTL添加随机值,让其在不同时间段分批失效。
  • 利用Redis集群提高服务的可用性。(哨兵模式,集群模式)
  • 给缓存业务添加降级限流策略。(保底策略)
  • 给业务添加多级缓存。(可以理解为穿了好几件防弹衣)。

4、redis做为缓存,mysql的数据如何与redis进行同步呢?

        业务中有优惠券秒杀功能要求实时性比较高,因此采用读写锁保证redis和mysql的强一致性。 主要采用redisson实现的读写锁,读的时候添加共享锁(读锁),保证读读不互斥,读写互斥;更新数据的时候添加排他锁(写锁),读读、读写都互斥。 这样可以防止写数据的时候其他线程读数据,避免了脏数据

排他锁是如何保证读写、读读互斥的呢?

        排他锁底层使用的是setnx,保证了同时只能有一个线程操作锁住的方法。

延时双删

        延时双删也是分布式系统中保持redis和mysql一致性的常用策略,但不具有强一致性。

  • 延时双删:当前为写操作时,先删除redis中的缓存,再更新数据库,短暂延时之后再次删除redis中的缓存。
    • 为什么要两次删除redis缓存?
      • ​​​​​​防止​数据库还没更新完,有别的线程读取了数据库的脏数据,并更新redis缓存。
    • 为什么要延时删除?
      • 数据库一般是主从模式,需要给主节点一些时间同步数据到从节点中。

5、redis做为缓存,数据的持久化是怎么做的?

        Redis是内存数据库,宕机后数据会消失,需要提供持久化策略Redis中提供了两种数据持久化的方式:RDB 和 AOF

  • RDB(Redis DataBase):是一个快照文件,它把redis内存存储的数据写到磁盘上,当
    redis 宕机恢复数据的时候,方便从 RDB 的快照文件中恢复数据。
    • 优点:RDB是二进制压缩文件,占用空间小,便于传输,恢复数据速度较快。
    • 缺点:不能保证数据的完整性,两次备份之间会有数据丢失。
    • 创建RDB文件的两个命令:
      • SAVE:会阻塞Redis服务器进程,直到RDB文件创建完毕为止。
      • BGSAVE:会派生出一个子进程负责创建RDB文件,父进程继续处理命令请求。
  • AOF(append only file):当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据。(AOF会记录过程,RDB只管结果
    • 优点:文件较大,恢复速度较慢。
    • 缺点:数据的完整性较高。

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

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

  • 惰性删除:设置该key过期时间后,不去管它,当需要该key时,再检查其是否过期,如果过期,我们就删掉它,反之返回该key。
    • 优点:对CPU友好,只在使用该key时才进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。
    • 缺点:对内存不友好,过期的key将一直存在于内存中不会释放。
  • 定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key。
    • 优点:可以通过限制删除操作执行的时长来减少对 CPU性能的影响。
    • 缺点:这个操作时长难以把控。

7、redis的数据淘汰策略

Redis支持8种不同策略来选择要删除的key:

  • 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算法进行淘汰。

LRU和LFU两种策略:

  • LRU(Least Recently Used):最近最少使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
  • LFU(Least Frequently Used):最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中数据都是热点数据 ? 

        使用allkeys-lru(最近最少使用)淘汰策略,留下来的都是经常访问的热点数据。

Redis的内存用完了会发生什么?

        看数据淘汰策略是什么,如果是默认的配置( noeviction ),会直接报错。

8、Redis分布式锁的实现

        项目中的优惠券秒杀抢单功能存在超卖问题,可以使用Synchronized锁解决。但如果是在集群模式下, 多台服务器会对应多个jvm, synchronized锁可以锁住单台服务器的多线程,多台服务器就锁不住了,此时需要有一个多服务器共享的锁监视器,即分布式锁

        Redis实现分布式锁主要利用Redis的setnx命令(SET if not exists) ,该命令需要设置锁的过期时间,以防止服务宕机从而导致锁永远无法释放的问题。这个过期时间设置长了会影响性能,设置短了又可能会提前释放锁导致线程安全问题,这就需要合理的控制锁的有效时长

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

        于是我们使用采用redisson实现的分布式锁,底层是setnxlua脚本(保证原子性)。在redisson的分布式锁中,提供了一个WatchDog(看门狗)机制一个线程获取锁成功以后,会定期给锁续期(默认每10s续期一次)。

Redisson的这个锁,可以重入吗?

        可重入这样做是为了避免死锁的产生。多个锁重入需要判断是否是同一线程,在redis中进行存储的时候使用的hash结构,来存储线程信息重入的次数:大key可以按照自己的业务进行定制,其中小key是当前线程的唯一标识,value是当前线程重入的次数。

Redisson锁能解决主从数据一致的问题吗?

        不能解决,但可以使用redisson提供的红锁来解决,但是使用红锁性能太低了,如果业务中非要保证数据的强一致性,建议采用zookeeper实现的分布式锁。

9、Redis的集群方案

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

主从复制

        单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,可以搭建主从集群,实现读写分离。一般都是一主多从主节点负责写数据,从节点负责读数据,主节点写入数据之后,需要把数据同步到从节点中。

主从同步数据的流程:分为全量同步增量同步。
        
  • 全量同步:从节点第一次与主节点建立连接的时候使用全量同步。
    • 从节点请求主节点同步数据,从节点会携带自己的replication idoffset偏移量。

    • 主节点判断是否是第一次请求,主要判断依据就是,主节点与从节点是否是同一个replication id,如果不是,就说明是第一次同步,那主节点就会把自己replication idoffset发送给从节点,让从节点与主节点的信息保持一致。 

    • 在同时主节点会执行bgsave生成rdb文件,发送给从节点去执行,从节点先把自己的数据清空,然后执行主节点发送过来的rdb文件,这样就保持了一致。

  • 增量同步:

    • 从节点请求主节点同步数据,主节点还是判断是不是第一次请求,不是第一次就获取从节点的offset值,然后主节点从命令日志中获取offset值之后的数据,发送给从节点进行数据同步。

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

        首先可以搭建主从集群(解决高并发),再加上使用redis中的哨兵模式(解决高可用)哨兵模式可以实现主从集群的自动故障恢复,里面就包含了对主从服务的监控自动故障恢复通知

        如果master故障,Sentinel会将一个slave提升为master。 当故障实例恢复后也以新的master为主;同时Sentinel也充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端,所以一般项目都会采用哨兵的模式来保证redis的高并发高可用。

11、redis的分片集群

        主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决: 海量数据存储问题 和 高并发写的问题。

分片集群的作用:

  • 集群中有多个master,每个master保存不同数据。(解决海量数据存储和高并发写的问题)
  • 每个master都可以有多个slave节点。(解决高并发读的问题)
  • master之间通过ping监测彼此健康状态。
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点。(路由)

Redis分片集群中数据是怎么存储和读取的?

  • Redis 分片集群引入了哈希槽的概念,Redis 集群有 16384 个哈希槽。
  • 将16384个插槽分配到不同的master节点。
  • 读写数据:根据key的有效部分计算哈希值,对16384取余。(有效部分,如果key前面有大括号,大括号的内容就是有效部分,如果没有,则以key本身做为有效部分)余数做为插槽,寻找插槽所在的节点。

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

  • Redis是基于C语言编写,是基于内存操作,执行速度非常快。
  • 采用单线程,避免不必要的上下文切换,多线程还需要考虑线程安全问题。
  • 使用了I/O多路复用模型,非阻塞IO。

13、I/O多路复用模型

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

  • 阻塞IO:用户区进程在“内核区准备数据”“拷贝数据”两个阶段都处于阻塞状态。
  • 非阻塞IO:第一个阶段是非阻塞,第二阶段阻塞。虽然是非阻塞,但都是忙等,没有提高性能,还会使CPU空转,使用率暴涨。
  • IO多路复用:是利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。
    • 监听Socket的方式:
      • select、poll:只会通知用户进程有Socket就绪,但不确定具体是哪个Socket ,需要用户进程逐个遍历Socket来确认。
      • epoll:在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间。

redis使用I/O多路复用结合事件的处理器来应对多个Socket请求,

  • 连接应答处理器
  • 命令回复处理器,在Redis6.0之后,为了提升更好的性能,使用了多线程来处理回复事件
  • 命令请求处理器,在Redis6.0之后,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程

​​​​

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

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

相关文章

这款Web剪藏工具绝了,支持10+平台内容剪辑同步!

前言 Web Clipper 是一个开源项目,旨在帮助用户轻松地保存和组织网页内容。它可以作为浏览器插件安装到常见的浏览器中,如Chrome、Firefox 等,用户可以使用它来保存网页、截取文章、添加标签和注释等操作,从而方便地管理和分享自…

任务调度中心

可以服务器配置和权限,分配任务执行。当服务器下线后,任务会被在线服务器接管,当重新上线后会在次执行任务。接管任务的服务器会释放任务。调度过程的实现,可以二次开发。基于 netty tcp 通信开发。 下载地址: http:/…

4.4 TILING FOR REDUCED MEMORY TRAFFIC

我们在CUDA中使用设备内存方面有一个内在的权衡:全局内存大但速度慢,而共享内存小但速度快。一个常见的策略是将数据划分为称为tile的子集,以便每个tile都适合共享内存。tile一词”借鉴了一个类比,即大墙(即全局内存数…

VSCode搭建 .netcore 开发环境

一、MacOS 笔者笔记本电脑上安装的是macOS High Sierra(10.13),想要尝试一下新版本的.netcore,之前系统是10.12时,.netcore 3.1刚出来时安装过3.1版本,很久没更新了,最近.net8出来了,想试一下,…

多模态推荐系统综述:四、模型优化

四、模型优化 由于多模态信息的存在,当多模态编码器和推荐模型一起训练时,模型训练的计算要求大大增加。因此,多模态推荐模型在训练过程中可以分为两类:端到端训练和两步训练。 端到端训练可以利用反向传播获得的每个梯度来更新模…

【算法设计与分析】网络流

目录 max-flow 和 min-cut流网络 Flow network最小割 Min-cut最大流 Max-flow Greedy algorithmFord–Fulkerson algorithm剩余网络 Residual networkFord–Fulkerson algorithm算法流程 最大流最小割理论 max-flow min-cut theorem容量扩展算法 capacity-scaling algorithm时间…

【读书笔记】《我的天才女友》

这套书一共有四本,这个是第一本,作者意大利人埃莱娜费兰特,这个只是她的笔名,至今还不知道这位作者是谁,她以每年一本书的速度出了“那不勒斯四部曲”,这四本书以两个女主人公莉拉和莱农的友情为主线。 莉拉…

ElasticSearch 集群搭建与状态监控cerebro

单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。为了解决存储能力上上限问题就可以用到集群部署。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点单点故障问题:将分片数据在不同节点备份 (r…

力扣题:高精度运算-1.3

力扣题-1.3 [力扣刷题攻略] Re:从零开始的力扣刷题生活 力扣题1:43. 字符串相乘 解题思想:类似计算时采用的竖式乘法。首先取得num2的低位,并补齐对应的0,然后与num1进行相乘,然后进行字符串的相加操作。…

腾讯云com域名注册1元条件说明

腾讯云com域名注册优惠价格1元首年,条件是企业新用户,个人新用户注册com域名是33元首年,第二年续费价格85元一年。活动 txybk.com/go/domain-sales 活动打开如下图: 腾讯云com域名注册优惠价格 腾讯云com域名注册原价是85元一年&a…

数据结构—图(下)

文章目录 12.图(下)(4).生成树和最小生成树#1.什么是生成树和最小生成树?i.生成树ii.最小生成树 #2.Prim算法i.算法思想ii.看看例子iii.代码实现 #3.Kruskal算法i.算法思想ii.看看例子iii.代码实现 #4.次小生成树 (5).最短路径问题#1.加权有向图的最短路径问题#2.单…

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800,因为我们要添加的图片大…

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具,用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体,能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

用RASP五步轻松保护云端无服务器架构

近年来无服务器架构发展势头正猛,预计未来十年将增长近25%。据称,2022年无服务器架构市场的规模超过了90亿美元,年复合增长率预计将增加。到2032年,市场规模可能超过900亿美元。 这表明,在组织日益采用DevOps的影响下&…

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

OCS2 入门教程(四)- 机器人示例

系列文章目录 前言 OCS2 包含多个机器人示例。我们在此简要讨论每个示例的主要特点。 System State Dim. Input Dim. Constrained Caching Double Integrator 2 1 No No Cartpole 4 1 Yes No Ballbot 10 3 No No Quadrotor 12 4 No No Mobile Manipul…

逻辑回归(Logistic Regression)

什么是机器学习 逻辑回归(Logistic Regression)虽然名字中包含"回归"一词,但实际上是一种用于解决分类问题的统计学习方法,而不是回归问题。它是一种线性模型,常用于二分类问题,也可以扩展到多分…

【亲测】申请腾讯云免费服务器流程,2024新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

vue3 修饰符大全(近万字长文)

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、事件修饰符(Event Modifiers)1、.stop(阻止事件冒泡)2、.prevent(阻止事件的默认行为)3、.capture(使用事件捕获模式…

如何优雅的搭建一个轻量化的网站

本地网页 这里我找到了一个带有简单的悬停变色效果的个人博客网站模板。用来演示这次的轻量化网站搭建。你可以复制这段代码到一个txt文件中,修改文件后缀名为html即可得到一个最简单的静态网页文件。在没有搭建网站服务器时,本机可以通过直接双击该文件…