在Spring中經過獲取MemCachedClient來實現與memcached服務器進行數據讀取的方式。不過,在實際開發中,咱們每每是經過Spring的@Cacheable來實現數據的緩存的,因此,本文給你們詳細介紹一下@Cacheable的用法。首先,在使用@Cacheable以前,咱們要作好準備工做。java
第一步:要導入相應的jar包。
<classpathentry kind="lib" path="lib/spring-core-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-cache-1.0.10.jar"/>
<classpathentry kind="lib" path="lib/spring-context-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-beans-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
<classpathentry kind="lib" path="lib/log4j-1.2.17.jar"/>
<classpathentry kind="lib" path="lib/spring-expression-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/java_memcached-release_2.0.1.jar"/>
<classpathentry kind="lib" path="lib/spring-aop-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-aspects-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-context-support-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-tx-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="lib/ognl-3.0.6.jar"/>
<classpathentry kind="lib" path="lib/trafficCounter-1.0.2.jar"/>
<classpathentry kind="lib" path="lib/aspectjweaver-1.8.4.jar"/>
<classpathentry kind="lib" path="lib/javassist-3.11.0.GA.jar"/>spring
第二步: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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 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-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
第三步:添加自動掃描功能。express
<context:component-scan base-package="service" /> <aop:config proxy-target-class="true"/>
第四步:增長緩存管理類。緩存
<bean id="memCacheProvider" class="com.springcache.memcache.MemCacheProvider"> <property name="memCache" ref="memCacheClient"/> </bean> <bean id="cacheManager" class="com.springcache.CacheManager"> <property name="elParserName" value="ognl"/> <property name="cacheProviders"> <map> <entry key="remote" value-ref="memCacheProvider"></entry> </map> </property> </bean>
第五步:創建一個測試類。服務器
package service;
import org.springframework.stereotype.Service;
import com.springcache.annotation.Cacheable;
@Service
@Cacheable
public class MemcachedService {
@Cacheable(name = "remote", key = "'USER_NAME_'+#args[0]", expire = 60 )
public String storeUserName(String accountId, String name)
{
return name;
}
@Cacheable(name = "remote", expire = 60)
public String storeUserAddress(String accountId, String address)
{
return address;
}
}
@Cacheable支持以下幾個參數:
key:緩存的key,默認爲空,既表示使用方法的參數類型及參數值做爲key,支持SpEL。例如:memCachedService.storeUserAddress("user", "BeiJing");
因此對應的key爲:service.MemcachedService-storeUserAddress_user_BeiJing
name:存儲位置。在原本中remote表示使用memcached服務器。
condition:觸發條件,只有知足條件的狀況纔會加入緩存,默認爲空,既表示所有都加入緩存,支持SpEL。
expire:過時時間,單位爲秒。多線程
第六 擴展:使用Spring4.3解決緩存過時後多線程併發訪問數據庫的問題併發
緩存過時以後,若是多個線程同時請求對某個數據的訪問,會同時去到數據庫,致使數據庫瞬間負荷增高。Spring4.3爲@Cacheable註解提供了一個新的參數「sync」(boolean類型,缺省爲false),ide
當設置它爲true時,只有一個線程的請求會去到數據庫,其餘線程都會等待直到緩存可用。這個設置能夠減小對數據庫的瞬間併發訪問。memcached
不過不必定全部的緩存系統都支持這個配置。通過驗證,Guava Cache是支持的 參考:http://blog.csdn.net/clementad/article/details/51250472
@Service public class UserServiceCacheablesImpl implements UserServiceCacheables{ private final static Logger logger = LoggerFactory.getLogger(UserServiceCacheablesImpl.class); @Autowired UserDAO userDAO; @Override @Cacheable(value="getPhoneNoByUserId", sync=true) public String getPhoneNoByUserId(int userId) { logger.debug("getting data from database, userId={}", userId); return userDAO.getPhoneNoByUserId(userId); } }
最後總結一下:當執行到一個被@Cacheable註解的方法時,Spring首先檢查condition條件是否知足,若是不知足,執行方法,返回;若是知足,在name所命名的緩存空間中查找使用key存儲的對象,若是找到,將找到的結果返回,若是沒有找到執行方法,將方法的返回值以key-value對象的方式存入name緩存中,而後方法返回。