Redis學(xué)習(xí)之緩存
前言
在前面的學(xué)習(xí)中,我們學(xué)習(xí)了Jedis以及Spring-redis-data的使用,這些內(nèi)容主要是直接使用Redis作為數(shù)據(jù)庫,接下來,我們從另一個角度來學(xué)習(xí)Redis,將Redis作為緩存來使用,在使用Redis的場景中,很大一部分就是將Redis作為緩存來使用。
Redis緩存使用
為了操作的方便,這里我們同樣采用Spring Boot作為腳手架,你可以直接復(fù)用上一小節(jié)的項目工程即可。
在Spring中,Spring通過引入聲明式緩存的方式來透明地實現(xiàn)緩存,通過幾個簡單的配置以及注解的使用,就能享受到Spring帶來的方便了。
緩存配置
引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Bean配置
在上一小節(jié)的Bean的基礎(chǔ)上,增加一個CacheManager的Bean即可,當然,如果直接作為緩存,則有一些Bean是可以不用的
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ZERO)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
.disableCachingNullValues();
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
這里同樣需要注意,2.x跟1.x的配置是不同的,1.x可以直接往RedisCacheManger中注入一個RedisTemplate即可,所以,1.x的方式無需額外配置緩存的序列化器,在2.x中,緩存的序列化器默認使用的jdk序列化器,所以,如果是想使用其他的序列化器,依舊需要自行配置,這里是個大坑。
緩存使用
配置完之后,就可以使用緩存了,首先是開啟緩存功能,在啟動類加上注解@EnableCaching即可
然后是在需要緩存的方法中組合使用
-
@Cacheable,主要用于標注查詢操作,如果鍵匹配,只有第一次會命中 -
@CacheEvit,主要用于標注刪除操作 -
@CachePut,主要用于標注更新跟插入操作,注意,每次都會命中
當然,如果同個類中的多個方法都需要操作,可以在類上使用@CacheConfig進行通用的配置。
一個簡單的演示代碼如下,這里為了操作簡單,直接構(gòu)造數(shù)據(jù)模擬數(shù)據(jù)庫操作了
@Service
// 指定緩存空間的名稱
@CacheConfig(cacheNames = "user")
public class UserService {
// 指定對應(yīng)的鍵
@Cacheable(key = "#p0")
public String queryById(int id) {
System.out.println("in query");
if (id < 10) {
return "less than 10";
}
return "more than 10";
}
@Cacheable(key = "#p0")
public User getUserByName(String username) {
System.out.println("in query " + username);
User user= new User();
if ("xavier".equals(username)) {
user.setName("xavier");
user.setPassword("xavier");
}
if ("xuhuanfeng".equals(username)) {
user.setPassword("xuhuanfeng");
user.setName("xuhuanfeng");
}
return user;
}
@CacheEvict(key = "#p0")
public void deleteUserByName(String username) {
System.out.println("delete " + username);
}
@CachePut(key = "#p0")
public User updateUser(String username) {
System.out.println("in update " + username);
User user= new User();
if ("xavier".equals(username)) {
user.setName("xavier");
user.setPassword("xavier--update");
}
if ("xuhuanfeng".equals(username)) {
user.setPassword("xuhuanfeng");
user.setName("xuhuanfeng--update");
}
return user;
}
}
調(diào)用對應(yīng)的操作,然后觀察對應(yīng)的輸出以及Redis中的內(nèi)容就能看到具體的變化啦。
總結(jié)
本小節(jié)主要學(xué)習(xí)了將Redis作為緩存來使用,結(jié)合Spring Cache,可以看到基本上對應(yīng)緩存的操作對于開發(fā)者來說是透明的,使用起來也非常簡單,當然,關(guān)于緩存的坑很大,不過我目前還沒有深入學(xué)習(xí),以后有機會再分享一下,到了這里,關(guān)于Redis的學(xué)習(xí)也暫時告一段落了,當然,告一段落并不是結(jié)束。