SpringBoot項目中使用redis緩存

1.概述

在應用中有效的利用redis緩存能夠很好的提高系統性能,特別是對於查詢操做,能夠有效的減小數據庫壓力。html

具體的代碼參照該 示例項目java

2.添加引用

在build.gradle加入git

compile('org.springframework.boot:spring-boot-starter-data-redis')

SpringBoot會自動引入redis相關的jar包。加入該引用後,須要在本地安裝redis並啓動,不然程序啓動時會報錯。github

3.經過註解啓用緩存

在SpringBoot中啓用redis緩存很是簡單,只須要在Application主類上添加@EnableCaching註解,以後在須要啓用緩存的查詢方法上添加@Cacheable註解。redis

@SpringBootApplication
@EnableCaching
public class DemoApplication implements CommandLineRunner{
...

查詢接口:spring

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的值是一堆相似於亂碼的東西:spring-boot

"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));
        redisTemplate.setHashValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );
        redisTemplate.setValueSerializer( new GenericJackson2JsonRedisSerializer< 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值具備良好的可讀性,而不是一堆相似於亂碼的數據。

相關文章
相關標籤/搜索