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

来源:

spring-data-redis 2.0 的使用的更多相关文章

  1. 【原创】Spring Data Redis <=2.0.3反序列化漏洞

    Spring Data Redis隶属于Spring Data家族, 提供简单易用的方式来访问Redis缓存. Spring Data Redis在往Redis里面写数据的时候,默认会先对数据进行序列 ...

  2. 关于在项目中使用spring data redis与jedis的选择

    项目中需要用到redis,主要用来作为缓存,redis的客户端有两种实现方式,一是可以直接调用jedis来实现,二是可以使用spring data redis,通过spring的封装来调用. 应该使用 ...

  3. Spring Data Redis与Jedis的选择(转)

    说明:内容可能有点旧,需要在业务上做权衡. Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用.应该使用哪 ...

  4. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  5. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  6. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  7. spring data redis 理解

    前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...

  8. Spring Data Redis 详解及实战一文搞定

    SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...

  9. Spring Data Redis 让 NoSQL 快如闪电(2)

    [编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...

  10. Spring Data Redis实现消息队列——发布/订阅模式

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现. 定义:生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

随机推荐

  1. bash 基础之五 条件测试、read

    一 条件选择if语句 顺序执行:逐条运行: 选择执行: 代码有一个分支:条件满足时才会执行: 两个或以上的分支:只会执行其中一个满足条件的分支: 循环执行:代码片断(循环体)要执行0.1或多个来回: ...

  2. 卸载Ambari集群

    清理ambari安装的hadoop集群 本文针对redhat或者centos 对于测试集群,如果通过ambari安装hadoop集群后,想重新再来一次的话,需要清理集群. 对于安装了很多hadoop组 ...

  3. 服务器 Web服务器 应用服务器区别联系

    服务器: 通俗的讲,我们访问一个网站就相当于访问一个服务器的文件,如果想要通过自己的域名来访问一个网站,首先得将域名部署到你的服务器上,然后就可以通过域名访问到你服务器上的网 页文件.ip地址就相当于 ...

  4. HTTP之基本认证机制

    1. 认证 1.1 HTTP 的质询/响应认证框架 HTTP 提供了一个原生的质询/响应(challenge/response)框架,简化了对用户的认证过程. HTTP 的认证模型如下图所示: Web ...

  5. Flutter移动电商实战 --(25)列表页_使用Provide控制子类-1

    主要是二级分类的UI布局 生成我们的右侧动态类 定义list变量 开始写里面的子项,把每一个小的写了 再拼成一个大的 这样我们的小类就写完了 开始写我的大类别:是一个横向的ListView.写横向的L ...

  6. ccf 201803-3 URL映射(python)

    使用正则表达式 import re import collections n, m = list(map(int, input().split())) arr = ['']*(m+n) for i i ...

  7. mongodb MongoDB C#/.NET driver version

    The first column lists the driver version(s). C#/.NET Driver Version MongoDB 2.6 MongoDB 3.0 MongoDB ...

  8. oracle相关知识点

    oracle数据库,实例名和数据库是一一对应的,oracle服务端可以启动多个实例,对应于多个数据库. 数据库可以通过sqlplus / as sysdba 进入默认SID的实例, 查看当前的实例名: ...

  9. 【403】COMP9024 Exercise

    Week 1 Exercises fiveDigit.c There is a 5-digit number that satisfies 4 * abcde = edcba, that is,whe ...

  10. React Native运行安卓报错解决记录

    1>Error:Configuration with name ‘default’ not found. 解决链接: http://blog.csdn.net/u011240877/articl ...