「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。
数据库的性能有瓶颈,受限于磁盘读写速度、内存大小、cpu 性能等,而且很多场景下,单纯靠数据库无法满足需求:
- 经过复杂运算得出的数据,不可能每次用的时候都查数据库算一遍
- 读多写少的数据,也不可能每次都查一遍数据库
所以我们需要引入缓存来解决一次生成、多次使用的问题,避免每次都要访问数据库。缓存能极大提高访问性能。
但是引入新的层会增加系统的复杂度,所以我们需要对这些复杂度做到心中有数。
缓存穿透
缓存穿透是指缓存没有对应数据,直接查的是数据库,通常有以下几种情况:
- 数据确实不存在,这时候需要设置一个默认值,防止被攻击;
- 缓存数据生成耗费大量资源,这时候需要采用分页等机制控制缓存的规模
缓存雪崩
缓存雪崩就是指大量缓存同时失效,从而引起系统的性能直线下降,拖慢整个系统,严重的会造成数据库挂掉。缓存雪崩的常见解决方式有:更新锁机制和后台更新机制。
- 更新锁机制:对缓存更新进行加锁保护,保证每次更新只有一个线程能执行,对于分布式系统甚至可以考虑用分布式锁
- 后台更新机制:不使用默认的缓存更新机制,后台设定一个独立的更新线程,定时进行缓存更新;需要考虑内存不足导致的缓存失效等问题。总的来说后台更新机制币更新锁机制简单一些
缓存热点
多台缓存服务器的情况下,如果访问量都几种在少数几条数据上,那么这几条数据就是热点数据,它所在的服务器会承受较大的压力