緩存與餅乾,spring mvc使用ehcache

緩存與餅乾,spring mvc使用ehcache

須要用到的jar包

ehcache-2.7.5.jar(主程序)
ehcache-spring-annotations-1.2.0.jar(註解)
guava-r09.jar(依賴)
slf4j-api-1.6.6.jar(依賴)

配置文件

####spring配置中須要添加以下內容 頭部html

xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation
http://www.springframework.org/schema/cache  
http://www.springframework.org/schema/cache/spring-cache-3.2.xsd  

<!-- 緩存配置 -->
<!-- 啓用緩存註解功能(請將其配置在Spring主配置文件中) -->
<cache:annotation-driven cache-manager="cacheManager" />

<!-- Spring本身的基於java.util.concurrent.ConcurrentHashMap實現的緩存管理器(該功能是從Spring3.1開始提供的) -->
<!-- <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> 
	<property name="caches"> <set> <bean name="myCache" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/> 
	</set> </property> </bean> -->

<!-- 若只想使用Spring自身提供的緩存器,則註釋掉下面的兩個關於Ehcache配置的bean,並啓用上面的SimpleCacheManager便可 -->
<!-- Spring提供的基於的Ehcache實現的緩存管理器 -->
<bean id="cacheManagerFactory"
	class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
	<property name="configLocation" value="classpath:ehcache.xml" />
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
	<property name="cacheManager" ref="cacheManagerFactory" />
</bean>

####ehcache.xmljava

<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
       maxElementsInMemory="1000"
       eternal="false"
       timeToIdleSeconds="120"
       timeToLiveSeconds="120"
       overflowToDisk="false"/>
<cache name="myCache"
       maxElementsOnDisk="20000"
       maxElementsInMemory="2000"
       eternal="false"
       overflowToDisk="true"
       diskPersistent="true"/>
<cache name="cacheTest"
       maxElementsOnDisk="20000"
       maxElementsInMemory="2000"
       eternal="false"
       overflowToDisk="true"
       diskPersistent="true"/>
</ehcache>

示例代碼

cache通常用在和數據庫交互的地方servicespring

示例

package com.service;

import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.aft.site.yey.dao.NoticeDao;
import com.aft.site.yey.entity.Notice;
import com.app.jdbc.core.ToolUtil;

/**
 * @author: yangyang 2013年10月21日 
 * @since JDK 1.6
 */
@Service("XXXNoticeService")
public class NoticeService {
    private static Log logger = LogFactory.getLog(NoticeService.class);
    @Resource(name = "XXXNoticeDao")
    private NoticeDao dao;

    /**
     * status = 0 指未刪除
     * */
    @Cacheable(value = "cacheTest",key="'noticelist'")
    public List<Notice> topN(int begin, int end) {
	    LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();
	    orderby.put("publish_time", "desc");
	    Map<String, String> where = new HashMap<String, String>();
	    where.put(dao.STATUS + " = ? ", dao.NORMAL_CODE.toString());
        //TODO:delete
        System.out.println("list:");
	    logger.info("[list ]");
	    return dao.find(where, orderby, begin, end);
    }

    @CacheEvict(value = "cacheTest",key="'noticelist'")
    public void delete(String id) {
        //TODO:delete
        System.out.println("delete:");
	    logger.info("delete ");
	    dao.delete(id, false);
    }

    @CacheEvict(value = "cacheTest", allEntries = true)
    public void save(Notice notice) {
	    notice.setRowid(ToolUtil.getUUID());
	    notice.setStatus(dao.NORMAL_CODE);
	    notice.setPublish_time(new Date());
	    // TODO:yeyid的得到方式
	    notice.setYey_id("123");
	    dao.insert(notice);
        //TODO:delete
        System.out.println("save:");
	    logger.info("save ");
    }

    public Notice get(String id) {
	    return dao.findById(id);
    }

    //@CachePut(value = "cacheTest",key="#notice.getRowid()")
    public void update(Notice notice) {
	    Map<String, String> set = new HashMap<String, String>();
	    LinkedHashMap<String, String> where = new LinkedHashMap<String, String>();
	    set.put("title", notice.getTitle());
	    set.put("author", notice.getAuthor());
	    set.put("content", notice.getContent());
	    where.put(dao.getIdColumnName() + "=?", notice.getRowid());
	    dao.update(set, where);
        System.out.println("update:");
	    logger.info("update ");
    }

}

使用說明

cache主要註解使用:@Cacheable,@CacheEvict,@CachePut數據庫

緩存是這樣的,取值時在方法(A)調用前查一下緩存中是否有目標值,緩存存在的話直接從緩存中拿出再也不去執行方法(A),這也是最基本的*@Cacheable*的概念;apache

緩存中有值須要更新怎麼辦?使用@CacheEvict來更新,這個註解的意思是刪除掉緩存裏面的某個值,從而達到更新緩存的效果。關於緩存更新,例如,取topN個對象,第一次取的時候好比是前1~10個,緩存中存這1~10的一個集合對象,第二次取的時候直接從緩存中拿,這沒問題,如今是這樣的,假設數據庫中刪除了1~10個元素中的任意一個值,這樣數據庫中的topN與緩存中的topN就不一樣步了,下次你在前臺取topN的時候,由於緩存裏面有這個對象,根據以前的介紹(取值時在方法(A)調用前查一下緩存中是否有目標值,緩存存在的話直接從緩存中拿出再也不去執行方法(A)),方法A被略過,查的值不是真正的topN了,所以須要在add或者delete以後刪除掉原來的緩存,保持數據一致。其餘情景請自行考慮。api

根據緩存的特性,如何作到既要保證方法被調用,又但願結果被緩存呢?直接使用*@CachePut*,他與@Cacheable的區別就在與方法是會被執行的。緩存

註解裏面屬性解釋,@Cacheable 與@CachePut同樣, @CacheEvict還有和刪除有關的兩個屬性:mvc

  1. value:緩存的名稱,在spring配置文件中定義,必須指定至少一個app

    • 例如:@Cacheable(value=」mycache」) 或者 @Cacheable(value={」cache1」,」cache2」}
  2. key:緩存的key,(緩存是鍵值對兒)能夠爲空,若是指定要按照 SpEL 表達式編寫,若是不指定,則缺省按照方法的全部參數進行組合spa

    • 例如: @Cacheable(value=」testcache」,key=」#userName」)
    • 使用字符串"'sss'"
    • 調用對象getName方法key=」#userName.getName()」
  3. condition:緩存的條件,能夠爲空,使用SpEL 編寫,返回 true 或者 false,只有爲 true 才進行緩存

    • 例如: @Cacheable(value=」testcache」,condition=」#userName.length()>2」)
  4. allEntries:是否清空全部緩存內容,缺省爲 false,若是指定爲 true,則方法調用後將當即清空全部緩存

    • 例如: @CachEvict(value=」testcache」,allEntries=true)
  5. beforeInvocation:是否在方法執行前就清空,缺省爲 false,若是指定爲 true,則在**方法尚未執行的時候就清空緩存*,缺省狀況下爲false,這樣若是方法執行拋出異常,則不會清空緩存

    • 例如: @CachEvict(value=」testcache」,beforeInvocation=true)

下一步

集羣的同步問題,未完待續。

相關連接

###很是詳細的spring mvc和cache的使用博客 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/

###官網文檔 http://docs.spring.io/spring/docs/3.1.0.M1/spring-framework-reference/html/cache.html

###ehcache介紹 http://my.oschina.net/coolfire368/blog/123377

###spring mvc整合 ehcache http://blog.csdn.net/jadyer/article/details/12257865

相關文章
相關標籤/搜索