缓存 缓存的作用: 高并发、高性能 高性能:查询速度快 高并发:缓存是走内存的,内存天然就支撑高并发 常见缓存问题: 缓存与数据库双写不一致 缓存雪崩、缓存穿透、缓存击穿 缓存并发竞争 如何保证缓存和数据库一致性: 使用串行化,即:将读请求和写请求放到一个内存队列中。 串行化可以保证缓存与数据库一直,但是会导致系统吞吐量大幅度降低。非严格要求,不要串行化。 经典缓存+DB读写模式 》读:先读缓存,没有读取DB,读出来放入缓存。 》更新:先更新DB,再 删除 缓存。 缓存雪崩 请求量大时,缓存此时也跌机了,导致大量请求直接请求DB,带着DB也跌机了。 缓存雪崩的事前事中事后的解决方案: 事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。 事后:Redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。 缓存穿透 缓存中查询不到,大量的请求直接查询DB. 解决方案: 每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN 。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。 缓存击穿 某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况