Java応用のMemcachedは策略を統一的に使います.

6479 ワード

Java応用のMemcachedは策略を統一的に使います.
simple-spring-memcachedを使ってキャッシュの使用を統一します.
どのように中型JavaアプリケーションでMemcachedを使ってデータをキャッシュするかは簡単な問題ではない.あるキャッシュデータが複数のシステム間で共有され、失効する必要がある場合、エラーがないように統一された計画が必要です.各種の実践を経て、現在システムはMemcachedキャッシュデータを使用して、全部Simple-ing-micachedフレームワークを採用して完成して、そして各システムSpringとCache keyの配置を統一的に計画しています.使用中の注意点について詳しく説明します.
Cache全体計画
現在私達のシステムには二つの異なるMemcachedサーバがあります.
  • session memcachedサーバ:主にユーザのsession
  • を記憶する.
  • app memcachedサーバ:主にアプリケーションデータをキャッシュするための
  • すべてのキャッシュデータを適用してすべてappキャッシュに置いているので、各アプリケーションのキャッシュデータが衝突しないように名前空間を計画しなければなりません.幸いなことに、Simple-pring-micachedはnamespaceの概念をサポートしていますので、各アプリケーションのnamespaceプレフィックスについては次のように規定されています.
    適用
    NAMESPACEプレフィックス
    goodscenter
    goodscenter
    トラック
    トラック
    uic
    uic
    このnamespaceはkeyを生成する時、一番前に置いて、後で詳述する例があります.同じアプリケーションにはキャッシュを必要とするオブジェクトがたくさん存在しますので、namespaceプレフィックスの後にキャッシュオブジェクトのクラス名を加えることを約束します.例は以下の通りです
    適用
    キャッシュオブジェクト
    完全なNAMESPACE
    最終生成のKEY
    トラック
    TcRate(idは42)
    trade:TcRate
    trade:TcRate:12
    goodscenter
    Goods Do(idは42)
    goodscenter:Goods Do
    goodscenter:Goods Do:12
    keyの生成ルール
    Simple-pring-micachedから提供された単一のオブジェクトに対する注釈インターフェースは二つのkey生成方式を提供しています.詳細はこの文を参照してください.
  • AsignCache類の注釈はassignKeyによってcacheのkey
  • を指定します.
  • SingleCache類の注釈は、ParameterValueKeyProvider注釈によってkeyを生成する方法を指定する
  • 第一の要求については、keyが他の競合とはならず、namesapceが規則に適合することを保証しなければならない.第二の場合、キャッシュを約束したデータオブジェクトは、CacheKeyMethodを有するcacheKey方法を実現しなければならない.参考にして以下のように実現する.
        @CacheKeyMethod     public String cacheKey() {         return this.getId();     }
    現在@CacheKeyMethodはSteringに戻る方法だけをサポートしています.Long、Integer型に変換する必要があります.現在はキャッシュキーのジェネレータとして別の方法が必要です.
    実際にMemcachedに保存されたkeyの生成ルールは、namespace:keyである.goodscenterのidが42のdomainオブジェクトGoods Doのように、上記のように生成されるkeyは、goodscenter:Goods Do:42です.
    spring配置説明
    Simple-pring-micachedに関する具体的な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   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            Memcached ,     cacheName    。      ,     default -->             <value>appCache</value>         </property>     </bean> </beans>
    Javaコードで使用説明
    a.注釈の使い方
    直接に注釈を使ってキャッシュ及び失効を処理するのは簡単です.以下は該当例です.
    EventGoods ServiceCientImpl.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);     }
    キャッシュを更新:
    Event Goods DaoImpl.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);     } }
    Event Goods.java
        @CacheKeyMethod     public String getCacheKey() {         return goodsId + CACHE_ID_SEPARATOR + eventId;     }      public static final String CACHE_ID_SEPARATOR = "/";
    上記コードの注意点
  • 複数の方法パラメータがcacheKeyとして機能する場合、ParameterValueKeyProviderはそのorder値
  • を指定しなければならない.
  • 複数の方法パラメータをcacheKeyとする場合、パラメータ間は、/番号分離
  • である.
  • EventGoods DaoImplクラスのudateメソッドパラメータの受信は、一般的なオブジェクトであるため、このクラスにBridge MethodMappingsを配置しなければならない.具体的な構成は例
  • を参照してください.
    b.ベッan方式でCacheオブジェクトを使用する
    いくつかのシーンによっては、より便利に自分で手動でキャッシュデータを管理したいです.この場合は、Simple-pring-micached構成で定義されているbeanを使用する必要があります.上記のプロファイルを例にとって、使用方法は以下のようになります.
    @Autowired private Cache appCache;
    beanの使用:
    appCache.set(Constants.CACHE_KEY + members.getMemberId(), 3600,cacheValue);
    Posted in Java