二级缓存的方式

Posted 二周目Solo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二级缓存的方式相关的知识,希望对你有一定的参考价值。

一:redis+mysql

使用redis作为集中式缓存,可以同时为多节点提供服务。

但是由于大量的数据通过缓存读取,导致缓存服务压力非常大。经常出现:怎么服务又挂了?这时候,我们不得不多个redis搭建集群,进行流量分摊,但有可能你的缓存数据量其实不大,仅仅是吞吐量大。


根据cache aside pattern规则:

  1. 数据读取:先读redis,再读mysql;如果cache hit,直接返回数据;如果cache miss,访问db,再把数据重置回缓存,这里应该没什么问题。

  2. 数据更新:

    1. 淘汰缓存,而不是更新缓存

    2. 先操作数据库,再淘汰缓存


先说下为什么是淘汰缓存,而不是更新缓存?

比如小圆项目,如果再更新缓存的同时,出现了并发写的情况,会导致数据对象不一致(比如两个事务同时在更新user的等级和user的经验)。


那为什么先操作数据库,而不是先操作缓存呢?

如果事务A先淘汰缓存,那么同一个时刻另一个事务B在读取缓存对象数据,结果肯定是没有读取到内容,这时候只能读取数据库,数据重置回缓存。此时事务A再更新数据库,导致缓存与数据库内容不一致。


cache aside pattern也有问题,比如在数据库更新完成后,但是缓存淘汰却失败了(比如连接超时等),这时候缓存与数据库内容不一致。但是这种情况比较少见。


二:本地内存(Ehcache等)+redis+mysql

借鉴cache aside pattern的数据读写方式,引入jvm 二级缓存(也就是内存),减少redis等分布式缓存的负载,这里简单介绍下这种二级缓存的方式。


数据读取的方式:


数据更新的方式:


以上是关于二级缓存的方式的主要内容,如果未能解决你的问题,请参考以下文章

mybatis结合redis实战二级缓存

Mybatis基于注解开启使用二级缓存

hibernate二级缓存,ehcache.xml文件在哪

hibernate 一级缓存,二级缓存,查询缓存

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓

深入了解MyBatis二级缓存