Redis面试题型整理

1、redis的基本数据结构类型

String(字符串)、Hash(哈希)、List(列表)、Set(集合)、zset(有序集合,内部实现是跳表)

2、redis为什么这么快?

1、基于内存存储实现

内存读写是要比磁盘快很多的,redis是基于内存存储实现的数据库,相比于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗

2、高效的数据结构

跳跃表是redis特有的数据结构,就是在链表的基础上,增加多级索引提升查找效率。

跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作批量处理节点

3、合理的数据编码

①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(跳跃表)编码

4、合理的线程模型

①I/O多路复用(就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。)

②单线程模型

5、虚拟内存机制

就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。

3、MySQL为什么使用B+tree,而不是用跳表?

B+树是多叉平衡搜索树,扇出高,只需要3层左右就能存放2kw左右的数据,同样情况下跳表则需要24层左右,假设层高对应磁盘IO,那么B+树的读性能会比跳表要好,因此mysql选了B+树做索引。

4、Redis为什么使用跳表,而不是用B+tree?

redis的读写全在内存里进行操作,不涉及磁盘IO,同时跳表实现简单,相比B+树、AVL树、少了旋转树结构的开销,因此redis使用跳表来实现ZSET,而不是树结构。

5、什么样的数据初始化到redis缓存中

1、将一些经常发生变化的数据缓存到redis中(增删改DML)

2、将一些不经常变动的数据缓存到redis中(查询快 DQL)

6、什么是缓存击穿、缓存穿透、缓存雪崩?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。

通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。

如何避免缓存穿透呢? 一般有三种方法。

1.如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。 2.如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间。(业务上比较常用,简单有效) 3.使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。

缓存雪崩:指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至down机。

解决方案:

1、缓存雪奔一般是由于大量数据同时过期造成的,对于这个原因,可通过均匀设置过期时间解决,即让过期时间相对离散一点。如采用一个较大固定值+一个较小的随机值,5小时+0到1800秒酱紫。 2、Redis 故障宕机也可能引起缓存雪奔。这就需要构造Redis高可用集群啦。

缓存击穿: 指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。

解决方案就有两种:

1.使用互斥锁方案。缓存失效时,不是立即去加载db数据,而是先使用某些带成功返回的原子操作命令,如(Redis的setnx)去操作,成功的时候,再去加载db数据库数据和设置缓存。否则就去重试获取缓存。

  1. “永不过期”,是指没有设置过期时间,但是热点数据快要过期时,异步线程去更新和设置过期时间。

7、Redis的过期策略

定时过期

每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

惰性过期

只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

定期过期

每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

8、Redis内存淘汰策略

在 4.0 版本之前 Redis 的内存淘汰策略有以下 6 种。

noeviction:不淘汰任何数据,当内存不足时,执行缓存新增操作会报错,它是 Redis 默认内存淘汰策略。

allkeys-lru:淘汰整个键值中最久未使用的键值。

allkeys-random:随机淘汰任意键值。

volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值。

volatile-random:随机淘汰设置了过期时间的任意键值。

volatile-ttl:优先淘汰更早过期的键值。 可以看出我们上面示例使用的是 Redis 默认的内存淘汰策略“noeviction”。

而在 Redis 4.0 版本中又新增了 2 种淘汰策略:

volatile-lfu,淘汰所有设置了过期时间的键值中最少使用的键值;

allkeys-lfu,淘汰整个键值中最少使用的键值。

9、Redis内存淘汰算法

内存淘汰算法主要包含两种:LRU淘汰算法LFU淘汰算法

LRU淘汰算法 是基于链表结构实现的,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要进行内存淘汰时,只需要删除链表尾部的元素即可。

LFU(Least Frequently Used,最不常用的)淘汰算法:最不常用的算法是根据总访问次数来淘汰数据的,它的核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

LFU 相对来说比 LRU 更“智能”,因为它解决了使用频率很低的缓存,只是最近被访问了一次就不会被删除的问题。如果是使用 LRU 类似这种情况数据是不会被删除的,而使用 LFU 的话,这个数据就会被删除。

10、Redis的持久化机制有哪些?

准确来说有三种:(redis默认有16个数据库)

RDB(Redis DataBase)持久化 ​ AOF(Append Only File)持久化 ​ RDB-AOF 混合持久化

RDB持久化:指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。执行完操作后,在指定目录下会生成一个dump.rdb文件,Redis 重启的时候,通过加载dump.rdb文件来恢复数据。RDB触发机制主要有以下几种:

1、手动触发:通过 save / bgsave 命令 触发持久化操作

2、自动触发:通过配置选项,让服务器在满足指定条件时自动执行 bgsave 命令

RDB 的优缺点:

优点:生成的二进制文件体积小,恢复数据的速度快

缺点:bgsave 命令每次执行时都会 创建子进程(属于重量级操作),资源消耗大

AOF(append only file) 持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。

AOF 的优缺点:

优点:相较 RDB(一旦 内存掉电,存在于内存的数据全部丢失),AOF 丢失数据的量更小,而通过 everysec 选项,用户可以将数据丢失的时间窗口限制在1秒之内。

缺点:

1、AOF文件 存储的是 协议格式文本,其体积 相较于 RDB 的二进制文件 大很多

2、当需要恢复较多数据时,使用 AOF文件 恢复的速度会比较慢(原因在于:需要重新执行每一条命令)

3、AOF 在进行重写时也需要创建 子进程,当数据量较大时将占用较多资源,同时会导致服务器处于短暂阻塞状态

RDB-AOF 混合模式:

①基于 AOF 、结合 RDB 的优点 进行构建

②执行 AOF 重写操作时

执行 bgsave 命令生成 RDB数据,并将其写入 AOF文件 中

对于重写之后执行的命令,则以 协议文本 的方式追加到 AOF文件 的末尾(即 RDB数据 之后)

③混合模式拥有 AOF、RDB 两者的优点

服务器可以通过 AOF文件 包含的 RDB数据 来实现快速的数据恢复

服务器可以通过 AOF文件 包含的 AOF数据 来将丢失数据的时间窗口限制在1秒之内

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值