在你阅读之前,先插播个小广告,博主有一个面经专栏,全部都是2024秋招准备的内容,相比于网络上其他的面经,有着面试的所有过程,还有最全的面试答案,不需要再到处找,如果你想获得大厂的offer,认真准备面经是必不可少的,专栏会持续更新至少100篇内容,现在已经更新10+内容了,如果想学习所有的面经,欢迎订阅博主的专栏呀,保证每一篇都是匠心独创,绝对物超所值,下面就开始学习吧~
目录
10、Redis 6.0 之前为什么使用单线程?Redis 6.0 之后为什么引入了多线程?
1、什么是redis?
redis是一个内存数据库,数据的读写操作都在内存中进行,因此速度非常快,常用于缓存,消息队列,分布式锁等场景。
2、Redis 和 Memcached 有什么区别?
首先两者都是内存数据库,性能非常高,但是redis 有更丰富的数据结构,数据可以持久化,支持集群,还有发布订阅、lua脚本、事务等功能,因此使用redis更多一点。
3、为什么用 Redis 作为 MySQL 的缓存?
redis兼具高性能、高并发两大特性,高性能是因为redis对于数据的读写操作都是在内存中进行的,因此性能非常高,高并发是指redis的单机吞吐率是10w,大约是mysql的10倍左右。
4、Redis 数据类型以及使用场景分别是什么?
String,主要用于缓存对象等;
list,主要用于消息队列,但是存在着生产者无法自动生成全局唯一ID,无法以消费组形式消费等问题;
hash,主要用于缓存对象等;
set,主要用于聚合计算,例如点赞,共同关注等;
zset,主要用于排行榜,电话,姓名排序等;
bitmap,主要用于记录签到情况,判断登录状态等;
hyperloglog,主要用于百万的数据统计等;
geo,主要用于存储位置;
stream,主要用于消息队列,相对于list,能解决list存在的问题。
5、五种常见的 Redis 数据类型是怎么实现?
String:sds
list:quicklist
hash:listpack 和 哈希表
set:哈希表和整数集合
zset:listpack 和 跳表
6、listpack是什么?
listpack也叫紧凑列表,是用一块连续的内存空间来保存数据,为了节省内存空间,还使用多种编码方式来表示不同长度的数据。
7、Redis 是单线程吗?
不是单线程,redis的单线程是指接收请求,解析请求,处理请求内容,返回结果这个过程是单线程的,但是redis还会在后台创建关闭文件,aof刷盘,释放内存的线程,主要也是因为这些操作比较费时。
8、Redis 单线程模式是怎样的?
当有多个客户端链接时,会采用IO多路复用,epoll wait会发现事件然后分发给事件处理器,然后通过连接事件处理函数、读事件处理函数、写事件处理函数分别进行处理,连接事件处理函数会调用accept接收连接,然后将已连接的socket添加到epoll中,并注册读事件处理函数或写事件处理函数,读事件处理函数会调用read接收数据,写事件处理函数会调用write发送数据。写事件处理函数会将准备好的的数据发送到队列中,读事件处理函数,也会在数据准备完成后添加到发送队列,然后同时将执行结果加入到缓存中。
9、Redis 采用单线程为什么还这么快?
redis 的大部分操作都在内存中完成,并采用了高效的数据结构;redis是单线程的,避免线程之间的竞争;redis采用了IO多路复用机制处理大量的客户端socket请求,因此速度比较快。