Redis近期面试题总结

笔者去年12月中旬开始面试,面了很多大厂,有很多问题,原理掌握不牢,因此借此对redis做一个复盘和总结,除了HyperLogLog和GEO的数据结构没有实践过,其他的都大概了解,简单代码模拟了一些场景。由此对我所经历的面过redis的问题做一个汇总。

一、Redis篇
1.Redis有几种数据结构
答:String,List,Hash,Set,Zset(sorted Set)
2.除了上面几种还有哪些?分别是干嘛的?
答:除了上面五种,还有三种
Bitmaps,Hyperloglogs,GEO(Geospatial用于索引半径查询)
Bitmaps:bitmaps不是一个真实的数据结构。而是String类型上的一组面向bit操作的集合。
由于strings是二进制安全的blob,并且它们的最大长度是512m,所以bitmaps能最大设置2^32个不同的bi
Hyperloglogs:HyperLogLog是用于计算唯一事物的概率数据结构(从技术上讲,这被称为估计集合的基数)
GEO:GEO特性在 Redis3.2版本中推出,这个功能可以将用户给定的地理位置(经度和纬度)信息储存起来,并对这些信息进行操作。
Stream(redis 5.0)
相关链接:https://blog.csdn.net/wufaliang003/article/details/82016385

3.Redis的zSet的底层数据结构是怎么样的
答:
1.当数据较少的时候,zset是由一个ziplist来实现的
2.当数据较多的时候,zset是一个由dict 和一个 skiplist来实现的,dict用来查询数据到分数的对应关系,而skiplist用来根据分数查询数据。
3.skiplist查找的时间复杂度约为O(log n)
相关链接:https://blog.csdn.net/universsky2015/article/details/102728114

4.Redis怎么使用zSet进行排序的
答:redis中使用上面两种数据结构实现zset,其中节点为node,通过指针链接,节点之间有层的概念,每个node中有个dict数据字典
存的是元素的值和对应的分数,这个分数就是可以计算排序的值,为double类型。
复杂度分析:排名rank查询,redis中对skiplist做了扩展,使得根据排名能够快速查到数据,或者根据分数查到数据之后容易获得排名,
二者(ziplist/skiplist)的查询复杂度都是O(log n),但是还得具体场景具体分析有时候会退化成O(log2N)。
相关链接:https://blog.csdn.net/universsky2015/article/details/102728114

5.Redis怎么使用zSet实现排行榜功能
答:zSet具有排序的功能,因此我们对需要插入的数据记录一个分数如(paihangbang:3.5:zhangsan)
这种数据结构,其中起关键作用的就是第二个值,是这条数据的分数,
有多个这种数据的话可以根据它进行排序,从而实现排行榜功能。
相关链接:https://www.jianshu.com/p/af99085f4b7a

6.Redis中的zSet中的zadd方法的时间复杂度是多少?为啥呢?
答: 时间复杂度是O(logN)
分析:通过前面的梳理其实就可以知道由于skiplist中的单层数据链表已经有序的了,虽然不是绝对递增有序但是,如果要插入一条数据并将其放在合适的
位置是需要先找到对应的位置,所以就需要先查询,那这样的话其实就跟查询复杂度一样了,由于不需要挪动其他数据(对比数组),插入的时候跟正常链表一样
设置指针指向就完成了。
相关链接:https://www.jianshu.com/p/af99085f4b7a

7.Redis有几种部署(架构模式)模式(主自如,贝壳)
答:单机模式,集群模式(redis-cluster),哨兵模式(redis Sentinel),主从复制,客户端分片,redis-proxy

8.Redis的复制模式有几种
答:基于内存的复制/基于磁盘的复制/全量复制/增量复制

