什么是分布式缓存
为了提高系统的并发性能,通常会对系统进行分布式部署(如集群部署方式)
如上图,服务器1上的mybatis的二级缓存位于服务器1上,服务器2上的mybatis的二级缓存位于服务器2上。
所以如果不使用分布式缓存,缓存的数据就会在各个服务器上单独存储,因此,需要使用分布式缓存工具对缓存数据进行集中管理。
mybatis无法实现分布式缓存,所以需要和第三方分布式缓存框架进行整合,如redis, memcached, ehcache等。
即使抛开分布式缓存,就普通缓存来说,mybatis也不是专业做缓存的。缓存数据是在内存中存储的,缓存工具需要对数据进行一些压缩处理,或安全的编码处理等,mybatis只是简单地把数据存到内存中了。
整合方法
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,可以通过实现cache接口进行开发。 比如 mybatis 和 ehcache 的整合包中就提供了一个cache接口的实现类。
如果要将mybatis和redis进行整合,就需要考虑如何实现这个cache接口,然后在接口内部去操作redis的数据结构。
getId(), 即获取cache的唯一标识,即key值
putObject(key, value),向缓存中写入数据,value是select查询出来的结果集
getObject(key) , 根据key值,从缓存中取出value
mybatis的一级缓存和二级缓存都是以HashMap结构存储的。
PerpetualCache是mybatis默认实现的Cache类,可以仿照这个写cache实现类。
在相应的mapper.xml配置文件中,配置该mapper的二级缓存:
mybatis整合ehcache
- 加入ehcache包
- 在相应的mapper.xml配置文件中进行配置,将cache标签的type属性设置成Ehcache对mybatis的Cache接口的实现类型 EhcacheCache
- 加入ehcache的配置文件
在classpath下创建ehcache.xml配置文件,配置如下内容:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)