SpringBoot專案中使用redis快取
1.概述
在應用中有效的利用redis快取可以很好的提升系統性能,特別是對於查詢操作,可以有效的減少資料庫壓力。
具體的程式碼參照該 示例專案
2.新增引用
在build.gradle加入
compile('org.springframework.boot:spring-boot-starter-data-redis')
SpringBoot會自動引入redis相關的jar包。加入該引用後,需要在本地安裝redis並啟動,否則程式啟動時會報錯。
3.通過註解啟用快取
在SpringBoot中啟用redis非常簡單,只需要在Application主類上新增@EnableCaching
@Cacheable
註解。
@SpringBootApplication
@EnableCaching
public class DemoApplication implements CommandLineRunner{
...
查詢介面:
public interface TestRepository extends JpaRepository<Test, Integer> {
@Cacheable(value = "testCache")
public Test findOne(Integer id);
}
實體類需要實現Serializable介面,否則程式會報錯,因為無法把java物件序列化到redis中。SpringBoot中redis預設使用DefaultSerializer,這個用的是jdk自身的序列化方法。
總共有以下幾種序列化方法,具體的使用場景可以參考官方文件
1. GenericJackson2JsonRedisSerializer
2. GenericToStringSerializer
3. Jackson2JsonRedisSerializer
4. JacksonJsonRedisSerializer
5. JdkSerializationRedisSerializer
6. OxmSerializer
7. StringRedisSerializer
至此我們的程式就具有了從redis快取中查詢資料的能力,如果對redis中儲存的KEY的美觀程度不介意的話,工作到此就結束了。
4.美觀的KEY
執行我們的程式以後,在redis-cli中執行KEY *
命令,會發現key的值是一堆類似於亂碼的東西:
"testCache:\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x01"
這中key值對於redis的運維人員來說估計是不可接受的,我們要想辦法讓key值變的好看一些,至少要讓人能看得懂。
出現上面的key值的原因就是spring中預設採用了SimpleKey這個類來生成redis的key。
解決方法也很簡單,增加快取配置,指定redis生成key的方式:
@Configuration
public class CacheConfig extends CachingConfigurerSupport {
@Autowired
private RedisTemplate redisTemplate;
@Bean
public CacheManager cacheManager() {
redisTemplate.setKeySerializer(new GenericToStringSerializer<Object>(Object.class));
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
cacheManager.setDefaultExpiration(3600);
cacheManager.setUsePrefix(true);
cacheManager.setCachePrefix(new RedisCachePrefix() {
private final RedisSerializer<String> serializer = new StringRedisSerializer();
private final String delimiter = ":";
public byte[] prefix(String cacheName) {
return this.serializer
.serialize(cacheName.concat(this.delimiter));
}
});
return cacheManager;
}
}
其中
redisTemplate.setKeySerializer(new GenericToStringSerializer<Object>(Object.class));
這行程式碼指定了redis中key值的生成方式,GenericToStringSerializer
這個序列化方法會把java物件轉換為字串儲存到redis中。
5.總結
在SpringBoot中啟用redis快取非常簡單,只需要加幾個註解即可。同時我們可以通過增加快取配置的方式,讓儲存到redis中的key值具有良好的可讀性,而不是一堆類似於亂碼的資料。