为什么需要缓存在这里就不赘述了,我们来说说多级缓存
从效率角度出发:
一般而言,本地缓存(local cache) 的效率与集中式缓存(redis)的性能可以差4个数量级(0.00001344ms,0.4437ms)
本地缓存(local cache)
优点: local cache有着极大的性能优势(占用内存,容量小,结构简单),单机情况下local cache会有很大效率提升。
缺点: 占用内存,容量小,结构简单,集群环境会出很多问题,如同步,解决方案如ehcache,大致原理是消息多播机制。
集中式缓存
优点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启可再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。同时支持数据的备份,即master-slave模式的数据备份。对敏感性高的数据直接使用集中式缓存,减低复杂度.
缺点: 配置要求高,维护成本高
\
分布式缓存和多级缓存的目的都是为了给数据库减负,写缓存需要一层一层的写,一般而言先写本地缓存再写集中式缓存。
从缓存颗粒角度出发:
页面级别
也叫url级别缓存,将页面手动渲染到存到redis,下次请求直接走redis
对象级别
将处理过的对象存入redis,下次直接从redis中拿
\
缓存更新的方式(针对数据没有变化的数据)
懒加载:读取时写入缓存 。
优点: 实现简单
缺点: 可能导致缓存一次都无法命中,或者雪崩
补充式: 将过期缓存放入队列当中,定期扫描。
优点:异步,对数据库影响相对较小,削平并发的波峰。
缺点:消息一旦积压会造成同步延迟,引入复杂度。
定时器: 定时将数据写入缓存。
优点:保证所有数据最小时间差同步到缓存中,延迟很低。
缺点:需要一个任务调度框架,复杂度提升,且要保证任务的顺序。方案维护成本高。可以使用mq或者其他异步任务调度框架。