项目源码
CentOS上下载redis
1.使用docker命令在docker hub上下载redis,不写版本号默认时最新版
docker pull redis
2.使用命令运行redis,其中-d代表后台运行 ,-p指定端口映射,–name 对redis重命名,后面的数字代表镜像id
docker run -d -p 6379:6379 --name myredis 235592615444
3.这时候redis已经正式启动下一步正式开始编码,为了更加直观的展示效果,我使用了可视化的客户端展示数据即Redis Desktop Manager
Spring-boot关于缓存操作的部分注解
1.@Cacheable标注的方法执行之前先检测缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存(可看源码)
2.@CachePut:即调用方法又更新缓存(常见于update)
1.运行时机:先调用方法,再放入缓存。不同于@Cacheable
注意:使用@CachePut要注意cache中的key,如果更新的key和之前的key不一样,查询后的值不是修改 后的值。
3.@CacheEvict:缓存清除
属性:
allEntries=true 删除指定缓存中的所有数据
beforeInvocation = false: 缓存的清除是否是再方法前执行。
默认是在方法后执行。。常用于删除操作(具体根据业务逻辑进行编写)。
4.@Caching() 里面有cacheable,put等数组,可以都进行配置(复杂的缓存规则)
5.@CacheConfig() 配置全局公共cache属性
具体操作可见以下链接
IDEA编写操作redis代码
1.使用spring-boot初始化向导选择web模块和spring-data-redis模块进行建立
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.我们只需要在application.properties中配置redis运行的主机ip地址
spring.redis.host=192.168.1.103
3.首先看spring-boot源码中为我们关于redis配置了哪些内容,如下图所示帮我们配置了RedisTemplate和StringRedisTemplate对不同类型的数据进行操作
4.既然帮我们自动指定好了RedisTemplate,那我们先拿来用一下
@SpringBootTest
class RedisApplicationTests {
@Autowired
RedisTemplate redisTemplate;
Student student=new Student(1,"zhangsan");
@Test
void contextLoads() {
//转为json (1) 自己将对象转为json
redisTemplate.opsForValue().set("student",student);
}
}
使用上面的代码我们发现存储在Redis Desktop Manager中的数据变成了下面这个样子
\xAC\xED\x00\x05sr\x00\x1Etop.zbawq.redis.mapper.Student\x84\xB3\xE6\xFF\xF7-\xFD'\x02\x00\x02L\x00\x02idt\x00\x13Ljava/lang/Integer;
L\x00\x04namet\x00\x12Ljava/lang/String;xpsr\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\x01t\x00\x08zhangsan
原因是spring-boot帮我们配置的RedisTemplate中使用的是enableDefaultSerializer
,而enableDefaultSerializer就是JdkSerializationRedisSerializer即jdk的序列化工具,而我们可以修改自动配置是序列化改为Jackson2JsonRedisSerializer,代码如下
@Bean
public RedisTemplate<Object, Object> MyRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory) ;
Jackson2JsonRedisSerializer<Object> studentJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
template.setDefaultSerializer(studentJackson2JsonRedisSerializer);
return template;
}
在spring-boot2.0之后对部分代码做了修改 RedisCacheManager不在由RedisTemplate构成,所以使用注解的方式并且是json格式必须重新方法,源码如下
@Bean
RedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,
ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,
ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,
RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(
determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));
List<String> cacheNames = cacheProperties.getCacheNames();
if (!cacheNames.isEmpty()) {
builder.initialCacheNames(new LinkedHashSet<>(cacheNames));
}
redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return cacheManagerCustomizers.customize(builder.build());
}
我们只需要为容器中注入属于自己的CacheManager,自动配置的CacheManager就不会生效了,即下面这段代码。
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//初始化一个RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//设置CacheManager的值序列化方式为json序列化
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
.fromSerializer(jsonSerializer);
RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(pair);
//设置默认超过期时间是30秒
defaultCacheConfig.entryTtl(Duration.ofSeconds(30));
//初始化RedisCacheManager
return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}