Redis(三)SpringBoot集成Redis

本文介绍了使用IDEA + JDK8 + SpringBoot2.3.4集成Redis的步骤,包括构建项目、引入依赖、配置Redis、添加序列化方法和编写测试类。还对比了Jedis和Lettuce的区别,分析了各自优缺点及适用场景,如Jedis适用于简单单线程操作,Lettuce适用于高并发环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis(三)SpringBoot集成Redis

搭建环境: 采用IDEA + JDK8 + SpringBoot2.3.4集成Redis

第一步:使用IDEA构建项目,引入对应依赖

      <dependencies>
          <!--Spring Boot 项目中集成和使用 Redis 数据库-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-redis</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
          <!-- Lettuce(Redis 客户端)所需的依赖-->
          <!--Apache Commons Pool 2 是一个对象池库,用于管理对象的池化,适用于多线程环境下的对象复用。
          在 Lettuce 中,它被用来管理连接池,以提高 Redis 客户端的性能和资源利用率。-->
          <dependency>
              <groupId>org.apache.commons</groupId>
              <artifactId>commons-pool2</artifactId>
          </dependency>
      </dependencies>

第二步:配置Redis

如果使用 jedis 连接 Redis,打开配置,测试代码不用变。

spring:
  # redis 配置
  redis:
    host: 43.143.176.14
    port: 6598
    password: cris@qwe123
    database: 5
     # jedis 连接池配置
#    jedis:
#      pool:
#        max-active: 8
#        max-idle: 8
#        min-idle: 0
#        max-wait: 1000
    #lettuce 连接池配置 线程安全
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 1000


第三步:添加Redis序列化方法

默认的JDK序列生成的二进制不利于查看,所以要自定义

@SpringBootApplication
public class SpringdataDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringdataDemoApplication.class, args);
    }

    // 定义 RedisTemplate 的 Bean

    /**
     * redisTemplate 序列化使用的jdkSerializeable,存储二进制字节码,所以自定义序列化类
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建 RedisTemplate 对象
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 创建 JSON 序列化工具,使用 Jackson2JsonRedisSerializer 替换默认序列化
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
                new Jackson2JsonRedisSerializer<>(Object.class);

        // 配置 ObjectMapper,使其能够访问所有字段,实现任意字段的序列化和反序列化
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置 Key 和 Value 的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

        // 设置 Hash Key 和 Hash Value 的序列化规则
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        // 初始化 RedisTemplate
        redisTemplate.afterPropertiesSet();
        // 返回
        return redisTemplate;
    }
}

第四步:编写测试类

@SpringBootTest
class SpringdataDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testInit() {
        //PING PONG 心跳机制检测是否连接成功
        String pong = redisTemplate.getConnectionFactory().getConnection().ping();
        System.out.println("pong = " + pong);
    }

    @Test
    public void testString() {
        //插入一条数据
        redisTemplate.opsForValue().set("username","zhangsan");
        //获取一条数据
        Object username = redisTemplate.opsForValue().get("username");
        System.out.println("username = " + username);
    }
}

Jedis 和 Lettuce 区别

Jedis

Jedis在实现上是直接连接的redis server。

优点:

  1. 成熟稳定: Jedis 是 Redis 官方推荐的 Java 客户端,稳定性较高。易于上手,适用于简单的 Redis 操作。
  2. 性能: 在单线程环境下,Jedis 的性能较好,适用于对单个连接执行操作的场景。

缺点:

  1. 非线程安全: Jedis 在多线程环境是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接。
  2. 连接管理: Jedis 通常使用连接池来管理连接,但连接池的维护需要额外的开销。
Lettuce

Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,因为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况下也可以按需增加连接实例。

优点:

  1. 线程安全: Lettuce 是基于 Netty 实现的,支持多线程并发操作,适用于高并发环境。
  2. 异步操作: Lettuce 支持异步操作,可以更好地利用 CPU 和网络资源。
  3. 连接池与连接管理: Lettuce 内置了连接池,自动管理连接的创建和回收,更高效地复用连接。
  4. 拓展性: Lettuce 提供了一些高级特性,如 Sentinel 和 Redis Cluster 的支持。
适用场景
  • Jedis 适用场景: 对于简单的 Redis 操作,单线程环境下的操作,以及不涉及高并发的场景,Jedis 是一个不错的选择。
  • Lettuce 适用场景: 在多线程并发的高并发环境下,特别是需要异步操作或者对连接池管理有高要求的情况下,Lettuce 是更好的选择。
总结

如果你的应用需要高并发线程安全异步操作连接池管理等特性,Lettuce 可能更适合;而如果你需要简单的操作稳定性,Jedis 可能更为合适。

待补充

需要添加Redis序列化方法的详细原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峰子大疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值