TangYuan使用教程-缓存

假装没事ソ 提交于 2019-12-10 23:03:57

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

8. 缓存


简介

tangyuan框架中本身提供了LocalCache的缓存功能,并整合了一些第三方缓存框架,包括encache、memcache和redis,我们只需要做一些简单的配置即可使用缓存功能;同时tangyuan框架还提供了对用户自定义缓存的支持,在后面内容中将会给大家详细介绍。

在tangyuan中,缓存基本的操作有三个,取数据(get),放数据(put)和清除数据(clean);get就是从缓存容器中获取数据,put就是把数据放入缓存容器中,clean就是根据用户指定的key,清除容器中对应的缓存数据。

8.1 缓存的配置

tangyuan提供了两种功能的缓存配置方式;一种是独立缓存,另一种是缓存组;缓存组其实是多个独立缓存或者缓存组的集合,下面将给出给出具体的配置示例和说明。

1. 独立缓存

示例1:

<cache id="cache1" type="local">
	<property name="strategy" value="time"/>
	<property name="survivalTime" value="10"/>
	<property name="log" value="true"/>
</cache>

说明:

示例1中配置了一个id为cache1的独立缓存,type为local表示这是一个localcache,由tangyuan框架本身提供其功能实现。

Schema设计图:

cache节点属性说明:

属性名 用途及说明 必填 取值
id cache的唯一标识,不可重复 Y 用户定义
type cache的实现类型,这里指的是系统默认实现和整合第三方,如果用户需要使用自定义的缓存实现,可省略此项配置,设置class属性。 N local/ehcache/memcache/redis
class 用户自定义的缓存实现类;需要实现org.xson.tangyuan.cache.ICache接口 N 用户定义
resource 外部缓存配置的资源路径 N 用户定义
default 是否是默认缓存,如果系统中配置多个缓存包括cacheGroup,则只能有一个为默认的 N 用户定义

property节点属性说明:

属性名 用途及说明 必填 取值
name cache配置项的属性名 Y 用户定义
value cache配置项的属性值 Y 用户定义

localCache是tangyuan系统默认的缓存实现,其核心是一个基于Java内存的key/value Cache,其中支持5中缓存策略:

名称 说明
lru 最近最少使用策略
fifo 先进先出策略
soft 软引用策略
weak 弱引用策略
time 有效期策略

A. localCache使用time策略示例:

<cache id="cache1" type="local">
	<property name="strategy" value="time"/>	<!--使用有效期策略-->
	<property name="survivalTime" value="10"/>	<!--有效期时间10秒-->
	<property name="log" value="true"/>			<!--开启命中率日志,需要把日志级别设为debug-->
</cache>

B. localCache使用lru策略示例:

<cache id="cache1" type="local">
	<property name="strategy" value="lru"/>		<!--使用最近最少使用策略-->
	<property name="maxSize" value="1000"/>		<!--缓存容器最大存储数量-->
	<property name="log" value="true"/>			<!--开启命中率日志,需要把日志级别设为debug-->
</cache>

此配置可适用fifo, soft, weak策略。

除了local cache,tangyuan框架还整合了第三方cache,encache、memcache和redis,下面是具体的配置方式:

C. ehcache配置实例:

<cache id="cache1" type="ehcache" resource="ehcache.xml" />

使用ehcache需要通过配置resource属性,加载外部配置文件来进行实例化,ehcache.xml文件内容详见其官方文档。

D. memcached配置实例:

<cache id="cache1" type="memcache">
	<property name="serverlist" value="127.0.0.1:11211"/>
	<property name="weights" value="1"/>
</cache>

property节点中可设置memcached具体的参数,详见memcached Java API官方文档

E. redis配置实例:

<cache id="cache1" type="redis" resource="redis.basic.properties" />

使用redis也需要通过配置resource属性,加载外部配置文件来进行实例化,redis.basic.properties文件内容如下:

JedisMode=BASIC
Jedis.clientName=life_client
Jedis.host=127.0.0.1

Jedis.pool.maxTotal=8
Jedis.pool.maxIdle=8
Jedis.pool.minIdle=2

Jedis.pool.testOnCreate=false
Jedis.pool.testOnBorrow=false
Jedis.pool.testOnReturn=false
Jedis.pool.testWhileIdle=false

