spring-data-redis 2.0 的使用示例代码

 更新时间:2019年01月20日 10:26:19   作者:梦见山  
这篇文章主要介绍了spring-data-redis 2.0 的使用示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot+mybatis-plus+oracle实现逻辑删除

    springboot+mybatis-plus+oracle实现逻辑删除

    最近在做一个前后端分离的小项目,需要删除用户表的用户,本文主要实现了springboot+mybatis-plus+oracle逻辑删除,具有一定的参考价值,感兴趣的可以了解一下
    2021-08-08
  • SpringBoot执行有返回值的异步任务问题

    SpringBoot执行有返回值的异步任务问题

    这篇文章主要介绍了SpringBoot执行有返回值的异步任务问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java随机生成8位数授权码的实例

    java随机生成8位数授权码的实例

    下面小编就为大家带来一篇java随机生成8位数授权码的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java利用Zxing生成二维码的简单实例

    Java利用Zxing生成二维码的简单实例

    下面小编就为大家带来一篇Java利用Zxing生成二维码的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Springcloud整合stream,rabbitmq实现消息驱动功能

    Springcloud整合stream,rabbitmq实现消息驱动功能

    官方定义SpringCloud Stream 是一个构建消息驱动微服务的框架。我们只需要搞清楚如何与Spring Cloud Stream 交互就可以方便使用消息驱动的方式。本文将通过Springcloud整合stream,rabbitmq实现消息驱动功能,需要的可以参考一下
    2022-02-02
  • Springboot传参详解

    Springboot传参详解

    这篇文章主要介绍了Springboot传参的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Java多线程并发之ReentrantLock

    Java多线程并发之ReentrantLock

    这篇文章主要介绍了Java 多线程并发ReentrantLock,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2023-04-04
  • java的接口解耦方式

    java的接口解耦方式

    这篇文章主要介绍了java的接口解耦方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 一文详解Java线程的6种状态与生命周期

    一文详解Java线程的6种状态与生命周期

    一个线程在给定的时间点只能处于一种状态。线程可以有6种状态:New、Runnable、Blocked、Waiting、Timed waiting和Terminated。本文将详细讲解这6种状态,需要的可以参考一下
    2022-05-05
  • Java SpringBoot开发小技巧详解

    Java SpringBoot开发小技巧详解

    这篇文章主要介绍了浅谈SpringBoot项目如何让前端开发提高效率(小技巧),主要介绍了Swagger和Nginx提高效率的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论