【Advanced Java】缓存
缓存优缺点
优点:
- 高性能
- 高并发
缺点,因为缓存可能出现的问题:
- 缓存和数据库双写不一致
- 缓存雪崩,缓存穿透
- 缓存并发竞争
Redis
redis 内部使用的是文件事件处理器(file event handler),这个文件时间处理器是单线程的,所以说 redis 叫单线程模型。
Redis为什么单线程效率也这么高:
- 纯内存操作
- 核心是基于非阻塞的 IO 多路复用
- 单线程避免了一些场景下频繁上下文切换的问题,预防了多线程可能产生的竞争问题
Redis过期策略
定期删除(部分) + 惰性删除
Redis内存淘汰机制
- noeviction
- allkeys-lru
- allkeys-random
- volatile-lru (volatile 表示从设置了过期时间的建空间里操作)
- volatile-random
- volatile-ttl
Redis实现高并发
主从架构
Redis实现高可用
哨兵,实现主备切换
Redis实现持久化
- RDB:周期性持久化
- AOF:对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中
如果同时使用 RDB 和 AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。
Redis集群
- redis cluster 可以自动将数据切片,每个 master 上放一部分数据,节点之间通信用 gossip 协议(每个节点持有一份元数据)
- 分布式寻址(一致性哈希算法)
- 主从切换
- 判断节点宕机(超过半数)
- 过滤 slave 节点(和 master 节点断开时间超过了某时间,不配变成 master)
- 从节点选举(超过半数)
缓存雪崩
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
缓存穿透
非正常请求也存一个空值到缓存里,并设置过期时间。
缓存击穿
热点数据突然失效。
- 热点不过期
- redis 或 zookeeper 实现互斥锁,等待第一个请求建完缓存后在释放锁