java八股之redis面试题

目录

1、redis是单线程还是多线程

2、Redis为什么那么快

3、Redis底层数据是如何用跳表来存储的

4、Redis Key过期了为什么内存没释放(附删除策略)

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

(淘汰策略)

6、Redis主从、哨兵、集群架构优缺点比较

7、Redis集群数据分片

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

9、Redis持久化 RDB、AOF和混合持久化

AOF

4.0以后的混合模式持久化

10、Redis主从复制原理

全量拷贝:

增量拷贝:


1、redis是单线程还是多线程

答:分版本

在redis6.0之前是单线程,这里的单线程指的是网络I/O和键值对读写是由一个线程完成的。

在redis6.0之后,引入了多线程这个概念,这个多线程是网络I/O的多线程,而键值对读写还是单线程完成的,所以redis依然是并发安全的。

补充一下:这里的单线程是指网络请求和数据操作,而其他的持久化和集群数据同步等,其实是由额外的线程执行的

2、Redis为什么那么快

答:我们都知道Redis是基于内存的。

一条命令在内存里操作的时间是几十纳秒

命令执行是单线程操作,没有线程切换开销

基于IO多路复用机制提升了Redis的I/O利用率

高效的数据存储结构:全局hash表以及多种高效数据结构,比如:跳表,压缩列表,链表等等。

3、Redis底层数据是如何用跳表来存储的

答:我们都知道Redis有一个有序集合zset里面是用元素:分值 ,它的底层可以用压缩列表O(N)和跳表O(logN)来存储,今天我们就讲讲跳表。

我们这样理解 一开始我们会把这个集合放到一个链表里面来,链表会按照我们每个元素的分值进行从小到大排序。我们也知道一个链表特性就是插入删除快,查询慢。但是这个有序集合在底层给我们做了优化。就是进行横向扩张什么意思呢?

a:3

e:7

i:11
a:3 c:5 e:7 g:9 i:11
a:3 b:4 c:5 d:6 e:7 f:8 g:9 h:10 i:11

如图上最下面一行是我们的链表,在这个基础上,当前元素指向下两个元素。并且那个元素指向自己的下方元素。找元素假设找f:8这个元素 那么会从最上层找,找到e:7后找i:11发现小于i:11这时候e:7就往下一层继续从e:7出发查找,发现小于g:9这时候e:7继续往下一层,再next的时候就找到了f:8这个元素了。

跳表:将有序链表改造为支持近似“折半查找”算法,可以进行快速的插入、删除、查找操作。

4、Redis Key过期了为什么内存没释放(附删除策略)

在我们使用set命令的时候除了可以设置key-value以外 还可以设置key的过期时间,就像这样

set minus 123 ex 60

这时候我们如果执行这个操作

set minus 456

那么这个key的过期时间就会被擦除掉,这时候我们ttl minus 返回的就是-1(永不过期)

如果我们设置了过期时间但是Redis内存持续增长,后面发现过期时间丢失,那么很有可能就是问题造成的了。

当然还有可能就是惰性删除、定期删除和定时删除

1、惰性删除:读/写到一个已经过期的key,就会触发惰性删除,如果过期了就会删除这个key

优点:节约cpu性能,到了必须删除的时候才执行删除。

缺点:内存压力较大,会出现长期占用内存的数据(

你可能感兴趣的:(八股文-redis,java,redis,开发语言,面试)