Redis缓存那点破事 , 绝杀面试官 25 问

转载:https://blog.csdn.net/itomge/article/details/122118060

精彩文章汇总 GitHub https://github.com/aalansehaiyang/technology-talk ,Star 12K ,汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识

为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于Redis 缓存,面试官一般喜欢问哪些问题?

img

Redis 有哪些特性?

答案:

  • 性能高, 读的速度是100000次/s,写的速度是80000次/s
  • 数据持久化,支持RDB 、AOF
  • 支持事务。通过MULTIEXEC指令包起来。
  • 多种数据结构类型
  • 主从复制
  • 其他特性:发布/订阅、通知、key过期等

Redis 为什么这么快?

答案:

  • 完全基于内存,没有磁盘IO上的开销,异步持久化除外
  • 单线程,避免多个线程切换的性能损耗
  • 非阻塞的IO多路复用机制
  • 底层的数据存储结构优化,使用原生的数据结构提升性能。

整理了一份大厂常考面试题,这份pdf包括 Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、设计模式等面试题,分享给大家。
下载地址:百度云链接:https://pan.baidu.com/s/1XHT4ppXTp430MEMW2D0-Bg 提取码: s3ab

Redis 底层的基础数据结构有哪些?

答案:

  • 字符串。没有采用C语言的传统字符串,而是自己实现的一个简单动态字符串SDS的抽象类型,并保存了长度信息。
  • 链表(linkedlist)。双向无环链表结构,每个链表的节点由一个listNode结构来表示,每个节点都有前置和后置节点的指针
  • 字典(hashtable)。保存键值对的抽象数据结构,底层使用hash表,每个字典带有两个hash表,供平时使用和rehash时使用。
  • 跳跃表(skiplist)。跳跃表是有序集合的底层实现之一。redis跳跃表由zskiplist和zskiplistNode组成,zskiplist用于保存跳跃表 信息(表头、表尾节点、?度等),zskiplistNode用于表示表跳跃节点,每个跳跃表的层高都是1- 32的随机数,在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的成员对象必须是唯一的,节点按照分值大小排序,如果分值相同,则按照成员对象的大小排序。
  • 整数集合(intset)。用于保存整数值的集合抽象数据结构,不会出现重复元素,底层实现为数组。
  • 压缩列表(ziplist)。为节约内存而开发的顺序性数据结构,可以包含多个节点,每个节点可以保存一个字节数组或者整数值。

Redis 支持哪些数据类型?

答案:五种常用数据类型:StringHashSetListSortedSet。三种特殊的数据类型:BitmapHyperLogLogGeospatial,其中Bitmap 、HyperLogLog的底层都是 String 数据类型,Geospatial 底层是 Sorted Set 数据类型。

  • 字符串对象string:int整数、embstr编码的简单动态字符串、raw简单动态字符串
  • 列表对象list:ziplist、linkedlist
  • 哈希对象hash:ziplist、hashtable
  • 集合对象set:intset、hashtable
  • 有序集合对象zset:ziplist、skiplist

Redis 常用的 5 种数据结构和应用场景?

答案:

  • String:缓存、计数器、分布式锁等
  • List:链表、队列、微博关注人时间轴列表等
  • Hash:用户信息、Hash 表等
  • Set:去重、赞、踩、共同好友等
  • Zset:访问量排行榜、点击量排行榜等

为什么采用单线程?

答案:官方回复,CPU不会成为Redis的制约瓶颈,Redis主要受内存、网络限制。例如,在一个普通的 Linux 系统上,使用pipelining 可以每秒传递 100 万个请求,所以如果您的应用程序主要使用 O(N) 或 O(log(N)) 命令,则几乎不会使用太多 CPU,属于IO密集型系统。

Redis 6.0 之后又改用多线程呢?

答案:Redis的多线程主要是处理数据的读写、协议解析。执行命令还是采用单线程顺序执行。

主要是因为redis的性能瓶颈在于网络IO而非CPU,使用多线程进行一些周边预处理,提升了IO的读写效率,从而提高了整体的吞吐量。antirez 在 RedisConf 2019 分享时提到,Redis 6 引入的多线程 IO 对性能提升至少一倍以上。