分析:
1.复制过程分为同步sync与命令传播(command propagate),两个过程配合执行才能实现Redis复制
2. 命令是slaveof/bgsave
3.星型复制,链式复制(redis-proxy)
相关链接:https://www.cnblogs.com/jian0110/p/10447491.html
https://github.com/AlibabaCloudDocs/kvstore/blob/master/cn.zh-CN/%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/Redis%20%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E6%8A%80%E6%9C%AF%E8%A7%A3%E6%9E%90.md
另外一方面在主从模式中由于从节点可以以树状结构拓扑,因此可以有链式复制,星型复制指的是所有从节点都从主节点进行数据同步

9.Redis的缓存穿透与缓存击穿是什么场景?怎么解决?
答1:
1.缓存穿透说的是查询一个数据库一定不存在的数据,也就是说数据库不存在那缓存中一定也不存在。
2.缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,
当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

答2:
1.缓存穿透可以设置布隆过滤器进行过滤,另外如果有多次查询也可以将这个不存在的数据key缓存到redis中,同时设置一个较短的过期时间,value是空。
2.缓存击穿的话其实有两种方案
1.可以对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询
2.如何是热点key的话,可以设置一个较长的存活时间,或者永久不过期,这样的话就避免了锁的竞争。

10.Redis可以用来实现什么功能?有哪些使用场景
答:k-v缓存,排行榜热点缓存,限流,分布式锁,发布/订阅(消息队列),Redis事务

11.除了做k-v缓存之外,Redis还有哪些高级使用场景
答:k-v缓存,排行榜热点缓存,限流,分布式锁,发布/订阅(消息队列),Redis事务
地理位置查询,bitmap,基于redis的布隆过滤

12.redis能做分布式消息队列吗
答:能,但是不好做到高可用,简单的消息队列可以支持,因为跟真正的主流消息队列产品来说
不能提供消息的持久化,不能保证消息的ack机制,也不能保证消息的重发确认,同时不能保证高并发大数据量的情况下存在的消息堆积问题
需要自己实现对应的策略和机制,所以比较难以实现高可用。

13.Redis中的zset在项目中怎么用?
答:需要对数据进行排序,按权重或者按分数的场景,同时保证数据的实时性和有效性
分析:笔者答的不好,因为笔者确实没有用过,不过有一种场景可以使用,就是首页最热数据的展示,也是按权重计算的,
其实可以使用这种数据结构标识最热数据id的排行。

14.Redis有哪些数据淘汰策略
答:
1,volatile-lru:从已设置过期时间的哈希表(server.db[i].expires)中随机挑选多个key,然后在选到的key中用lru算法淘汰最近最少使用的数据
2,allkey-lru:从所有key的哈希表(server.db[i].dict)中随机挑选多个key,然后再选到的key中利用lru算法淘汰最近最少使用的数据
3,volatile-ttl:从已设置过期时间的哈希表(server.db[i].expires)中随机挑选多个key,然后在选到的key中选择过期时间最小的数据淘汰掉。
4,volatile-random:从已设置过期时间的哈希表(server.db[i].expires)中随机挑选key淘汰掉。
5,allkey-random:从所有的key的哈希表(server.db[i].dict)中随机挑数据淘汰
6,no-eviction(驱逐):内存达到上限,不淘汰数据。
相关链接:https://blog.csdn.net/weixin_39590058/article/details/88648919

15.Redis的字符串底层数据结构是怎么样的?
redis使用的是简单动态字符串的结构(SDS),有三个部分,已用字节长度,未用字节长度和存储数据的字节数组。
Redis自身实现的字符串结构有如下特点:
·O(1)时间复杂度获取:字符串长度、已用长度、未用长度。
·可用于保存字节数组,支持安全的二进制数据存储。
·内部实现空间预分配机制,降低内存再分配次数。
·惰性删除机制,字符串缩减后的空间不释放,作为预分配空间保留。

16.Redis的其他数据结构有用到吗?
答:其实有9种,常见的有5种

除了Redis篇,还有其他篇的总结,后面有时间给大家分享。

发布了159 篇原创文章 · 获赞 69 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/u010504064/article/details/104157928