spring-data-redis 2.0 的使用

9次阅读

共计 3799 个字符,预计需要花费 10 分钟才能阅读完成。

在使用 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;
}
}

正文完
 0