过期键Key 的删除策略有哪些?

答案:有3种过期删除策略。惰性删除、定期删除、定时删除

  • 惰性删除。使用key时才进行检查,如果已经过期,则删除。缺点:过期的key如果没有被访问到,一直无法删除,一直占用内存,造成空间浪费。
  • 定期删除。每隔一段时间做一次检查,删除过期的key,每次只是随机取一些key去检查。
  • 定时删除。为每个key设置过期时间,同时创建一个定时器。一旦到期,立即执行删除。缺点:如果过期键比较多时,占用CPU较多,对服务的性能有很大影响。

如果Redis的内存空间不足,淘汰机制?

答案:

  • volatile-lru:从已设置过期时间的key中,移出最近最少使用的key进行淘汰
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
  • volatile-ttl:从已设置过期时间的key中,移出将要过期的key
  • volatile-random:从已设置过期时间的key中,随机选择key淘汰
  • allkeys-random:从key中随机选择key进行淘汰
  • no-eviction:禁止淘汰数据。当内存达到阈值的时候,新写入操作报错
  • volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰(LFU(Least Frequently Used)算法,也就是最频繁被访问的数据将来最有可能被访问到)
  • allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。

Redis 突然挂了怎么解决?

答案:1、从系统可用性角度思考,Redis Cluster引入主备机制,当主节点挂了后,自动切换到备用节点,继续提供服务。2、Client端引入本地缓存,通过开关切换,避免Redis突然挂掉,高并发流量把数据库打挂。

Redis 持久化有哪些方式?

答案:

1、快照RDB。将某个时间点上的数据库状态保存到RDB文件中,RDB文件是一个压缩的二进制文件,保存在磁盘上。当Redis崩溃时,可用于恢复数据。通过SAVEBGSAVE来生成RDB文件。

  • SAVE:会阻塞redis进程,直到RDB文件创建完毕,在进程阻塞期间,redis不能处理任何命令请求。
  • BGSAVE:会fork出一个子进程,然后由子进程去负责生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。

2、只追加文件AOF。以日志的形式记录每个写操作(非读操作)。当不同节点同步数据时,读取日志文件的内容将写指令从前到后执行一次,即可完成数据恢复。

Redis 常用场景

答案:

  • 1、缓存,有句话说的好,「性能不够,缓存来凑」
  • 2、分布式锁,利用Redis 的 setnx
  • 3、分布式session
  • 4、计数器,通过incr命令
  • 5、排行榜,Redis 的 有序集合
  • 6、其他

Redis 缓存要注意的七大经典问题?

答案:列举了亿级系统,高访问量情况下Redis缓存可能会遇到哪些问题?以及对应的解决方案。

  • 1、缓存集中失效
  • 2、缓存穿透
  • 3、缓存雪崩
  • 4、缓存热点
  • 5、缓存大Key
  • 6、缓存数据的一致性
  • 7、数据并发竞争预热

每个问题的详细解决方案,请查看 亿级系统的Redis缓存如何设计???

Redis 集群方案有哪几种?

答案:

  • 主从复制模式
  • Sentinel(哨兵)模式
  • Redis Cluster模式

Redis 主从数据同步(主从复制)的过程?

答案:

  • 1、slave启动后,向master发送sync命令
  • 2、master收到sync之后,执行bgsave保存快照,生成RDB全量文件
  • 3、master把slave的写命令记录到缓存
  • 4、bgsave执行完毕之后,发送RDB文件到slave,slave执行
  • 5、master发送缓冲区的写命令给slave,slave接收命令并执行,完成复制初始化。
  • 6、此后,master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性

主从复制的优缺点?

答案:

1、优点:

  • master能自动将数据同步到slave,可以进行读写分离,分担master的读压力
  • master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求

缺点:

  • 不具备自动容错与恢复功能,master 节点宕机后,需要手动指定新的 master
  • master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题
  • 难以支持在线扩容,Redis的容量受限于单机配置

Sentinel(哨兵)模式的优缺点?

答案:哨兵模式基于主从复制模式,增加了哨兵来监控自动处理故障

