Redis面试题汇总(基础)

最近开始了第一次换工作之旅,作为一个后端Redis就是必问的啦,好了废话不多说,直接上被问最频繁的基础问题~


上图引用自☞https://www.jianshu.com/p/7f466e7cbdac
一个和我同龄的优秀开发小哥,面试准备阶段看了很多他的文章,对拿offer帮助很大,给大家安利一波

先了解一下Redis的整体知识体系对学习和面试复习都很试用,脑子里面留个体系图,回忆起来很容易,学习的时候也知道自己在学啥,学哪。

(一)Redis数据结构

  • string(字符串)

Redis-string

Redis 的字符串是动态字符串,是可以修改的字符串,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。

常见用途:
1、缓存用户信息
2、计数

  • List(列表)

Redis-List

Redis中的列表list,在版本3.2之前,列表底层的编码是ziplist和linkedlist实现的,但是在版本3.2之后,重新引入 quicklist,列表的底层都由quicklist实现。

常见用途:
1、消息队列(运用blpop 、 brpop 和 brpoplpush 这个几个阻塞命令实现阻塞队列)

  • Hash

Redis-Hash

redis的hash架构就是标准的hashtab的结构,通过挂链解决冲突问题。

常见用途:
1、存储对象(hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。)

  • set(无序集合)

常见用途:
1、标签:比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
2、共同好友功能
3、统计网站的独立IP。利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。

  • zset(有序集合)

Redis-zset

zset用的数据结构是跳表,这是一个被问频率很高的点,跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。简单说来跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳表能够提供O(logN)的时间复杂度。

常见用途:
1、排行榜
2、简单限流
3、延时队列


(二)zset跳表的数据结构

zset跳表的数据结构

跳表具有如下性质:
(1) 由很多层结构组成
(2) 每一层都是一个有序的链表
(3) 最底层(Level 1)的链表包含所有元素
(4) 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。


(三)Redis的数据过期策略

一般的剔除策略有 FIFO 淘汰最早数据、LRU 剔除最近最少使用、和 LFU 剔除最近使用频率最低的数据几种策略。

内存淘汰策略主要采用了6种方式进行内存对象的释放操作
1.volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放
2.allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放
3.volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放
4.allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择一个数据进行入释放
5.volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作
6.noeviction:不删除任意数据(但redis还会根据引用计数器进行释放呦~),这时如果内存不够时,会直接返回错误


(四)Redis缓存雪崩、缓存击穿、缓存穿透

  • 缓存雪崩

    缓存中大量key同时失效,此时用户请求都去访问数据库,造成数据库崩了的现象
    【解决方案】
    1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
    2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
    3、设置热点数据永远不过期

  • 缓存击穿

    缓存击穿是指某个热点key,失效同时造成数据库负担,这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
    【解决方案】
    1、设置热点数据永远不过期。
    2、加互斥锁

  • 缓存穿透

    缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
    【解决方案】
    1、接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
    2、从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
    3、布隆过滤器

(五)Redis的持久化机制

  • RDB快照

    周期性持久化,数据可能丢失,用于冷备

  • AOF日志

    增量持久化,用于热备,数据比较完整,append-only

你可能感兴趣的:(Redis面试题汇总(基础))