Simple-spring-memcached 緩存的應用

1. 依賴JAR文件 spring

 

Simple-spring-memcached  緩存

2. 配置 ide

Xmemcached.xmlsimple-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.1memcached服務的IP111211memcached的所屬端口。其餘配置不容許改動,不然不能實現緩存的效果。


Spring-context.xml內部配置:
<import resource="simplesm-context.xml" />

<import resource="xmemcached.xml"/>

第一個import是導入simple-spring-memcached的核心配置文件;第二個import是導入xmemcached的配置文件。

3. spring註解

memcached服務緩存適合不常常發生變化但有不常常改動的數據進行註解,主要適合在service層進行作緩存。

註解適合的方法有:查詢、修改、刪除。

註解的方式有不少,有興趣的同事能夠去網上多瞭解。

l 查詢方法註解方式

查詢方式的註解適合返回值爲maplistobjectvoid的不容許加入緩存註解,

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將數據放入內存採用的是keyvalue的方式放入到內存的,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}"
    }

用一個特殊的字符 替換就能夠。

相關文章
相關標籤/搜索