1、优点:

  • 哨兵模式基于主从复制模式,所以主从复制模式有的优点,哨兵模式也有
  • master 挂掉可以自动进行切换,系统可用性更高

2、缺点:

  • Redis的容量受限于单机配置
  • 需要额外的资源来启动sentinel进程

Redis Cluster 模式的优缺点?

答案:实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。

1、优点:

  • 无中心架构,数据按照slot分布在多个节点
  • 集群中的每个节点都是平等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
  • 可线性扩展到1000多个节点,节点可动态添加或删除
  • 能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换

缺点:

  • 数据通过异步复制,不保证数据的强一致性
  • slave充当 “冷备”,不对外提供读、写服务,只作为故障转移使用。
  • 批量操作限制,目前只支持具有相同slot值的key执行批量操作,对mset、mget、sunion等操作支持不友好
  • key事务操作支持有限,只支持多key在同一节点的事务操作,多key分布在不同节点时无法使用事务功能
  • 不支持多数据库空间,一台redis可以支持16个db,集群模式下只能使用一个,即db 0。Redis Cluster模式不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。

Redis 如何做扩容?

答案:为了避免数据迁移失效,通常使用一致性哈希实现动态扩容缩容,有效减少需要迁移的Key数量。

但是Cluster 模式,采用固定Slot槽位方式(16384个),对每个key计算CRC16值,然后对16384取模,然后根据slot值找到目标机器,扩容时,我们只需要迁移一部分的slot到新节点即可。

Redis 的集群原理?

答案:一个redis集群由多个节点node组成,而多个node之间通过cluster meet命令来进行连接,组成一个集群。

数据存储通过分片的形式,整个集群分成了16384个slot,每个节点负责一部分槽位。整个槽位的信息会同步到所有节点中。

key与slot的映射关系:

  • 健值对 key,进行 CRC16 计算,计算出一个 16 bit 的值
  • 将 16 bit 的值对 16384 取模,得到 0 ~ 16383 的数表示 key 对应的哈希槽

Redis 如何做到高可用?

答案:哨兵机制。具有自动故障转移、集群监控、消息通知等功能。

哨兵可以同时监视所有的主、从服务器,当某个master下线时,自动提升对应的slave为master,然后由新master对外提供服务。

什么是 Redis 事务?

答案:Redis事务是一组命令的集合,将多个命令打包,然后把这些命令按顺序添加到队列中,并且按顺序执行这些命令。

Redis事务中没有像Mysql关系型数据库事务隔离级别的概念,不能保证原子性操作,也没有像Mysql那样执行事务失败会进行回滚操作

Redis 事务执行流程?

答案:通过MULTIEXECWATCH等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。

具体过程:

  • 服务端收到客户端请求,事务以MULTI开始
  • 如果正处于事务状态时,则会把后续命令放入队列同时返回给客户端QUEUED,反之则直接执行这 个命令
  • 当收到客户端的EXEC命令时,才会将队列里的命令取出、顺序执行,执行完将当前状态从事务状态改为非事务状态
  • 如果收到 DISCARD 命令,放弃执行队列中的命令,可以理解为Mysql的回滚操作,并且将当前的状态从事务状态改为非事务状态

WATCH 监视某个key,该命令只能在MULTI命令之前执行。如果监视的key被其他客户端修改,EXEC将会放弃执行队列中的所有命令。UNWATCH 取消监视之前通过WATCH 命令监视的key。通过执行EXEC 、DISCARD 两个命令之前监视的key也会被取消监视。

Redis 与 Guava 、Caffeine 有什么区别?

答案:缓存分为本地缓存和分布式缓存。

1、Caffeine、Guava,属于本地缓存,特点:

  • 直接访问内存,速度快,受内存限制,无法进行大数据存储。
  • 无网络通讯开销,性能更高。
  • 只支持本地应用进程访问,同步更新所有节点的本地缓存数据成本较高。
  • 应用进程重启,数据会丢失。

所以,本地缓存适合存储一些不易改变或者低频改变的高热点数据。

