【推荐】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
的缓存组,其中引用了之前定义的两个独立缓存cache1
和cache2
组成了一个缓存组。其实缓存组也可以认为是一个独立的缓存,因为从使用方式上来说和独立缓存都是一样的,但也有其不同的功能特点。
-
- 缓存组在put的时候,会put其包含的所有缓存容器。
-
- 缓存组在get的时候,会根据其定义的引用顺序,从缓存容器中get数据,如上述示例,先从cache1中取,如果取到数据就立即返回,否则会继续从cache2中获取数据。
-
- 缓存组在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相关的属性有两个,cacheUse
和cacheClean
。之前在介绍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项目。
- QQ群:518522232 *请备注关注的项目
- 邮箱:xson_org@126.com
- 项目地址: https://github.com/xsonorg/tangyuan
来源:oschina
链接:https://my.oschina.net/u/1987015/blog/807756