1. 依赖JAR文件
Simple-spring-memcached
2. 配置
Xmemcached.xml是simple-spring-memcached主要的一个配置文件,内部配置:
<aop:aspectj-autoproxy/>
<bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory">
<property name="cacheClientFactory">
<bean class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl"/>
</property>
<property name="addressProvider">
<bean class="com.google.code.ssm.config.DefaultAddressProvider">
<property name="address" value="127.0.0.1:11211"/>
</bean>
</property>
<property name="configuration">
<bean class="com.google.code.ssm.providers.CacheConfiguration">
<property name="consistentHashing" value="true"/>
</bean>
</property>
</bean>
注意:127.0.0.1是memcached服务的IP,111211是memcached的所属端口。其他配置不允许改动,否则不能实现缓存的效果。
Spring-context.xml内部配置:
<import resource="simplesm-context.xml" />
<import resource="xmemcached.xml"/>
第一个import是导入simple-spring-memcached的核心配置文件;第二个import是导入xmemcached的配置文件。
3. spring注解
该memcached服务缓存适合不经常发生变化但有不经常改动的数据进行注解,主要适合在service层进行做缓存。
注解适合的方法有:查询、修改、删除。
注解的方式有很多,有兴趣的同事可以去网上多了解。
l 查询方法注解方式
查询方式的注解适合返回值为map、list、object,void的不允许加入缓存注解,
A.带参数的方法:A和B属性在对象内部要注解为CacheKeyMethod(见下文)
@Override
@ReadThroughSingleCache(namespace = namespaceName +":getUser",expiration = expirationTime)
public List<UserInfo> getUser(
@ParameterValueKeyProvider(order = 0) String A,
@ParameterValueKeyProvider(order = 1) String B){
}
Memcached将数据放入内存采用的是key和value的方式放入到内存的,ParameterValueKeyProvider表示是要放入内存的key值,order表示参数的顺序,namespace表示缓存的空间名称,expiration表示放入内存的时间,单位是秒,如果过期对象会自动释移除掉,过期时间要根据实际业务情况进行设置。建议:将Assignedkey的值设置为要进行注解的方法名,namespace设置为自己开发模块的名称。
如:getUser是我要注解的方法
B.不带参数的方法:
@ReadThroughAssignCache(namespace = "getUser" , expiration = 3000)
public List<UserInfo> getUser(){
return list;
}
失效缓存的注解
该方要求查询时将对象放入缓存,但是在该对象的删除、修改,添加方方法上一定要加下面注解
注意:UserInfo 的A 和B 两个参数(即作为缓存key的属性)一定要赋值,否则不触发。
@Override
@InvalidateSingleCache(namespace = namespaceName +":getUser")
public ProcessStatus updateUserInfo(@ParameterValueKeyProvider UserInfo userInfo) throws Exception {
}
UserInfo 对象 内部
public class UserInfo implements Serializable{
private static final long serialVersionUID = -9169068112746565872L;
private String A;
private String B;
private String C;
private String D;
private String E;
private String F;
private String G;
private Timestamp H;
private Timestamp J;
@CacheKeyMethod
public String cacheKey() {
return A+ "/" + B;
}
多个属性 作为key 的时候中间用 "/" 隔开。
第一次用 Simple-spring-memcached ,在用的过程中 出现一种情况会报错,当作为缓存key的属性A 和 B实际有一个可以为空(null),但是memcached 会报错,好像错误名大概是 ”The argument passed into * at index * is null“
最后的解决办法是将源码中的代码修改一下,让 memcached 支持null .
com\google\code\ssm\util 包下有个Utils 类
public static Object getMethodArg(int index, Object[] args, String methodDesc)
{
if (index < 0) {
throw new InvalidParameterException(String.format("An index of %s is invalid", new Object[] { Integer.valueOf(index) }));
}
if (args.length <= index) {
throw new InvalidParameterException(String.format("An index of %s is too big for the number of arguments in [%s]", new Object[] { Integer.valueOf(index), methodDesc }));
}
Object indexObject = args[index];
if (indexObject == null) {
throw new InvalidParameterException(String.format("The argument passed into [%s] at index %s is null.", new Object[] { methodDesc, Integer.valueOf(index) }));
}
return indexObject;
}
将红色部分 改为
if (indexObject == null) {
indexObject ="${null}"
}
用一个特殊的字符 替换就可以。