2、Redis属于分布式缓存,特点:

  • 集群模式,支持大数据量存储
  • 数据集中存储,保证数据的一致性
  • 数据跨网络传输,性能低于本地缓存。但同一个机房,两台服务器之间请求跑一个来回也就需要500微秒,比起其优势,这点损耗完全可以忽略,这也是分布式缓存受欢迎的原因。
  • 支持副本机制,有效的保证了高可用性。

如何实现一个分布式锁?

答案:

  • 1、数据库表,性能比较差
  • 2、使用Lua脚本 (包含 SETNX + EXPIRE 两条指令)
  • 3、SET的扩展命令(SET key value [EX][PX] [NX|XX])
  • 4、Redlock 框架
  • 5、Zookeeper Curator框架提供了现成的分布式锁

1、Java高频考点

imgimg

3、LeetCode算法

img

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

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

相关文章

Mysql的select in会自动过滤重复的数据

Mysql的select in会自动过滤重复的数据 默认使用 SELECT 语句; 当加上in范围后,结果如下图: in范围内的数据,如果有重复的,只会选择第一个数据。 所以如果不是直接使用SQL语句来查询,而是在代码中来查询…

java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key c

错误原图: 错误分析:外键约束失败导致插入数据有误 解决问题:检查被关联的外键字段值,在原表中是否有对应的值,添加时外键的值在原表(外键关联的表)中一定要有该值,没有的值添加报错…

MySql 清空、删除、截断表时1701错误

项目已经进行一段时间,整体的开发工作已经完成。接下来要进入综合测试阶段,所以想要将数据清理一下,然后报了1701错误,由错误提示得知是外键约束的问题 解决办法:关闭外键约束->清空表、截断表->启动外键约束。…

编辑流程图_流程图不会绘制?一分钟手把手教你学会,超简单

我们每天的日常工作非常繁忙,经常被日常的事务性工作淹没,而忽略掉我们工作的流程是否正确,我们的方向是否正确。如果流程、方向错了,再努力都是没有用的。要确保努力与付出是有价值的,就必须确保前进方向是正确的&…

MVVM 模型

MVVM 模型 在实际代码中 <!--MVVM 模型&#xff1a;1. M: 模型(Model) : data 中的数据2. V: 视图(View) : 模板代码3. VM: 视图模型(ViewModel) : Vue 实例观察发现&#xff1a;1. data 中所有的属性&#xff0c;最后都出现在了 vm 身上2. vm 身上所有的属性 以及 Vue 原…

NAVICAT MYSQL 建表字段 默认值、EMPTY STRING、空白、NULL 的区别

Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别 总结在最后&#xff0c;没啥干货 简单测试了4种类型 bigint tinyint varchar char 单引号 ‘’ 双引号 “” 自定义的默认值 如&#xff1a; 未知的姓名 新建一张用户表 CREATE TABLE user (id bigint(20…

如何将vue项目打包为.apk文件

说明&#xff1a;使用Vue.js开发完毕的app一般不作处理的话&#xff0c;就只能在浏览器上做为Webapp使用。如果需要将它安装到安卓手机上就需要打包为.apk文件了。 前提&#xff1a;安装HBuilderX 具体步骤&#xff1a; 1.在vue项目中找到config/build.js 2.找到build下的a…

linux 快照

一、快照管理器 二、选择保存的快照 — 出错了方便回去

工作琐事太多怎么办_东莞夫妻感情不合怎么办 东莞专业离婚咨询

东莞夫妻感情不合怎么办 东莞专业离婚咨询工作中的琐事影响感情交流&#xff0c;当然什么事也没有但我却打他&#xff0c;还有一些行刑人在旁边站着。行为泼辣得不到观众的好感。对当时的一些知识和政界发生。只记得内容是希望他好自为之&#xff0c;生活中她是位的。苏菲宗派里…

23种经典设计模式都有哪些,如何分类?Java设计模式相关面试

23种经典设计模式都有哪些&#xff0c;如何分类&#xff1f; 23种经典设计模式都有哪些&#xff0c;如何分类&#xff1f; java常用的设计模式&#xff1f;说明工厂模式 Java 中的23 种设计模式&#xff1a; Factory&#xff08;工厂模式&#xff09;&#xff0c; Builder&am…

五大常用算法学习笔记

