spring cache使用

Spring 3.1 引入了基於註釋(annotation)的緩存(cache)技術,它本質上不是一個具體的緩存實現方案(例如 EHCache 或者 OSCache),而是一個對緩存使用的抽象,經過在既有代碼中添加少許它定義的各類 annotation,即可以達到緩存方法的返回對象的效果。redis

服務類中使用@Cacheable

@Service
public class UserService {
	
	@Cacheable(value= {"user-cache"},key="#id")
	public User getUserById(String id) {
		System.out.println("這次沒有使用緩存");
		User user = new User();
		user.setId("12345");
		user.setUserName("sean");
		user.setPassWord("password123");
		return user;
	}
}

@Cacheable(value= {"user-cache"},key="#id")這個註解的意思是當調用這個方法的時候,會從一個名叫 user-cache的緩存中查詢key爲id的值。若是不存在,則執行實際的方法並將結果寫入緩存。若是存就從緩存中讀取,在這裏的緩存中的 key 就是參數 id。spring

因爲本項目配置了redis做爲緩存方案,數據將會被放入redis中存儲。執行該方法以後redis中存儲數據。出現user-cache緩存,keyid爲12345緩存

 

@Cacheable註解使用app

value:指定一個或多個cache名稱,同cacheNames。ide

key:存儲對象的key。ui

除了使用方法參數(#參數名 或 #參數.屬性名 )做爲key,我還能夠使用root對象來生成key。spa

1.spring 默認使用root對象屬性,#root能夠省略code

@Cacheable(value = { "sampleCache" ,"sampleCache2"},key="cache[1].name")

使用當前緩存「sampleCache2」的名稱做爲key。對象

2.自定義key:key = 類名.方法名.參數值  添加字符用單引號blog

@Cacheable(value = { "user-cache"},key="targetClass.getName()+'.'+methodName+'.'+#id")

使用當前被調用的class類名+被調用方法名+參數id拼接以後作key值。

 

3.除了使用key指定外,Spring還提供了org.springframework.cache.interceptor.KeyGenerator接口,使用keyGenerator去指定實現此接口的bean的名字。

@Cacheable(cacheNames="sampleCache", keyGenerator="myKeyGenerator")

4.condition : 指定發生條件

@Cacheable(condition="#id >5")  //參數id 大於5時加入緩存

cache配置類

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

	@Bean
	public KeyGenerator keyGenerator() {
		return new KeyGenerator() {

			@Override
			public Object generate(Object target, Method method, Object... params) {
				StringBuilder sb = new StringBuilder();
				sb.append(target.getClass().getName());
				sb.append(method.getName());
				for (Object object : params) {
					sb.append(object.toString());
				}

				return sb.toString();
			}
		};
	}
}

@EnableCaching註解是spring framework中的註解驅動的緩存管理功能。自spring版本3.1起加入了該註解。若是你使用了這個註解,那麼你就不須要在XML文件中配置cache manager了,等價於 <cache:annotation-driven/> 。可以在服務類方法上標註@Cacheable。

使用keyGenerator設置key值

@Cacheable(value= {"login-user-cache"},keyGenerator="keyGenerator")
	public User getUserByName(String userName) {
		System.out.println("這次沒有使用緩存");
		User user = new User();
		user.setId("12346");
		user.setUserName("jiafeng");
		user.setPassWord("password123");
		return user;
		
	}

執行該方法以後緩存內容按照keyGenerator定義的規則生成key值。

相關文章
相關標籤/搜索