Jedis.pool.maxWaitMillis=-1
Jedis.pool.minEvictableIdleTimeMillis=1800000
Jedis.pool.timeBetweenEvictionRunsMillis=-1
Jedis.pool.numTestsPerEvictionRun=3

2. 缓存组

示例2:

<cacheGroup id="cacheGroup">
	<cache ref="cache1"/>
	<cache ref="cache2"/>
</cacheGroup>

说明:

上述示例中定义了一个id为cacheGroup的缓存组,其中引用了之前定义的两个独立缓存cache1cache2组成了一个缓存组。其实缓存组也可以认为是一个独立的缓存,因为从使用方式上来说和独立缓存都是一样的,但也有其不同的功能特点。

    1. 缓存组在put的时候,会put其包含的所有缓存容器。
    1. 缓存组在get的时候,会根据其定义的引用顺序,从缓存容器中get数据,如上述示例,先从cache1中取,如果取到数据就立即返回,否则会继续从cache2中获取数据。
    1. 缓存组在clean的时候,会对cache1和cache2做clean操作。 缓存组的组合一般是本地缓存加上分布式缓存,本地缓存可以通过配置其缓存策略和有效阀值,少量缓存部分数据,分布式缓存可根据应用场景,缓存大量数据,甚至做一些缓存的持久化。

Schema设计图:

cacheGroup节点属性说明:

属性名 用途及说明 必填 取值
id cacheGroup的唯一标识,不可重复。 Y 用户定义
default 是否是默认缓存,如果系统中配置多个缓存包括cacheGroup,则只能有一个为默认的 N 用户定义

cache节点属性说明:

属性名 用途及说明 必填 取值
ref 所引用cache的id Y 用户定义
include 所包含的SQL服务ID,如果用户需要手工指定可设置此项,多个服务可以逗号隔开,支持*匹配,如user.* N 用户定义
exclude 需要排除的SQL服务ID,如果用户需要手工指定可设置此项,多个服务可以逗号隔开,支持*匹配,如user.* N 用户定义

8.2 缓存的使用

tangyuan框架中cache的使用是通过设置SQL服务标签的属性来实现的。例如:

<selectOne id="getUserById" cacheUse="id:cache1; key:${service}; time:1">
	SELECT * from user WHERE user_id = #{user_id}
</selectOne>

和cache相关的属性有两个,cacheUsecacheClean。之前在介绍SQL服务标签的属性的时候经常看到,这里我们来进行详细的说明。

cacheUse属性:表示了SQL服务将使用cache的get和put操作,每次访问SQL服务的时候会先从cache中获取数据,如果取得数据则直接返回,否则将执行SQL服务,并将SQL服务返回的结果放入cache中,然后返回结果。

cacheUse属性示例:

cacheUse="id:cache1; key:user; time:1"
cacheUse="id:cache1; key:yyy.z.${service}.xxx; time:1"
cacheUse="id:cache1; key:a.${service}.z.${args}.{user_id}.zzz; time:1"
cacheUse="id:cache1; key:${service}; time:1"

cacheUse属性的语法格式:id:xxx; key:xxx; time:xxx

属性名 用途及说明 必填 取值
id 所使用的缓存容器的id N 用户定义
key 缓存项key Y 支持特殊的语法定义
time 缓存内容的存活时间,单位秒,如果用户未指定此项,将会使用cache容器的默认设置。 N 用户定义

key语法示例:key:a.${service}.b.${args}.c.{user_id}.d

cacheUse key特殊语法说明:

语法 说明
${service} 此SQL服务的ID
${args} 调用此的请求参数(每次可能不相同);解析的时候会先将其序列化成字符串,然后将得到字符串进行MD5运算,将结果作为key值得一部分。
{user_id} 从调用此的请求参数中获取user_id的值,将其作为key值得一部分。
a/b/c/d 用户自行设置的字符串常量

具体可适用cacheUse属性的SQL服务标签可参考之前的标签属性说明。

8.3 用户自定义缓存的使用

示例:

<cache id="cache1" class="xxx.UserCache" />

说明:

xxx.UserCache需要实现org.xson.tangyuan.cache.ICache接口,如果用户想在定义cache的时候设置一些参数的可使用property节点和resource属性。

到此,本章节的内容就结束了,感兴趣的朋友可以关注TangYuan项目。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!