缓存:
数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。
作用:
降低后端负载
提高读写效率,降低相应时间。
成本:
数据一致性和代码维护成本
缓存更新策略:
1.内存淘汰:
解决内存不足问题,默认开启。一致性较差,维护成本无。
2.超时剔除:
给缓存添加TTL时间,到期自动删除缓存,下次查询自动更新缓存。一致性一般,维护成本低。
3.主动更行:
每当修改数据库的同时,更新缓存。一致性好,维护成本高。
主动更新策略
1.删除缓存还是更新缓存
一般会选择删除缓存。更新数据库时让缓存失效。查询时再更新缓存。
2,如何保证缓存和数据库的同时成功或失败?
单体系统:运用事务
分布式系统:利用TTC等分布式事务方案。
3.先操作缓存还是先操作数据库?(多线程并发)
考虑线程安全,两者都有数据错误的情况。后者发生概率较低。
缓存穿透:
解决方案 : 缓存空对象(实现简单,维护方便/额外的内存消耗,可能造成短期的不一致);
布隆过滤:占用内存少,没有多余Key\实现起来相对复杂,存在误判可能。、
产生原因:
用户请求的数据在缓存和数据库中都不存在,不断发起会给数据库带来巨大压力。
缓存雪崩:
同一时间段有大量的缓存Key同时失效或者Redis服务宕机,导致大量请求到达数据库。
解决方案:设置不同过期时间。 利用Redis集群。给缓存业务添加降级限流。给业务添加多级缓存。
缓存击穿:热点Key问题 ,就是一个被高并发访问且缓存重建业务较复杂的Key失效了,无数的请求访问会瞬间给数据库带来巨大的冲击。
解决方案:
互斥锁:没有额外的内存消耗,保持一致性。实现简单||||||线程需要等待,可能有死锁
逻辑过期:线程无需等待,性能好//不保证一致性,有额外内存需求。实现复杂