目录
- 传送门
- 前言
- 1、Redis到底是单线程还是多线程
- 2、Redis单线程为什么还能这么快
- 3、Redis底层数据如果用跳表来储存
- 4、Redis的key过期了为什么内存没有释放
- 5、Redis的key没设置过期时间为什么被Redis主动删除了
- 6、删除key的命令会阻塞Redis吗
- 7、Redis从主从、哨兵、集群架构优缺点比较(精品)
- 8、Redis集群的hash分片算法(精品)
- 9、Redis执行命令有死循环bug
- 10、Redis主从切换导致了缓存雪崩
- 11、Redis中rdf、aof、混合持久化是怎么回事(精品)
- 12、线上Redis持久化一般如何设置
- 13、一次线上事故,redis主节点宕机导致数据全部丢失
- 14、Redis线上数据如何备份
- 15、Redis主从复制风暴怎么回事
- 16、Redis集群网络抖动导致频繁网络切换怎么处理
- 17、Redis集群为什么自少需要3个master节点
- 18、Redis集群为什么推荐奇数个节点
- 19、Redis集群支持批量操作命令吗
- 20、Lua脚本能在Redis集群里面执行吗
- 21、谈谈缓存穿透、缓存击穿、缓存雪崩区别,如何理解
- 22、Redis如何保证与数据库的双写一致性
- 23、redis的io多路复用
- 24、redis和MySQL数据一致性问题
- 25、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.****.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.****.net/shark_chili3007/article/details/120884205
队列错误:开启事务后,redis的事务本身是一组命令,这组命令入队列,如果有语法错误,整个队列会全部不执行。所以要么全部执行,要么全部不执行。redis的设计者认为redis是支持原子性的,并且整个队列全部不执行,间接的认为redis 也支持事务,因为整个队列命令都失效相当于前面正确命令回滚了。和MySQL事务的要么都成功要么都失败有些区别。
执行时错误:开启事务后,如果是非语法错误的,有业务逻辑错误,redis会将错就错继续执行,错的地方抛出异常,错后面的继续执行。为了保证redis简单快速并没有让错误的逻辑回滚。
如何理解redis的事务与ACID
答:
原子性: redis设计者认为他们是支持原子性的,因为原子性的概念是:所有指令要么全部执行,要么全部不执行。而非一起成功或者失败。
一致性: redis事务保证命令失败(组队时出错)的情况下可以回滚,确保了一致性。
隔离性: redis是基于单线程的,所以执行指令时不会被其他客户端打断,保证了隔离性。但是redis并没有像其他关系型数据库一样设计隔离级别。
持久性: 持久性的定义为事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。),考虑到性能问题,redis无论rdb还是aof都是异步持久化,所以并不能保证持久性。