<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    使用simple-spring-memcached統(tǒng)一緩存的使用

    如何在一個中型的Java應(yīng)用中使用Memcached緩存數(shù)據(jù)不是個簡單的問題。當(dāng)某個緩存數(shù)據(jù)需要在多個系統(tǒng)間共享和失效時,必須要有統(tǒng)一的規(guī)劃才能保證不出錯。經(jīng)過各種實踐,目前系統(tǒng)在使用Memcached緩存數(shù)據(jù)全部采用Simple-Spring-Memcached框架來完成,并統(tǒng)一規(guī)劃各系統(tǒng)Spring和Cache key的配置。
    下面對在使用過程中需要注意的點做一個詳細(xì)說明:

    Cache整體規(guī)劃

    目前我們系統(tǒng)中有兩個不同的Memcached服務(wù)器:

    1. session memcached服務(wù)器:主要存儲用戶的session
    2. app memcached服務(wù)器: 主要用于緩存應(yīng)用數(shù)據(jù)

    由于應(yīng)用所有的緩存數(shù)據(jù)都放在app緩存上,為避免各應(yīng)用的緩存數(shù)據(jù)出現(xiàn)沖突,必須規(guī)劃好它們的命名空間。所幸Simple-Spring-Memcached支持namespace的概念,因此對各應(yīng)用的namespace前綴規(guī)定如下:

    應(yīng)用NAMESPACE前綴
    goodscentergoodscenter
    tradetrade
    uicuic

    這個namespace在生成key時,將放在最前面,稍后會有例子詳述。
    同一個應(yīng)用中存在許多需要緩存的對象,因此約定namespace前綴之后再加上緩存對象的類名。
    例子如下:

    應(yīng)用緩存對象完整的NAMESPACE最終生成的KEY
    tradeTcRate (id為42)trade:TcRatetrade:TcRate:12
    goodscenterGoodsDo(id為42)goodscenter:GoodsDogoodscenter:GoodsDo:12

    key的生成規(guī)則

    Simple-Spring-Memcached提供的針對單個對象的注解接口提供了兩種key生成方式,詳情見此文

    1. AssignCache類注解通過assignKey指定cache的key
    2. SingleCache類注解通過ParameterValueKeyProvider注解指定生成key的方法

    對于第一種只要求必須保證key不與其它的沖突,且namesapce符合規(guī)則。
    第二種時,約定緩存的數(shù)據(jù)對象必須實現(xiàn)有帶CacheKeyMethod的cacheKey方法,參考實現(xiàn)如下:

        @CacheKeyMethod     public String cacheKey() {         return this.getId();     }
    目前@CacheKeyMethod只支持返回String的方法,需要改造成可接受Long,Integer型的。當(dāng)前必須有單獨的方法來作為緩存Key的生成器
    真實存放到Memcached的key的生成規(guī)則是:namespace:key。
    如goodscenter的id為42的domain對象GoodsDo,按上述方式生成的key為:goodscenter:GoodsDo:42

    spring配置說明

    關(guān)于Simple-Spring-Memcached具體XML配置如下:

    <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"        xmlns:context="http://www.springframework.org/schema/context"        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">      <import resource="classpath:simplesm-context.xml"/>      <aop:aspectj -autoproxy/>     <context:annotation -config/>      <bean name="appCache" 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">                 <!--memcached服務(wù)器ip:port 可以是多個,格式為: 127.0.0.1:11211,192.168.100.11:11211-->                 <property name="address" value="{memcached.server}"/>             </bean>         </property>         <property name="configuration">             <!-- memcached連接器的配置,具體的配置項參考這個類 -->             <bean class="com.google.code.ssm.providers.XMemcachedConfiguration">                 <!--是否使用一致性哈希-->                 <property name="consistentHashing" value="true"/>                 <!--連接池-->                 <property name="connectionPoolSize" value="10"/>                 <property name="optimizeGet" value="true"/>              </bean>         </property>         <property name="cacheName">             <!-- 該Memcached配置的Cache名稱 一個應(yīng)用中存在多個Memcached時,各個配置的cacheName必須不同。如果該值未設(shè),系統(tǒng)默認(rèn)為default -->             <value>appCache</value>         </property>     </bean> </beans>

    Java代碼中使用說明

    a. 注解方式使用

    直接使用注解來處理緩存及失效非常簡單,下面是相應(yīng)的例子:
    讀取緩存:

    EventGoodsServiceClientImpl.java
        @Override     @ReadThroughSingleCache(namespace = "goodscenter:EventGoodsDo", expiration = 60)     @CacheName("appCache")     public EventGoodsDo queryEventGoodsDo(@ParameterValueKeyProvider(order = 0) long goodsId, @ParameterValueKeyProvider(order = 1) long eventId) {         return getRemoteServiceBean().queryEventGoodsDo(goodsId, eventId);     }

    更新緩存:

    EventGoodsDaoImpl.java
    @BridgeMethodMappings(value = {@BridgeMethodMapping(erasedParamTypes ={Object.class},targetParamTypes = {com.hqb360.promotion.dao.entity.EventGoods.class},methodName = "update")}) public class EventGoodsDaoImpl&lt;EventGoods&gt; extends BaseDaoImpl&lt;EventGoods&gt; implements EventGoodsDao&lt;EventGoods&gt; {      @Override     public DaoStatementName getDaoStatementName() {         return new DefaultDaoStatementName() {             public String getDomainName() {                 return "EventGoods";             }         };     }      @Override     @InvalidateSingleCache(namespace = "goodscenter:EventGoodsDo")     @CacheName("appCache")     public void update(@ParameterValueKeyProvider EventGoods obj) throws DataAccessException {         super.update(obj);     } }
    EventGoods.java
        @CacheKeyMethod     public String getCacheKey() {         return goodsId + CACHE_ID_SEPARATOR + eventId;     }      public static final String CACHE_ID_SEPARATOR = "/";
    上述代碼需要注意的點
    1. 多個方法參數(shù)都作為cacheKey時,ParameterValueKeyProvider必須指明其order值
    2. 多個方法參數(shù)作為cacheKey時,參數(shù)之間在 / 號分隔
    3. EventGoodsDaoImpl類中的update方法參數(shù)接收的是一個泛型對象,因此必須在該類上配置BridgeMethodMappings。具體配置見示例

    b. 以bean的方式使用Cache對象

    某些場景我們希望更便捷地自己手動來管理緩存數(shù)據(jù),此時需要使用Simple-Spring-Memcached配置中定義的bean。以上面的配置文件為例,使用方法如下
    bean的注入:

    @Autowired private Cache appCache;

    bean的使用:

    appCache.set(Constants.CACHE_KEY + members.getMemberId(), 3600,cacheValue);

    Posted in Java

     

    posted on 2013-04-03 18:45 abin 閱讀(3744) 評論(0)  編輯  收藏 所屬分類: memcache
    主站蜘蛛池模板: 亚洲人成电影在线观看青青| 国产在线观看免费完整版中文版| 亚洲精品夜夜夜妓女网| 色网站在线免费观看| 免费在线观看亚洲| 一区二区三区AV高清免费波多| 国产精品免费看香蕉| 美女被免费网站在线视频免费| 啦啦啦手机完整免费高清观看| 亚洲老熟女五十路老熟女bbw | 久久精品电影免费动漫| 亚洲VA中文字幕无码一二三区 | 波多野结衣免费在线| 亚洲国产成人手机在线电影bd| 亚洲性线免费观看视频成熟 | 亚洲无删减国产精品一区| 18女人腿打开无遮掩免费| 亚洲国产成+人+综合| 最新中文字幕免费视频| 午夜亚洲国产理论片二级港台二级 | 亚洲成av人影院| 精品无码国产污污污免费网站 | 天天摸夜夜摸成人免费视频| 国产日本亚洲一区二区三区| 国产男女猛烈无遮挡免费视频 | 最近中文字幕无吗免费高清| 久久精品国产亚洲AV| 国产亚洲自拍一区| 嘿嘿嘿视频免费网站在线观看| 亚洲精品理论电影在线观看| 亚洲一本大道无码av天堂| 亚洲视频在线观看免费| 亚洲乱理伦片在线观看中字| 国产亚洲精品看片在线观看 | 亚洲伦理一区二区| 女人张腿给男人桶视频免费版 | 亚洲午夜无码片在线观看影院猛 | 亚洲日产乱码一二三区别 | 久久精品亚洲精品国产色婷| 成人性生活免费视频| 岛国精品一区免费视频在线观看|