一些八股文
# Redis为什么这么快?
- 纯内存操作。
- 核心是基于非阻塞的 IO 多路复用机制。
- C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。
- 单线程反而避免了多线程的频繁上下文切换问题,预防了多线程可能产生的竞争问题。
# 缓存穿透
缓存穿透是指请求的数据在缓存中没有,并且数据库里面也没有。比如用户请求一个不存在的数据的时候,比如ID为-1之类的,这个时候就会直接访问数据库,如果用户是攻击者,这也就会导致数据库压力过大。
- 存一个空值的缓存,比如-1,就存个(-1,NULL)到缓存,这样就不会到达数据库了,但是注意缓存时间不能太长,免得影响正常业务。
- 对这类请求进行过滤。比如对接口增加权限鉴定之类的。
# 缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
- 设置热点数据永远不过期。
- 加互斥锁,保证不会有多个请求去刷新缓存,保证缓存key只被一个请求更新
# 缓存雪崩
指的是由于数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机,导致大量的请求都到达数据库。
在有缓存的系统中,系统非常依赖于缓存,缓存分担了很大一部分的数据请求。当发生缓存雪崩时,数据库无法处理这么大的请求,导致数据库崩溃。
- 为了防止缓存在同一时间大面积过期导致的缓存雪崩,可以通过观察用户行为,合理设置缓存过期时间来实现;
- 为了防止缓存服务器宕机出现的缓存雪崩,可以使用分布式缓存,分布式缓存中每一个节点只缓存部分的数据,当某个节点宕机时可以保证其它节点的缓存仍然可用。
- 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
- 设置热点数据永远不过期。
# Redis 集群
# Redis 中 Gossip 的消息是指数级别的吗?
不是指数级别的,Redis 会维护版本及状态。
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11