mybatis整合分布式缓存框架

什么是分布式缓存

为了提高系统的并发性能,通常会对系统进行分布式部署(如集群部署方式)
在这里插入图片描述
如上图,服务器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

  1. 加入ehcache包
    在这里插入图片描述
  2. 在相应的mapper.xml配置文件中进行配置,将cache标签的type属性设置成Ehcache对mybatis的Cache接口的实现类型 EhcacheCache
    在这里插入图片描述
  3. 加入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(先进先出)

猜你喜欢

转载自blog.csdn.net/u010888864/article/details/83988439