Spring boot 整合 Redis (redisTemplate) 介绍

2020-05-12 0 By admin

Java 编程语言提供了多种连接 Redis 服务的客户端驱动。如下:

  1. Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持。
  2. Redisson:实现了分布式和可扩展的Java数据结构。
  3. Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器;主要在一些分布式缓存框架上使用比较多

可伸缩性

  1. Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
  2. Redisson:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。
  3. Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。

一、RedisTemplate 和 StringRedisTemplate

在 Spring boot 项目整合 Redis 中,最主要的 Bean 操作组件就是 RedisTemplate 和 StringRedisTemplate。

1.1、RedisTemplate 类

这个类的名字后缀是Template,如果了解过 Spring 如何连接关系型数据库的,大概不会难猜出这个类是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作。

1.2、StringRedisTemplate 类

跟RedisTemplate功能类似;两者之间的区别主要在于他们使用的序列化类。

  1. RedisTemplate使用的是 JdkSerializationRedisSerializer。
  2. StringRedisTemplate使用的是 StringRedisSerializer。

1.3、总结

1、当 redis 数据库里面存储的是【字符串】类型数据,那么使用 StringRedisTemplate 即可。
2、如果 Redis 服务中数据是复杂的【对象类型】,而且你在取出的时候又不想做任何的数据转换,直接从 Redis 里面取出一个对象,那么使用RedisTemplate是更好的选择。

二、代码整合示例

2.1、在 pom 文件中添加 redis 的依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

spring-boot-starter-data-redis有两种实现:lettuce 和 jedis ,然而默认是使用lettuce。

2.2、在配置文件 application.yml 中添加配置项

spring:
  redis:
    database: 1
    host: 127.0.0.1
    password: password
    port: 6379
    timeout: 3000
    jedis:
      pool:
        max-idle: 500
        min-idle: 50
        max-active: 2000
        max-wait: 1000

2.3、设置 Reids 的工具类

@Component
public class RedisSerialUtil {
  @Autowired
  private RedisTemplate<String,String> redisTemplate;

  /**
   * 默认过期时长,单位:秒
   */
  public static final long DEFAULT_EXPIRE = 60 * 60 * 24;

  /**
   * 不设置过期时长
   */
  public static final long NOT_EXPIRE = -1;

  /**
   * 普通缓存放入
   * @param key 键
   * @param value 值
   * @return true成功 false失败
   */
  public boolean set(String key, String value) {
    try {
      redisTemplate.opsForValue().set(key,value);
      return true;
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
......
}

然后在需要操作 Redis 服务的类中引用这个类就可以了。