Redis学习之缓存
前言
在前面的学习中,我们学习了Jedis以及Spring-redis-data的使用,这些内容主要是直接使用Redis作为数据库,接下来,我们从另一个角度来学习Redis,将Redis作为缓存来使用,在使用Redis的场景中,很大一部分就是将Redis作为缓存来使用。
Redis缓存使用
为了操作的方便,这里我们同样采用Spring Boot作为脚手架,你可以直接复用上一小节的项目工程即可。
在Spring中,Spring通过引入声明式缓存的方式来透明地实现缓存,通过几个简单的配置以及注解的使用,就能享受到Spring带来的方便了。
缓存配置
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Bean配置
在上一小节的Bean的基础上,增加一个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
进行通用的配置。
一个简单的演示代码如下,这里为了操作简单,直接构造数据模拟数据库操作了
@Service
// 指定缓存空间的名称
@CacheConfig(cacheNames = "user")
public class UserService {
// 指定对应的键
@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;
}
}
调用对应的操作,然后观察对应的输出以及Redis中的内容就能看到具体的变化啦。
总结
本小节主要学习了将Redis作为缓存来使用,结合Spring Cache,可以看到基本上对应缓存的操作对于开发者来说是透明的,使用起来也非常简单,当然,关于缓存的坑很大,不过我目前还没有深入学习,以后有机会再分享一下,到了这里,关于Redis的学习也暂时告一段落了,当然,告一段落并不是结束。