Redis面试篇

传送门

SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口

前言

Redis的面试重要性不言而喻,本文主要精辟简短归纳一些常见的有份量的面试题。方便读者更好的理解Redis,面试为辅理解为主。

下面文章不定期更新:
Redis入门篇(精品)
Redis命令篇(精品)
Redis高级篇(精品)
Redis集群篇(精品)
Redis面试篇(精品)

1、Redis到底是单线程还是多线程

在这里插入图片描述
网络请求是多线程了,但是读写命令任然单线程。Redis6和以后版本引入。Redis之前其实还有持久化、集群数据同步有其他线程执行的。所以单线程一说只针对读写命令是单线程。中文Redis网站下载的稳定Redis版本还是5.0的,英文Redis网站是7.0的了。

2、Redis单线程为什么还能这么快

在这里插入图片描述
基于内存操作。

3、Redis底层数据如果用跳表来储存

在这里插入图片描述
链表两个两个的往上提,感觉形成了一种索引树一样的,这样查找就非常快了。有点类似折半查询了。
在这里插入图片描述

4、Redis的key过期了为什么内存没有释放

在这里插入图片描述
就是set把key名字修改忘记带上过期时间了,程序员的操作失误。还有一种是redis对过期key的删除策略决定的。
在这里插入图片描述
定时删除是redis慢慢删除一批过期key,不过一下子全删除完,全删除会很影响性能。

5、Redis的key没设置过期时间为什么被Redis主动删除了

在这里插入图片描述
在这里插入图片描述

6、删除key的命令会阻塞Redis吗

在这里插入图片描述
分情况答,如果删除一个很大比如几十MB的String类型的key也会很久是会阻塞的,其他的比如排序集合也会重新排序等,是会出现阻塞的。

7、Redis从主从、哨兵、集群架构优缺点比较(精品)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
缺点:master单节点不是集群,挂了以后有时候需要几秒才能恢复,客户端会有不少报错。还有就是虽然理论10万并发,但是还是单master节点,其他两个节点主要用来备份,不是所谓的真集群,设置内存最好不要超过10GB大小,如果数据量太大,启动恢复或者主从同步效率都会很差。而且超大量的数据,这种模式是搞不定的。
注意:客户端访问的先是访问 哨兵集群,然后由哨兵集群告诉客户端访问哪一个redis节点,哨兵也是redis实例。哨兵集群最清楚哪个是master,然后客户端第二次才去访问真正的redis主节点。

在这里插入图片描述
最佳,也会出现master挂了几秒才能恢复的这种情况。比如90GB的内存,这个集群图,三个master各分30GB,当第一个挂了,访问到第一个的时候,肯定会有报错的情况,但是如果数据是其他两台集群上的,那么就可以正常访问,这个是分片特性。所以比哨兵还是好太多了,而且方便扩展,配置简单。

8、Redis集群的hash分片算法(精品)

在这里插入图片描述
槽位定位算法:hash(key) mod 16384 取模,然后范围肯定落到0-16383中(ES到分片也是这么算,也叫槽位)。和HashMap的 hashCode & (n-1) 低四位惊人的相似,n=16的时候,范围肯定落到0-15。5除以3商为1余数为2模3(5减去余数2=3就是模)。java中 5/3是得出整数商, 5%3是取余数的, Math.floorMod(5,3)这个才是取模的

9、Redis执行命令有死循环bug

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
本质就是一直找过期key

10、Redis主从切换导致了缓存雪崩

在这里插入图片描述

11、Redis中rdf、aof、混合持久化是怎么回事(精品)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
混合持久化都可以关闭掉 rdb了,只开启aof就可以了。在这里插入图片描述
在这里插入图片描述

12、线上Redis持久化一般如何设置

在这里插入图片描述

13、一次线上事故,redis主节点宕机导致数据全部丢失

在这里插入图片描述

14、Redis线上数据如何备份

在这里插入图片描述

15、Redis主从复制风暴怎么回事

在这里插入图片描述

16、Redis集群网络抖动导致频繁网络切换怎么处理

在这里插入图片描述

17、Redis集群为什么自少需要3个master节点

在这里插入图片描述

18、Redis集群为什么推荐奇数个节点

在这里插入图片描述

19、Redis集群支持批量操作命令吗

在这里插入图片描述
分片算法,如果两个值不在同一个master集群,就会报错,解决方案就是 再给个新key,就可以弄到同一个master集群下了。

20、Lua脚本能在Redis集群里面执行吗

在这里插入图片描述

21、谈谈缓存穿透、缓存击穿、缓存雪崩区别,如何理解

在这里插入图片描述

22、Redis如何保证与数据库的双写一致性

在这里插入图片描述
在这里插入图片描述

