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

Redis缓存到底是咋回事,原理那些事儿慢慢聊给你听

先从“仓库”和“前台”说起

想象一下,你是一个大公司的管理员,公司有一个巨大的仓库,里面放着所有重要的文件和资料(这就像是我们的数据库,比如MySQL),每次有员工需要一份文件,他都得亲自跑一趟仓库,在堆积如山的货架上翻找,然后登记、领取,这个过程很正规,但也很慢,尤其是当很多员工同时需要不同文件时,仓库门口就排起了长队,效率非常低。

公司为了提升效率,想了个办法:在办公区设立了一个“前台”,这个前台不大,但非常机灵,她(也就是Redis)会提前把最常用、最紧急的文件复印一份,放在自己手边的小文件柜里,这个文件柜的特点就是:存取速度极快

当员工需要文件时,他首先会去问前台:“小李,有XX文件吗?”如果前台有(这种情况叫 缓存命中),小李瞬间就能把复印件递过去,员工立马就能回去工作,省去了跑去仓库的漫长时间,如果前台没有这份文件(这叫 缓存未命中),她就会赶紧跑去仓库取来原件,复印一份留在前台,然后把原件交给员工,她会很聪明地把一些很久没人用的复印件扔掉,腾出空间放新的热门文件。

Redis缓存到底是咋回事,原理那些事儿慢慢聊给你听

你看,这个“前台”就是Redis缓存,它的核心价值就是:用更快的存储空间,存放最热门的数据,减少对慢速数据库的直接访问,从而极大提升整个系统的响应速度。

Redis这个“前台”为啥特别快?

你可能想问,为啥这个“前台”速度这么快?这主要得益于它的几个看家本领(根据Redis官方文档和其设计原理):

Redis缓存到底是咋回事,原理那些事儿慢慢聊给你听

  1. 内存干活儿(基于内存):仓库(数据库)的数据是放在硬盘上的,读写硬盘就像是在纸上写字,得一笔一划来,而Redis把数据都放在服务器的内存里,内存的读写速度是硬盘的几十上百倍,相当于信息直接在脑子里想一下就有了,速度自然天差地别,这是它快的根本原因。

  2. 单线程大师(单线程模型):这听起来好像是个缺点,但其实是Redis的高明之处,它用一个线程来处理所有命令,避免了多线程之间争夺资源带来的额外开销,你可以理解为,这个前台虽然只有一个人,但她业务能力超强,做事全神贯注,从不三心二意,而且她有一套非常高效的待办事项列表(I/O多路复用),能同时接待很多人的询问,并快速决定先处理哪个后处理哪个,绝不会混乱,这样设计简单又高效,避免了复杂的锁的问题。

  3. 数据结构百宝箱(多样的数据结构):普通缓存可能就像个只能放键值对的简单抽屉,但Redis的前台可不一般,她的小文件柜里有各种不同的夹子:有专门放清单的(List),有放无序集合的(Set),有能排序的(ZSet),还有能存对象信息的(Hash),这意味着她不仅能帮你取文件,还能帮你整理文件列表、统计不同文件类型等,功能非常丰富。

    Redis缓存到底是咋回事,原理那些事儿慢慢聊给你听

用了Redis就高枕无忧了吗?当然不是

引入Redis这个能干的前台后,虽然效率大增,但也带来了一些新的“管理问题”:

  • 数据一致性:仓库里的原件(数据库)和前台的复印件(Redis)可能不一致,仓库里的文件更新了,但前台的复印件还是旧的,这就需要有一套机制来通知前台:“嘿,那份文件过期了,快去更新!”这就是缓存一致性难题,常见的做法有更新数据库后立刻删除缓存,或者设置缓存的过期时间。
  • 缓存雪崩:想象一下,如果前台小文件柜里很多文件都在同一时刻过期失效了,恰巧这时一大波员工同时来要文件,结果前台发现全是过期的,只能全部跑去仓库取,瞬间的巨大压力直接把仓库(数据库)压垮了,解决办法通常是给缓存设置不同的过期时间,避免集体失效。
  • 缓存穿透:有个员工老是来问一个根本不存在于仓库的文件,前台每次都没有,每次都得白跑一趟仓库,浪费了精力,这可能是恶意攻击,解决办法可以是把这个“查无此文件”的结果也临时缓存一小段时间,或者提前校验请求的合法性。
  • 缓存击穿:某个超级热门的文件过期了,这时候突然有大量员工同时来要这个文件,导致大量请求瞬间涌向仓库,解决办法可能是让前台只让一个人去取,其他人等着就行(加锁),或者设置热点数据永不过期。

总结一下

Redis缓存说到底,就是一个建立在内存中的、速度极快数据暂存地,它通过牺牲数据的持久安全性(内存断电会丢失数据,虽然Redis有持久化机制补救),换来了无与伦比的性能,它就像是你电脑系统的一个“超级大脑缓存”,专门负责处理那些最频繁、最紧急的请求,从而保护后方动作较慢的数据库“硬盘”,让整个应用程序变得飞快。

它不是什么银弹,用好了是神器,能极大提升体验;用不好也会带来新麻烦,需要开发者根据实际业务场景仔细设计和维护,希望这个比喻能帮你很好地理解Redis到底是咋回事儿。