一、分治算法&#xff1a;快速排序、归并排序、大整数乘法、二分查找、递归&#xff08;汉诺塔&#xff09; 基本概念&#xff1a;把一个复杂的问题分成若干个相同或相似的子问题&#xff0c;再把子问题分成更小的子问题… &#xff0c; 知道最后子问题可以简单的直接求解&…

8客户端安装后无法启动_新君越涉水后车辆无法启动

车型&#xff1a;2010君越故障现象&#xff1a;涉水后车辆无法启动询问客户&#xff1a;涉水的水深10cm左右。 外观检查&#xff1a;TCM连接器进水、其它没发现进水迹象使用压缩空气吹干TCM连接器的进水&#xff0c;并处理机舱的接地点。GDS检测&#xff1a;U0074,控制模块通信…

Java中的return this

Java中的return this return this就是返回当前对象的引用(就是实际调用这个方法的实例化对象) 示例&#xff1a; /*** 资源url*/public HttpConfig url(String url) {urls.set(url);//return this就是返回当前对象的引用(就是实际调用这个方法的实例化对象)return this;}调用…

mybatis 依赖于jdbc_大数据基础:Mybatis零基础入门

在Java企业级开发任务当中&#xff0c;持久层框架的选择&#xff0c;国内市场的主流选择一定有Mybatis的一席之地&#xff0c;从入门来说&#xff0c;Mybatis的学习难度不算高&#xff0c;但是要把Mybatis发挥出真正的效用&#xff0c;还是需要深入学习的。今天的大数据基础分享…

kendo treeview 修改节点显示值_VBA学习笔记60-1: Treeview控件

学习资源&#xff1a;《Excel VBA从入门到进阶》第60集 by兰色幻想本节讲Treeview控件。TreeView控件是以树形结构显示数据的控件。利用TreeView控件&#xff0c;可以设计出树形结构图&#xff0c;便于用户选择不同的项目。总公司人事结构是一级节点&#xff0c;公司一、公司二…

Java之路:this关键字的用法

&#xff08;1&#xff09;this代表当前对象的一个引用。所谓当前对象&#xff0c;指的是调用类中方法或属性的那个对象。 最经常使用this关键字的情况&#xff0c;是在对象的一个属性被方法或构造器的参数屏蔽时&#xff0c;需要调用这个被屏蔽的属性&#xff0c;如下&#xf…

跑分cpu_一加8T现身跑分网站:CPU正式敲定 10月15日见

一加8T将于10月15日发布(海外版将于10月14日发布)&#xff0c;现在关于一加8T的核心规格确认。今天&#xff0c;一加8T现身GeekBench跑分网站&#xff0c;确认该机搭载的是高通骁龙865旗舰处理器&#xff0c;而非高通骁龙865 Plus。与搭载高通骁龙865的一加8相比&#xff0c;一…

发那科攻丝回退参数_乐享:发那科MF选配功能诊断小结

小编微信&#xff1a;shukong99999乐享数控&#xff0c;专注数控电气乐享那科选项功能小结大家好&#xff0c;我是乐享数控&#xff0c;好久不见&#xff0c;今天起&#xff0c;给大家多总结&#xff0c;相互交流进步。1发那科MF选项功能诊断小结在调试过程中&#xff0c;除了M…

matlab怎么画二维热力图_[原创]Day3.箱线图和热力图的绘制

使用Matplotlib和Seaborn进行绘制箱线图和热力图。箱线图箱线图(boxplot)又称盒式图&#xff0c;可以显示数据的分散情况&#xff0c;由五个数值点组成&#xff1a;最大值(max)-上界、最小值(min)-下界、中位数(median)和上下四分位数(Q1, Q3)。它可以帮我们分析出数据的差异性…

vue图片点击超链接_10秒钟,告别ppt中难看的超链接

我相信大多数同学在创建超链接的时候都很疑惑为什么字体颜色会变成蓝色&#xff0c;且下方会出现一条横线&#xff0c;能不能把横线去掉或者改变颜色呢&#xff1f;零壹君回答你&#xff1a;能&#xff01;快来跟零壹君一起学习吧&#xff01;选中文字—点击【插入】—【超链接…