1. Redis
1.1 基于Redis的Spring Cache
1.1.1 使用步驟:
(1). 導(dǎo)入pom依賴:
< dependency> < groupId>org.springframework.boot</groupId> < artifactId>spring-boot-starter-cache</artifactId> < /dependency>(2). 創(chuàng)建RedisTemplate 并添加RedisSerializer序列化
@Bean(name = "redisTemplate1")
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate();
//設(shè)置序列化Key的實(shí)例化對(duì)象
redisTemplate.setKeySerializer(new GenericJackson2JsonRedisSerializer());
//設(shè)置序列化Value的實(shí)例化對(duì)象
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
(3). 創(chuàng)建CacheManager緩存管理器
@EnableCaching
@Configuration
public class CachingConfig extends CachingConfigurerSupport {
@Bean
public CacheManager cacheManager(@Qualifier("redisTemplate1") RedisTemplate<Object, Object> redisTemplate) {
RedisCacheManager manager = new RedisCacheManager(redisTemplate);
manager.setUsePrefix(true);
// 整體緩存過(guò)期時(shí)間,即所有緩存的時(shí)間為3600s,會(huì)被緩存自己的緩存時(shí)間覆蓋,如下stu緩存的過(guò)期時(shí)間為1000s
manager.setDefaultExpiration(3600L);
// 設(shè)置緩存過(guò)期時(shí)間。key和緩存過(guò)期時(shí)間,單位秒,在@Cacheable注解中使用的value指的是要使用的緩存的名字
Map<String, Long> expiresMap = new HashMap<>();
expiresMap.put("stu", 1000L);//設(shè)置stu緩存的過(guò)期時(shí)間為1000s
manager.setExpires(expiresMap);
return manager;
}
}
***(4). 在緩存對(duì)象的方法前添加注解 ***
1.1 @Cacheable:在方法執(zhí)行前Spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù),若沒(méi)有數(shù)據(jù),調(diào)用方法并將方法返回值放進(jìn)緩存;
1.2 @CachePut:無(wú)論怎樣都會(huì)將方法的返回值放進(jìn)緩存中;@Cacheable與@CachePut的屬性保持一致;
1.3 @CacheEvict:將一條或多條數(shù)據(jù)從緩存中刪除;
代碼示例:(注:如果沒(méi)有指定key則將方法參數(shù)作為key保存到緩存中)
public interface StudentService {
//@CachePut緩存新增或更新的數(shù)據(jù)到緩存,其中緩存的名字叫“stucache”,數(shù)據(jù)的key是newStudnet的id
@CachePut(value = "stucache", key = "#newStudnet.id")
Student save(Student newStudnet);
//@CacheEvict從緩存“stucache”中刪除id為deid的數(shù)據(jù)
@CacheEvict(value = "stucache")
boolean delete(long deid);
//緩存key為id的數(shù)據(jù)到緩存“stucache”中;
@Cacheable(value = "stucache", key = "#p0")
Student queryOneStudentById(long id);
@CachePut(value = "stucache", key = "#updaStudent.id")
Student updateStudent(Student updaStudent);
}
(5). 在啟動(dòng)類前面添加@EnableCaching注解開啟緩存
1.1.2 遇到過(guò)的問(wèn)題
(1). 存儲(chǔ)對(duì)象序列化問(wèn)題
問(wèn)題描述:
①所有字符都是以16進(jìn)制顯示的問(wèn)題
②中文字符以16進(jìn)制顯示的問(wèn)題
解決辦法:
①通過(guò)redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()),和redisTemplate.setKeySerializer(new GenericJackson2JsonRedisSerializer());設(shè)置key-value序列化
②只需要在終端開啟redis客戶端的時(shí)候添加--raw(兩個(gè)中杠)可將中文正確顯示;這是客戶端的原因和服務(wù)沒(méi)關(guān)系;