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

Redis缓存那些事儿,网站性能提升里不能忽视的关键点

“Redis缓存那些事儿,网站性能提升里不能忽视的关键点” 来源:综合自互联网技术社区、博客及实践经验总结)

咱们先从一个最简单的场景说起,你开了一个网上商城,首页上要展示最热销的十件商品,每次有用户打开首页,你的网站服务器就得去数据库里查一遍,按照销量排序,再把结果拿回来,一开始用户少,没问题,数据库扛得住,但突然有一天,你的商品火了,访问量暴增,每秒有成千上万人点开首页,这下数据库可就惨了,它就像一个收银台,平时应付十个顾客很轻松,现在突然涌进来一万个顾客同时要结账,CPU直接飙到100%,响应慢得像蜗牛,最后可能直接就“挂掉”了,页面一片空白,用户可不管这些,他们只会觉得你的网站太烂,然后扭头就走。

Redis缓存那些事儿,网站性能提升里不能忽视的关键点

这时候,Redis就该登场了,你可以把Redis想象成设在数据库前面的一個“超级临时货架”,第一次有人访问首页时,程序还是老老实实去数据库里查出那十件热销商品,但在把结果返回给用户之前,程序会“多一个心眼”,把这个结果一模一样地复制一份,放在Redis这个“临时货架”上,并且给它设一个“保质期”,比如5分钟,那么在接下来的5分钟内,再有用户来访问首页,程序就不用再去麻烦数据库了,而是直接去Redis这个“临时货架”上拿现成的结果,速度飞快,因为Redis是把数据存在内存里的,读写速度比存在硬盘上的数据库要快上百倍甚至更多,这样一来,数据库的压力瞬间就降下来了,网站的速度也提上去了,这就是缓存最核心、最直接的作用:用空间换时间,用服务器上的一点内存空间,换来极高的响应速度。

这个“临时货架”用起来可不是一劳永逸的,有几个非常关键的点如果处理不好,反而会惹出麻烦。

Redis缓存那些事儿,网站性能提升里不能忽视的关键点

第一个关键点:缓存和数据库的数据一致性。 接着上面的例子,假如有个管理员在后台修改了其中一件热销商品的价格,数据库里的价格已经改了,但Redis“货架”上缓存的那个商品列表里,价格还是旧的,在接下来5分钟的缓存有效期内,所有用户看到的就都是错误的老价格了,这就出现了数据不一致,解决这个问题有几种常见的思路,但没有一种是完美的,可以在更新数据库的同时,直接让对应的缓存失效(删除Redis里的那份数据),这样下次读取时发现缓存没了,就会去数据库取最新的数据并重新缓存,但这要求更新数据库和删除缓存这两个操作必须都成功,否则还是会不一致,这是一个需要仔细设计的地方。

第二个关键点:缓存穿透。 想象一下,有个恶意用户或者爬虫,不停地请求查询一个根本不存在的数据,比如商品ID是负数的商品,每次请求,因为缓存里肯定没有(非法ID不会被缓存),程序都会去数据库查询,数据库也查不到,这样一来,这个无意义的查询就成功地绕过了缓存,每次都直接打在数据库上,如果这种请求量很大,同样能把数据库压垮,解决办法通常是对这种非法请求在应用层就直接拦截掉,或者即使去查了数据库,没找到结果,也把这个“空结果”在Redis里缓存一个很短的时间(比如一两分钟),让后续相同的恶意请求在缓存层面就被挡住。

Redis缓存那些事儿,网站性能提升里不能忽视的关键点

第三个关键点:缓存雪崩。 这比穿透更可怕,假设你设置了大量的缓存数据,并且它们都在同一时间点过期。 expiry time一到,所有这些缓存瞬间全部失效,此时恰巧有大量的用户请求涌来,这些请求发现缓存没了,就会全部同时涌向数据库去查询数据,数据库瞬间承受巨大的压力,很可能导致数据库宕机,进而导致整个系统崩溃,这就好比“临时货架”在同一时间被清空,所有顾客又都挤到唯一的总仓库去抢货,直接把仓库挤塌了,避免雪崩的常用方法是给不同的缓存数据设置一个随机的过期时间,让它们分散在不同的时间点失效,避免集体失效的灾难性后果。

第四个关键点:缓存击穿。 这个可以看作是雪崩的“点”版本,它不是大量缓存失效,而是某个非常热点的数据(比如某个顶流明星发布的商品信息)突然过期了,此时有海量的请求同时来访问这个热点数据,发现缓存失效后,这些请求会同时去查询数据库,这个热点查询瞬间就把数据库打穿了,解决思路是使用“互斥锁”,当第一个请求发现缓存失效时,它先去获得一个锁,然后由它一个人去数据库加载数据并重建缓存;在这个期间,其他请求要么等待,要么直接返回一个默认值,等缓存重建好后再来访问,这样就避免了大量请求同时去冲击数据库。

除了这些“坑”,Redis本身也非常强大,它支持多种数据结构,不仅仅是简单的键值对,比如可以用列表(List)来实现简单的消息队列,用集合(Set)来存储用户标签实现精准推荐,用有序集合(Sorted Set)来做排行榜功能,这些都能极大地丰富网站的功能和性能优化手段。

Redis是提升网站性能的一把利器,但它就像一把双刃剑,用好了,网站速度飞起,用户体验极佳;用不好,反而会引发各种诡异的问题,甚至导致系统瘫痪,在享受缓存带来的性能红利时,一定要时刻警惕上面提到的这些关键点,根据自己网站的实际业务场景,做好预案和设计,才能真正让Redis成为你的得力助手,而不是麻烦的根源。