当前位置:首页 > 问答 > 正文

面试前快速掌握Redis那些必须知道的知识点和技巧大全

(一) Redis是个啥?说白了就是一个超级快的“大本子” 你别被“内存数据库”、“键值存储”这些词吓到,可以把Redis想象成一个超级快的、放在内存里的“大本子”(来源:Redis官方介绍),这个本子的每一页都只记录两样东西:一个“钥匙(Key)”和一个“值(Value)”,你想存东西,就告诉它钥匙叫什么,值是什么;想取东西,报上钥匙的名字,它瞬间就能把值给你,因为它把所有数据都放在电脑的内存里,而不是慢吞吞的硬盘上,所以读写速度极快,通常用来解决那些需要“秒级”响应的场景。

(二) 面试官最爱问的几种“值”的类型,你得门儿清 光知道Key-Value可不够,面试官肯定会深入问Value有哪几种类型,你至少得熟练说出这五种最常见的(来源:Redis数据类型官方文档):

  1. String(字符串):这是最简单的类型,就是一条字符串,你别只当它是存文本的,它还能存数字,并且能直接对数字进行加减操作,比如用来做文章点赞数、商品库存量,非常方便。
  2. Hash(哈希):这个就像Java里的Map或者Python里的字典,一个Key里面可以存多对字段和值,最适合存一个对象的多个属性,比如一个用户信息(userId作为Key),里面包含name(姓名)、age(年龄)、email(邮箱)等多个字段,这样存取和修改某个字段都很高效。
  3. List(列表):就是一个双向链表,数据按顺序排列,你可以在头部(左边)或尾部(右边)添加、取出元素,典型的用法是做个简单的消息队列,或者存朋友圈的最新动态列表。
  4. Set(集合):和数学里的集合一样,里面的元素是唯一的,没有顺序,最大的用处就是做“共同好友”这类操作,你可以很方便地求出两个用户的好友集合的交集,看看他们有哪些共同好友。
  5. Sorted Set(有序集合):这是Set的升级版,每个元素都会关联一个分数(score),Redis会根据这个分数从小到大排序,这是实现“排行榜”的利器,比如游戏积分榜、微博热搜榜,Key是榜单名称,Value是成员和对应的分数。

(三) 为啥Redis这么快?这三个原因你得脱口而出 这是必考题,你别说一大堆复杂的,就抓住三个核心点(来源:Redis官方文档关于性能的说明及《Redis设计与实现》):

面试前快速掌握Redis那些必须知道的知识点和技巧大全

  1. 内存操作:再说一遍,数据都在内存里,没有硬盘I/O这个最慢的瓶颈,速度自然飞起。
  2. 单线程模型:你可能觉得奇怪,单线程不是会慢吗?恰恰相反,Redis的核心网络模型是单线程的,这意味着它避免了多线程之间复杂的上下文切换和竞争问题,它用一个“队列”来处理所有命令,保证顺序执行,简单又高效,Redis在某些持久化等操作上会用额外线程,但处理你的读写请求的核心部分就是单线程。
  3. 高效的数据结构:Redis自己实现了一套精炼的数据结构,比如简单动态字符串、跳跃表等,这些结构都是为了极致的速度而优化的。

(四) 数据不能丢:持久化是怎么一回事? 内存快是快,但一断电数据就没了,所以Redis提供了两种主要的“持久化”机制,把内存数据写到硬盘上备份(来源:Redis持久化官方文档):

  1. RDB(快照):相当于给整个数据库拍一张照片(备份),存成一个文件,你可以设置每隔一段时间或者有多少次写操作后自动拍一张,优点是恢复大数据集时速度很快,文件也比较紧凑,缺点是如果两次拍照之间服务器宕机,会丢失这段时间的数据。
  2. AOF(追加日志):不拍照,而是把每一个写命令都像记日记一样记录下来,服务器重启时,把日记里的命令重新执行一遍就能恢复数据,优点是数据安全性高,最多丢失一秒的数据(可配置),缺点是日志文件通常会比RDB文件大,恢复速度也慢一些。

面试技巧:别说死记硬背的概念,你可以说“在实际生产中,通常两者结合使用,用AOF来保证数据不丢失,用RDB来做冷备和快速恢复。”

面试前快速掌握Redis那些必须知道的知识点和技巧大全

(五) 缓存穿透、雪崩、击穿,这三个“坑”你得会躲 用Redis做缓存时,这三个问题是高频考点,你要理解它们是什么以及怎么解决。

  1. 缓存穿透问题:有人疯狂查询一个根本不存在的数据(比如数据库中也不存在的数据),这个数据在缓存里肯定没有,每次请求都直接打到数据库上,把数据库打垮。解决:a) 对请求参数做校验,不合法的直接返回,b) 即使从数据库没查到,也在缓存里存个“空值”并设置一个短的过期时间,这样下次同样的请求就不会打到数据库,c) 用布隆过滤器(Bloom Filter)这种数据结构,在查询缓存前先过一遍,如果它说“肯定不存在”,那就不用查了。
  2. 缓存雪崩问题:缓存中大量的数据在同一时间过期失效,导致所有请求这些数据的请求瞬间都涌向数据库,造成压力激增。解决:a) 给缓存数据的过期时间加上一个随机值,让它们分散开失效,避免集体失效,b) 如果用的是Redis集群,可以设置“永不过期”的背景更新策略,由后台线程去更新缓存。
  3. 缓存击穿问题:一个非常热点的数据(比如明星八卦)过期了,这时有大量并发请求这个Key,这些请求同时发现缓存失效,都去数据库查询,就像在缓存上打了一个洞。解决:a) 设置热点数据永不过期,b) 使用“互斥锁”(mutex key),当第一个请求去数据库查询时,在缓存中加个锁标记,其他请求看到有锁就等待或返回默认值,等第一个请求重建好缓存后,后续请求就能从缓存中获取了。

(六) 一些小而关键的技巧和注意事项

  • Key的设计:最好用“业务名:表名:id”这种冒号分隔的命名方式,user:info:1001,清晰易懂,也方便管理。
  • 批量操作:尽量减少网络往返次数,多用 MSETMGETPipeline 这样的批量操作命令。
  • *别用`KEYS 命令**:这个命令会遍历所有Key,在生产环境数据量大时会卡死Redis,要用的话,用SCAN` 命令代替,它不会阻塞服务。

面试前最好自己能动手装个Redis,敲几个简单的命令感受一下,SETGETHSETHGETALLLPUSHLRANGE 等,这比死记硬背要强得多。