Skip to the content.

Redis 作为缓存

用户的数据一般存储于数据库,而数据库中的数据又存储于磁盘上,众所周知,磁盘的读写速度算是计算机中最慢的了。

当有大量请求都打到数据库中时,由于数据库极慢的处理速度,很容易导致数据库崩溃,所以通常会用 Redis 作为数据库的缓存。

因为二八法则,所以用 Redis 缓存少量的数据就能够处理绝大多数的请求。

image-20231212221532318

Redis 缓存更新策略

定期生成

Redis 会把用户访问的数据用日志的形式记录下来,然后按照策略(每天、每周、每月)定期更新。

当需要进行更新时,就对日志进行统计,按照 Key 的访问频率降序排序,前 20% 就是热点数据。

但该方法的实时性不高,比如春节期间的晚上九点,搜索某个小品的频率是很高的,但此时关于该小品的数据并不作为热点数据缓存在 Redis 中,所以会有大量的请求打到数据库上,容易导致数据库崩溃。

实时生成

若 Redis 中有用户要访问的数据,那么就直接返回给用户,反之 Redis 就去数据库访问该数据,然后把该数据缓存在 Redis 中,再返回给用户。

但这样时间一长,容易导致 Redis 内存紧张,从而导致 Redis 崩溃。所以,会有一些 Key 的淘汰策略来平衡 Redis 的内存占用情况。

Redis 内存紧张,并不一定是指 Redis 所在的服务器的内存紧张,Redis 也可以设置 Redis 服务的内存容量大小。

Key 淘汰策略

Redis 内置的 Key 淘汰策略

关于缓存失效,导致数据库崩溃的四种情况

缓存预热(Cache preheating)

当 Redis 刚启动或者大批 key 失效时,由于 Redis 中没有什么数据,所以会有很多请求打到数据库上,容易导致数据库崩溃。

此时,可以把准备好的热点数据导入 Redis 中,使 Redis 尽早成长起来。

准备好的热点数据可以通过离线、统计等手段得到。

缓存穿透(Cache penetration)

若 Redis 和数据库中都没有用户要访问的数据,并且之后还有大量的请求访问该数据,那么这些请求都会打到数据库上,容易导致数据库崩溃。

为什么会有大量的请求访问 Redis 和数据库中都没有的数据?

如何解决?

缓存雪崩(Cache avalanche)

短时间内 Redis 上大量的 key 失效,导致大量的请求打到数据库上,容易导致数据库崩溃。

为什么会存在段时间内大量 key 失效?

如何解决?

缓存击穿(Cache breakdown)

是缓存雪崩的一种特殊情况,短时间内 Redis 上大量的热点数据失效,导致大量的请求打到数据库上,容易导致数据库崩溃。

如何解决?

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。