缓存设计需要关注的点
很多使用场景,查询的缓存数据都是由定时任务取刷新,然后缓存查不到从 DB 查了在更新缓存。如果这些 key 在同一时间失效, 那么失效的时候,大量的请求过来。就会直接打到 DB 上, 这个时候 DB 很可能被打垮,即使马上重启也会被新的流量打垮。
这种同一时间大量缓存的失效,导致请求直接打到 DB 上的情况, 就是缓存雪崩。
针对于这种情况,在批量写 Redis 数据的时候, 从缓存的过期时间入口,将原来的固定过期时间,调整为过期时间=基础时间+随机时间
,让缓存慢慢过期,避免瞬间全部过期,对DB产生过大压力。
缓存穿透指的是缓存缓存和数据库中都没有的数据,而用户不断发起请求,让请求直接落再DB上,增加数据库压力,可能导致数据库被击垮。这种请求很可能是攻击者恶意发起的。
针对这种情况首先要做好数据校验,不合法的数据尽量拦截掉.
在平常高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。
针对这种情况可以:
对于某些 key 有非常大的访问量, 容易把 hot key 所在的那台机器打垮。
解决方案:
当访问缓存时,如果key对应的value过大,读写、加载很容易超时,容易引发网络拥堵。另外缓存的字段较多时,每个字段的变更都会引发缓存数据的变更,频繁的读写,导致慢查询。如果大key过期被缓存淘汰失效,预热数据要花费较多的时间,也会导致慢查询。
解决方案:
在另一篇博客有详细的介绍: MySQL与缓存一致性问题