1. 依賴JAR文件 spring
Simple-spring-memcached 緩存
2. 配置 ide
Xmemcached.xml是simple-spring-memcached主要的一個配置文件,內部配置: memcached
<aop:aspectj-autoproxy/> google
<bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory"> spa
<property name="cacheClientFactory"> code
<bean class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl"/> orm
</property> xml
<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}"
}
用一個特殊的字符 替換就能夠。