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之后,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程

​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6. 逻辑删除

逻辑删除对应的是物理删除,分别介绍一下这两个概念: 物理删除 :指的是真正的删除,即:当执行删除操作时,将数据表中的数据进行删除,之后将无法再查询到该数据逻辑删除 :并不是真正意…

whistle代理+mock轻松解决“页面端“测试接口没数据难题

0、whistle是什么?怎么用? 自行百度,此处不再赘述! 1、示例演示(交易订单测试) 背景和痛点最近在测试一个小需求,需要涉及订单侧服务商品库侧服务库存侧服务财务侧线下交易服务。痛点主要在订…

淘宝商家实现批量上货API接口调用接入说明(淘宝开放平台免申请接入)

API接入详细步骤: 第一步:在淘宝开放平台中选择接口塡写应用申报递交给我司,确认接口是否都有。 第二步:确认接口都有,需交1000元进行测试,可以测试三天,测试数据符合淘宝开放平台接口参数说明&…

【python】09.面向对象进阶

面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。 property装…

轴组【CAN】

如果有126个轴,你程序里挨个添加轴很麻烦。 可以用轴组批量添加。【数组】 CAN驱动器 0x164 就是下个驱动器 p_CAN主站地址:ADR(IoConfig_Globals.CANopen_Manager_SoftMotion);p_CAN从站地址1:ADR(IoConfig_Globals.DMA882_CAN);p_CAN从站地址2:ADR(IoConfig_Gl…

超维空间M1无人机使用说明书——61、ROS无人机物体识别与精准投放

引言:基于空中物流的项目背景。我们提供了使用基于诗句的物体识别和精准投放、降落。实现原理如下: 1、在ROS下使用机载电脑实现物体识别 2、记载电脑根据反馈的位置发布运动控制指令 3、PX4解析机载电脑发布的命令,作出运动控制 4、设置…

PCL 使用克拉默法则进行四点定球(C++详细过程版)

目录 一、算法原理二、代码实现三、计算结果本文由CSDN点云侠原创,PCL 使用克拉默法则进行四点定球(C++详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 已知空间内不共面的四个点,设其坐标为 A (…

【Maven】003-基于 IDEA 创建 Maven 工程

【Maven】003-基于 IDEA 创建 Maven 工程 文章目录 【Maven】003-基于 IDEA 创建 Maven 工程一、关于 Maven 工程的 GAVP1、GAVP 简介2、GAV 坐标规范3、Packaging 定义规则 二、基于 IDEA 创建 Maven 工程1、创建 Maven 项目2、创建结果3、项目结构说明 一、关于 Maven 工程的…

特征工程-特征处理(一)

特征处理-(离散型特征处理) 完成特征理解和特征清洗之后,我们要进行特征工程中最为重要和复杂的一步了——特征处理 离散型特征处理 离散型特征通常为非连续值或以字符串形式存在的特征,离散型特征通常来讲是不能直接喂入模型中…

HandlerInterceptor拦截器 postHandle执行addHeader无效,postHandle执行setStatus无效的解决方案

问题描述 想在postHandle方法里执行addHeader方法来补充一些Header信息(如分页信息),但是最后执行却未如期显示 拦截器源码 import com.zhangziwa.practisesvr.utils.response.ResponseContext; import jakarta.servlet.http.HttpServletR…

必看!2023年机器人领域十大事件!

原创 | 文 BFT机器人 2023年,机器人产业快速发展,成就了机器人领域的一个又一个里程碑。机器人行业涌现了许多令人瞩目的事件,实现了重大突破,展示了机器人技术在各个领域的广泛应用和革命性变革。 本文将对2023年机器人领域的十…

【MATLAB】REMD_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 REMD-LSTM神经网络时序预测算法是一种结合了REMD(Reservoir Enhanced Multi-scale Deep Learning)算法和长短期记忆神经网络(LSTM)的时间序…

gem5学习(12):理解gem5 统计信息和输出——Understanding gem5 statistics and output

目录 一、config.ini 二、config.json 三、stats.txt 官方教程:gem5: Understanding gem5 statistics and output 在运行 gem5 之后,除了仿真脚本打印的仿真信息外,还会在根目录中名为 m5out 的目录中生成三个文件: config.i…

企业网络两层和三层架构部署有何差异

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…

如何用mixlab-nodes实现LOGO生成的应用DEMO?#这就是生产力

ComfyUI的工作流,可以把一件需要重复的事情变成一个流水线,自动完成,再加上高度可自定义的节点生态,可以添加各种批量化的能力,这样就有了非常强大的内容生产力。 本期,主要介绍mixlab-nodes的3个生产力节…

《 乱弹篇(二)》

题记 昨(2024年1月12日)天,既然笔者因感到写时评文力不从心,新辟一专栏《乱弹篇》,开始了“ 东西南北,古今中外,谈而不乱,抒怀而已”的写作路径,就要走下去,…

搭建个人智能家居 2 -安装ESPHome

搭建个人智能家居 2 -安装ESPHome 前言ESPHome Linux平台windows平台总结 前言 上一篇文章我们演示了多个平台下面搭建HomeAssistant,可能有一些小伙伴在安装、运行HomeAssistant OS后,打开HomeAssistant的控制台时会出现下面图片显示的问题 这一般是本…

【面试合集】2.说说微信小程序的生命周期函数有哪些?

面试官:说说微信小程序的生命周期函数有哪些? 一、是什么 跟vue、react框架一样,微信小程序框架也存在生命周期,实质也是一堆会在特定时期执行的函数 小程序中,生命周期主要分成了三部分: 应用的生命周期…

c++学习笔记-STL案例-机房预约系统2-创建身份类

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统1-准备工作”,本文主要包括:创建身份类,建立了整个系统的框架,Identity基类,派生类:Sudent、Teacher、Manager,基类无实现源文件,…

用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了

一图胜千言,LangChain已经成为当前 LLM 应用框架的事实标准,本篇文章就来对 LangChain 基本概念以及其具体使用场景做一个整理。 文章目录 用通俗易懂的方式讲解系列技术交流LangChain 是什么LangChain 的主要组件Model I/OLanguage ModelPromptsOutput…