spring-data-redis 2.0 的使用
2023-09-11 14:16:54 时间
在使用Spring Boot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。
Spring Boot2.x 不再使用Jedis,换成了Lettuce。Lettuce是基于 Netty 实现的,所以性能更好。但是我看到很多文章居然在Spring Boot 2.x还在写Jedis的配置。
依赖
依赖比较简单,spring-boot-starter-data-redis、commons-pool2 即可。
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
属性配置
在属性中配置Redis Server的访问地址、密码、数据库,并配置连接池的属性。
redis:
# reids的连接ip
host: 127.0.0.1
port: 6379
password: helloworld
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
database: 0
# 连接超时时间(毫秒)
timeout: 10000ms
# redis client配置,使用lettuce
lettuce:
pool:
# 连接池中的最小空闲连接 默认 0
min-idle: 0
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-wait: 1000ms
# 连接池最大连接数(使用负值表示没有限制) 默认 8
max-active: 8
# 连接池中的最大空闲连接 默认 8
max-idle: 8
注解配置
全局使能缓存
@EnableSwagger2 // 使用swagger api 功能
@EnableCaching // 使用缓存
@SpringBootApplication
public class Starter {
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
通过注解使用缓存,@Cacheable 将获取值存入缓存
/**
* 基于id 获取用户信息
*/
@Cacheable(value="user", key="#id", unless="#result == null")
public UserDTO GetUserById(int id) {
User userEntity = userMapper.getUserByID(id);
if (userEntity == null){
return null;
}
/* entity 转 DTO */
UserDTO userDTO = new UserDTO();
userDTO.setAge(userEntity.getAge());
userDTO.setId(id);
userDTO.setName(userEntity.getName());
userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
userDTO.setPhone(userEntity.getPhone());
userDTO.setEmail(userEntity.getEmail());
return userDTO;
}
@CachePut 更新缓存
@CachePut(value = "user", key="#p0.id")
public UserDTO updateUser(InputUserInfoDTO inputUserInfoDTO){
userMapper.updateUser(inputUserInfoDTO.getId(), inputUserInfoDTO.getName(), inputUserInfoDTO.getAge());
User userEntity = userMapper.getUserByID(inputUserInfoDTO.getId());/* entity 转 DTO */
if (null == userEntity){
return null;
}
UserDTO userDTO = new UserDTO();
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());
return userDTO;
}
@CacheEvict 删除缓存
@CacheEvict(value = "user", key="#id")
public void deleteUser(int id){
userMapper.deleteUser(id);
}
当然为了支持序列化,我的UserDTO得implements Serializable
@Data
public class UserDTO implements Serializable {
//public class UserDTO implements Serializable {
private int id;
private String name;
private int age;
private String createTime;
private String phone;
private String email;
}
至此缓存已经可以用起来了,不需要编写RedisConfig代码,有点小遗憾,直接去Redis查看数据,发现是乱码。这是因为我使用的是Java自带的序列化,如果要更换Redis序列化方法,就要重写RedisConfig了。
RedisConfig
这个配置也不复杂,使用Jackson2JsonRedisSerializer将对象转换为Json串,注意这里一定要使用ObjectMapper,否则再将json串反序列化为对象时会报。
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ZERO)
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();
return cacheManager;
}
}
来源:
相关文章
- java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购
- python redis基本概念简单操作
- Redis系列--内存淘汰机制(含单机版内存优化建议)
- Spring Boot 2.x :通过 spring-boot-starter-hbase 集成 HBase
- 深入理解Spring Redis的使用 (五)、常见问题汇总
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- spring boot:在服务端用redis存储jwt登录后的用户信息(spring boot 2.4.4)
- Redis 单机部署redis实例
- Redis 你需要注意的地方
- spring学习12 -Spring 框架模块以及面试常见问题注解等
- Atitit mysql redis mongodb 性能指标 目录 1.1. 二、 性能比较1 1.2. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s2 1
- 学习Spring-Session+Redis实现session共享
- Redis整合Spring结合使用缓存实例
- 毕设/私活/bigold必备项目,一个挣钱的免费的全开源标准前后端分离后台管理权限系统【springboot+vue+redis+Spring Security】脚手架搭建:若依Ruo框架具体使用教程
- spring-data-redis遇到twemproxy
- 〖Python 数据库开发实战 - Python与Redis交互篇④〗- 利用 redis-py 实现集合与有序集合的常用指令操作
- 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
- 【云原生 | 26】Docker运行数据库实战之Redis
- 阿里云Redis之:配置程序接入阿里云Redis集群缓存数据(十七)