使用 Redis 做缓存 | 青训营笔记

171 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

操作流程

在青训营项目中,我们想用 Redis 做缓存。我们的大致流程如下:

Redis缓存.png

缓存异常处理

引入缓存层,就需要考虑缓存异常的三个问题:缓存雪崩、缓存击穿、缓存穿透

缓存雪崩和缓存击穿

缓存雪崩: 保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,就需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里。但是如果同一时间,大量缓存数据一起过期,又正好此事有大量的请求。这时无法命中缓存,就全部去访问数据库。

缓存击穿: 如果缓存中的某个热点数据过期了,而碰巧此时大量的请求访问了该热点数据。那么这些请求都无法直接命中缓存,于是都去访问数据库,数据库很容易就被高并发的请求冲垮。

而经过针对项目进行考虑后,我们打算不设置过期时间。使用定时任务将 Redis 中的数据更新到数据库中。

缓存穿透

当用户访问的数据,既不在缓存中,也不在数据库中。所以请求在访问缓存时,发现缓存缺失,于是就去访问数据库时,发现数据库中也没有要访问的数据。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。

我们的处理是:在发生一次缓存击穿过后,将该请求存进 Redis 中,值设为 nil。表示没有该数据,那么后续的请求都会直接在 Redis 中获得答案。 当然,还有其他方法,只是时间问题来不及做优化了......哈哈哈哈。

数据更新

使用 cron 库创建定时任务,每隔一段时间将 Redis 中的数据写入数据库以保证数据的可靠性。