spring-data-redis 2.0 的使用示例代码
在使用SpringBoot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。
SpringBoot2.x不再使用Jedis,换成了Lettuce。Lettuce是基于Netty实现的,所以性能更好。但是我看到很多文章居然在SpringBoot2.x还在写Jedis的配置。
依赖
依赖比较简单,spring-boot-starter-data-redis、commons-pool2即可。
org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 2.4.2
属性配置
在属性中配置RedisServer的访问地址、密码、数据库,并配置连接池的属性。
redis: #reids的连接ip host:127.0.0.1 port:6379 password:helloworld #Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0 database:0 #连接超时时间(毫秒) timeout:10000ms #redisclient配置,使用lettuce lettuce: pool: #连接池中的最小空闲连接默认0 min-idle:0 #连接池最大阻塞等待时间(使用负值表示没有限制)默认-1 max-wait:1000ms #连接池最大连接数(使用负值表示没有限制)默认8 max-active:8 #连接池中的最大空闲连接默认8 max-idle:8
注解配置
全局使能缓存
@EnableSwagger2//使用swaggerapi功能
@EnableCaching//使用缓存
@SpringBootApplication
publicclassStarter{
publicstaticvoidmain(String[]args){
SpringApplication.run(Starter.class,args);
}
}
通过注解使用缓存,@Cacheable将获取值存入缓存
/**
*基于id获取用户信息
*/
@Cacheable(value="user",key="#id",unless="#result==null")
publicUserDTOGetUserById(intid){
UseruserEntity=userMapper.getUserByID(id);
if(userEntity==null){
returnnull;
}
/*entity转DTO*/
UserDTOuserDTO=newUserDTO();
userDTO.setAge(userEntity.getAge());
userDTO.setId(id);
userDTO.setName(userEntity.getName());
userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
userDTO.setPhone(userEntity.getPhone());
userDTO.setEmail(userEntity.getEmail());
returnuserDTO;
}
@CachePut更新缓存
@CachePut(value="user",key="#p0.id")
publicUserDTOupdateUser(InputUserInfoDTOinputUserInfoDTO){
userMapper.updateUser(inputUserInfoDTO.getId(),inputUserInfoDTO.getName(),inputUserInfoDTO.getAge());
UseruserEntity=userMapper.getUserByID(inputUserInfoDTO.getId());/*entity转DTO*/
if(null==userEntity){
returnnull;
}
UserDTOuserDTO=newUserDTO();
userDTO.setAge(userEntity.getAge());
userDTO.setId(userEntity.getId());
userDTO.setName(userEntity.getName());
userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
userDTO.setPhone(userEntity.getPhone());
userDTO.setEmail(userEntity.getEmail());
returnuserDTO;
}
@CacheEvict删除缓存
@CacheEvict(value="user",key="#id")
publicvoiddeleteUser(intid){
userMapper.deleteUser(id);
}
当然为了支持序列化,我的UserDTO得implementsSerializable
@Data
publicclassUserDTOimplementsSerializable{
//publicclassUserDTOimplementsSerializable{
privateintid;
privateStringname;
privateintage;
privateStringcreateTime;
privateStringphone;
privateStringemail;
}
至此缓存已经可以用起来了,不需要编写RedisConfig代码,有点小遗憾,直接去Redis查看数据,发现是乱码。这是因为我使用的是Java自带的序列化,如果要更换Redis序列化方法,就要重写RedisConfig了。
RedisConfig
这个配置也不复杂,使用Jackson2JsonRedisSerializer将对象转换为Json串,注意这里一定要使用ObjectMapper,否则再将json串反序列化为对象时会报。
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
publicclassRedisConfigextendsCachingConfigurerSupport{
@Bean
publicCacheManagercacheManager(RedisConnectionFactoryfactory){
RedisSerializerredisSerializer=newStringRedisSerializer();
Jackson2JsonRedisSerializerjackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapperom=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//配置序列化(解决乱码的问题)
RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ZERO)
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManagercacheManager=RedisCacheManager.builder(factory).cacheDefaults(config).build();
returncacheManager;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。