TangYuan使用教程-缓存

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设计图:

图片1

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设计图:

图片1

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项目。

转载于:https://my.oschina.net/xson/blog/807756

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值