在应用中有效的利用redis缓存能够很好的提高系统性能,特别是对于查询操做,能够有效的减小数据库压力。html
具体的代码参照该 示例项目java
在build.gradle加入git
compile('org.springframework.boot:spring-boot-starter-data-redis')
SpringBoot会自动引入redis相关的jar包。加入该引用后,须要在本地安装redis并启动,不然程序启动时会报错。github
在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的美观程度不介意的话,工做到此就结束了。运维
执行咱们的程序之后,在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中。
在SpringBoot中启用redis缓存很是简单,只须要加几个注解便可。同时咱们能够经过增长缓存配置的方式,让存储到redis中的key值具备良好的可读性,而不是一堆相似于乱码的数据。