分享下面试真题,大家一起加油哈。(可私信领取更多真题文档)
-
说说Redis为什么快
-
Redis有几种数据结构,底层分别是怎么存储的
-
Redis有几种持久化方式
-
多线程情况下,如何保证线程安全?
-
用过volatile吗?底层原理是?
-
MySQL的索引结构,聚簇索引和非聚簇索引的区别
-
MySQL有几种高可用方案,你们用的是哪一种
-
说说你做过最有挑战性的项目
-
秒杀采用什么方案
-
聊聊分库分表,需要停服嘛
-
redis挂了怎么办?
-
你怎么防止优惠券有人重复刷?
-
抖音评论系统怎么设计
-
怎么设计一个短链地址
-
有一个数组,里面元素非重复,先升序再降序,找出里面最大的值
1.说说Redis为什么快
1.1 基于内存存储实现
内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。
1.2 高效的数据结构
Mysql索引为了提高效率,选择了B+树的数据结构。其实合理的数据结构,就是可以让你的应用/程序更快。先看下Redis的数据结构&内部编码图:
1.2.1 SDS简单动态字符串
-
字符串长度处理:Redis获取字符串长度,时间复杂度为O(1),而C语言中,需要从头开始遍历,复杂度为O(n);
-
空间预分配:字符串修改越频繁的话,内存分配越频繁,就会消耗性能,而SDS修改和空间扩充,会额外分配未使用的空间,减少性能损耗。
-
惰性空间释放:SDS 缩短时,不是回收多余的内存空间,而是free记录下多余的空间,后续有变更,直接使用free中记录的空间,减少分配。
1.2.2 字典
Redis 作为 K-V 型内存数据库,所有的键值就是用字典来存储。字典就是哈希表,比如HashMap,通过key就可以直接获取到对应的value。而哈希表的特性,在O(1)时间复杂度就可以获得对应的值。
1.2.3 跳跃表
-
跳跃表是Redis特有的数据结构,就是在链表的基础上,增加多级索引提升查找效率。
-
跳跃表支持平均 O(logN),最坏 O(N)复杂度的节点查找,还可以通过顺序性操作批量处理节点。
1.3 合理的数据编码
Redis 支持多种数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是redis设计者总结优化的结果。
-
String:如果存储数字的话,是用int类型的编码;如果存储非数字,小于等于39字节的字符串,是embstr;大于39个字节,则是raw编码。
-
List:如果列表的元素个数小于512个,列表每个元素的值都小于64字节(默认),使用ziplist编码,否则使用linkedlist编码
-
Hash:哈希类型元素个数小于512个,所有值小于64字节的话,使用ziplist编码,否则使用hashtable编码。
-
Set:如果集合中的元素都是整数且元素个数小于512个,使用intset编码,否则使用hashtable编码。
-
Zset:当有序集合的元素个数小于128个,每个元素的值小于64字节时,使用ziplist编码,否则使用skiplist(跳跃表)编码
1.4 合理的线程模型
I/O 多路复用
多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
2. Redis有几种数据结构,底层分别是怎么存储的
常用的,Redis有以下这五种基本类型:
-
String(字符串)
-
Hash(哈希)
-
List(列表)
-
Set(集合)
-
zset(有序集合) 它还有三种特殊的数据结构类型
-
Geospatial
-
Hyperloglog
-
Bitmap
2.1 Redis 的五种基本数据类型
String(字符串)
-
简介:String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
-
简单使用举例: set key value、get key等
-
应用场景:共享session、分布式锁,计数器、限流。
-
内部编码有3种,int(8字节长整型)/embstr(小于等于39字节字符串)/raw(大于39个字节字符串)
Hash(哈希)
-
简介:在Redis中,哈希类型是指v(值)本身又是一个键值对(k-v