二级缓存的方式
Posted 二周目Solo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二级缓存的方式相关的知识,希望对你有一定的参考价值。
一:redis+mysql
使用redis作为集中式缓存,可以同时为多节点提供服务。
但是由于大量的数据通过缓存读取,导致缓存服务压力非常大。经常出现:怎么服务又挂了?这时候,我们不得不多个redis搭建集群,进行流量分摊,但有可能你的缓存数据量其实不大,仅仅是吞吐量大。
根据cache aside pattern规则:
数据读取:先读redis,再读mysql;如果cache hit,直接返回数据;如果cache miss,访问db,再把数据重置回缓存,这里应该没什么问题。
数据更新:
淘汰缓存,而不是更新缓存
先操作数据库,再淘汰缓存
先说下为什么是淘汰缓存,而不是更新缓存?
比如小圆项目,如果再更新缓存的同时,出现了并发写的情况,会导致数据对象不一致(比如两个事务同时在更新user的等级和user的经验)。
那为什么先操作数据库,而不是先操作缓存呢?
如果事务A先淘汰缓存,那么同一个时刻另一个事务B在读取缓存对象数据,结果肯定是没有读取到内容,这时候只能读取数据库,数据重置回缓存。此时事务A再更新数据库,导致缓存与数据库内容不一致。
cache aside pattern也有问题,比如在数据库更新完成后,但是缓存淘汰却失败了(比如连接超时等),这时候缓存与数据库内容不一致。但是这种情况比较少见。
二:本地内存(Ehcache等)+redis+mysql
借鉴cache aside pattern的数据读写方式,引入jvm 二级缓存(也就是内存),减少redis等分布式缓存的负载,这里简单介绍下这种二级缓存的方式。
数据读取的方式:
数据更新的方式:
以上是关于二级缓存的方式的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