23、redis的io多路复用

三种方式:
select基于连接轮询机制,它会把所有的链接收集到我们的服务端,一个个轮询,在轮询的过程中,有些只是建立了链接,并没有发数据,会出现空轮询,最大链接数是1024,poll是不限制。
poll同上说明
epoll基于事件驱动,首先会分配一个内存块,创建一个事件收集器selector(多路复用收集器),所有事件都要注册进来,redis启动的时候都要注册,注册一个accept事件;当有client来链接的时候,收集器感知到有accept事件发生,就去通知redis来链接了,由redis拿到链接并建立好连接;方向一:client还会发数据给redis,会把客户端自己的io事件注册到多路复用收集器中,假如多个client都发了数据过来,触发了多个io事件,所谓的多并发,收集器就会返回一个事件的数组,一个集合多个events给redis,redis拿到事件数组集合进行数据处理。方向而:client如果没有发数据给redis,收集器会处于一个阻塞状态,等待有没有事件发生,如果有马上同上一样返回个事件集合给redis进行处理。

收集器在linux系统中提供了相应的函数去支撑,比如创建复用器,会调用epoll_create;创建好后要监听,会调用epoll_wait函数,监听有没有事件过来,如果有事件过来,就从阻塞变为非阻塞,并且返回事件数组。client端注册io事件时调用的就是epoll_ctl函数。epoll在我们业内用的最多就是这三个函数。比如 tomcat、nginx、nio也是用的这种多路复用机制。

24、redis和MySQL数据一致性问题

精品:https://blog.csdn.net/weixin_70730532/article/details/125870478
1、缓存双删(作者认为low):先删除redis(比如删key=fe),再写MySQL(增删改),再删除redis(再次删key=fe,这种是为了防止多线程的时候,其他线程先查询缓存没有,再查询MySQL以后将旧的MySQL值回写到redis缓存,看图吧 )

在这里插入图片描述

2、双删的基础上优化,最后一删除进消息队列,依赖消息队列的重试机制

在这里插入图片描述

3、先写MySQL再删除Redis,只有一次查询不对。
在这里插入图片描述
其实并发就很容易导致。redis有多路复用,但是这个是redis和mysql,在java里面就是段代码,多线程很容易导致数据不一致性
在这里插入图片描述
特殊情况
在这里插入图片描述
在这里插入图片描述
最佳方案总结
在这里插入图片描述

25、redis事务

精品文章:https://blog.csdn.net/shark_chili3007/article/details/120884205

队列错误:开启事务后,redis的事务本身是一组命令,这组命令入队列,如果有语法错误,整个队列会全部不执行。所以要么全部执行,要么全部不执行。redis的设计者认为redis是支持原子性的,并且整个队列全部不执行,间接的认为redis 也支持事务,因为整个队列命令都失效相当于前面正确命令回滚了。和MySQL事务的要么都成功要么都失败有些区别。
执行时错误:开启事务后,如果是非语法错误的,有业务逻辑错误,redis会将错就错继续执行,错的地方抛出异常,错后面的继续执行。为了保证redis简单快速并没有让错误的逻辑回滚。

如何理解redis的事务与ACID
答:

原子性: redis设计者认为他们是支持原子性的,因为原子性的概念是:所有指令要么全部执行,要么全部不执行。而非一起成功或者失败。
一致性: redis事务保证命令失败(组队时出错)的情况下可以回滚,确保了一致性。
隔离性: redis是基于单线程的,所以执行指令时不会被其他客户端打断,保证了隔离性。但是redis并没有像其他关系型数据库一样设计隔离级别。
持久性: 持久性的定义为事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。),考虑到性能问题,redis无论rdb还是aof都是异步持久化,所以并不能保证持久性。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
关于JavaRedis面试题,你可以参考以下资源: 1. "Java基础教程(入门)"这本书中可能包含与JavaRedis相关的基础知识点,例如如何连接和操作Redis以及在Java中使用Redis的常见场景。 2. "java面试大集合"这本书中可能包含JavaRedis面试题,涵盖了Java技术栈以及与Redis相关的问题。你可以浏览这本书中的相关章节以寻找你感兴趣的JavaRedis面试题。 3. "Java基础教程(进阶)"这本书可能包含更深入的JavaRedis面试题,例如Java高并发和如何在Java中使用Redis进行缓存。 这些资源可能会给你提供一些有关JavaRedis面试题的参考。你可以根据自己的需求和兴趣选择适合的资源进行学习。希望这些资源能帮助到你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [redis面试题总结(附答案)](https://blog.csdn.net/guorui_java/article/details/117194603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java面试大集合一共485页](https://download.csdn.net/download/wm9028/88268176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影铁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值