当前位置: 首页 > news >正文

Redis基础知识-2

一、spring-boot-starter-data-redis

1. spring-boot-starter-data-redis 是什么?

(1) 定义
  • spring-boot-starter-data-redis 是一个 Spring Boot Starter 模块,专门用于简化 Redis 的集成。
  • 它是 Spring Boot 生态中的一部分,旨在通过自动配置减少手动配置的工作量。
(2) 包含的内容
  • spring-data-redis:提供 Redis 的高级抽象层(如 RedisTemplate 和 StringRedisTemplate)。
  • 底层客户端
    • 默认使用 Lettuce(Spring Boot 2.x 开始的默认客户端)。
    • 如果需要,也可以切换为 Jedis
  • 自动配置
    • 自动配置 RedisConnectionFactory
    • 自动配置 RedisTemplate 和 StringRedisTemplate

2. 它提供了连接和 API 接口吗?

(1) 提供连接
  • 底层连接
    • spring-boot-starter-data-redis 默认引入了 Lettuce 作为底层客户端。
    • 如果你需要使用 Jedis,可以在 pom.xml 中显式引入 Jedis 依赖。
  • 自动配置的连接工厂
    • Spring Boot 会根据配置文件(如 application.properties 或 application.yml)自动创建 RedisConnectionFactory 实例。
(2) 提供 API 接口
  • RedisTemplate
    • 提供了操作 Redis 的通用 API,支持多种数据类型(如 String、Hash、List 等)。示例:
  • StringRedisTemplate
    • 是 RedisTemplate 的特化版本,专门用于操作字符串类型的键值对。

3. spring-boot-starter-data-redis 的依赖结构

(1) 默认依赖

当你引入 spring-boot-starter-data-redis 时,Maven 或 Gradle 会自动引入以下依赖:

  • spring-data-redis:提供 Redis 的高级抽象层。
  • io.lettuce.core:Lettuce 客户端(Spring Boot 2.x 的默认 Redis 客户端)。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2) 切换到 Jedis

如果你希望使用 Jedis 而不是 Lettuce,可以排除 Lettuce 并引入 Jedis:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce.core</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

4. 自动配置的工作原理

(1) 配置文件

在 application.properties 或 application.yml 中,你可以配置 Redis 的连接信息:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=yourpassword
spring.redis.database=0
(2) 自动配置的组件

Spring Boot 会根据配置文件自动生成以下组件:

  • RedisConnectionFactory:负责管理 Redis 连接。
  • RedisTemplate:提供通用的 Redis 操作 API。
  • StringRedisTemplate:提供字符串类型的 Redis 操作 API。
(3) 扩展点

如果需要自定义配置,可以通过 Java 配置类覆盖默认的 Bean。例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        // 自定义序列化器等
        return template;
    }
}


5. 总结

  1. spring-boot-starter-data-redis 的作用

    • 提供开箱即用的 Redis 集成功能。
    • 默认引入 spring-data-redis 和 Lettuce 客户端。
    • 支持通过配置文件快速配置 Redis 连接。
  2. 提供的功能

    • 提供底层连接(通过 RedisConnectionFactory)。
    • 提供高级 API(如 RedisTemplate 和 StringRedisTemplate)。
  3. 如何选择底层客户端

    • 默认使用 Lettuce,适合异步和高并发场景。
    • 如果需要 Jedis,可以显式引入 Jedis 依赖。
  4. 建议

    • 在大多数场景下,直接使用 spring-boot-starter-data-redis 即可。
    • 如果有特殊需求(如自定义序列化器),可以通过 Java 配置类扩展。

二、Lettuce 和 Jedis

Lettuce 和 Jedis 是两种常见的 Redis Java 客户端,它们都用于与 Redis 数据库进行通信,但在设计理念、性能特点和适用场景上存在显著差异。以下是两者的详细对比:


1. 基本区别

特性LettuceJedis
线程模型基于 Netty 实现异步和非阻塞 I/O,支持多线程共享单个连接。基于阻塞式 I/O,每个线程需要独立的连接(线程不安全)。
连接管理支持长连接,单个连接可以被多个线程共享。每个线程需要独立的连接,通常需要配合连接池(如 Commons Pool)使用。
性能在高并发场景下性能更优,适合异步操作。在低并发或简单场景下性能较好,但高并发场景下可能成为瓶颈。
Spring Boot 默认Spring Boot 2.x 开始,默认使用 Lettuce。需要手动引入依赖并配置才能使用。
易用性提供了丰富的异步 API 和响应式编程支持(如 Reactive Streams)。API 简单直接,易于理解和使用。
社区支持社区活跃,功能丰富,支持最新的 Redis 特性(如 Redis Cluster、Redis Sentinel 等)。社区成熟,文档完善,但更新频率较慢,部分新特性支持滞后。

2. 详细对比

(1) 线程模型
  • Lettuce

    • 使用 Netty 实现异步和非阻塞 I/O。
    • 单个连接可以被多个线程共享,避免了频繁创建和销毁连接的开销。
    • 支持响应式编程(Reactive Programming),适合现代微服务架构。
  • Jedis

    • 基于阻塞式 I/O,每个线程必须使用独立的连接。
    • 如果需要在多线程环境中使用,必须借助连接池(如 JedisPool)。
    • 连接池的管理会增加复杂性,尤其是在高并发场景下。

(2) 性能
  • Lettuce

    • 在高并发场景下表现优异,因为单个连接可以处理多个请求。
    • 异步和非阻塞的特性使其更适合分布式系统和微服务架构。
    • 支持 Redis Cluster 和 Redis Sentinel,能够很好地扩展到大规模集群环境。
  • Jedis

    • 在低并发场景下性能较好,因为其设计简单,没有额外的异步开销。
    • 在高并发场景下,由于每个线程需要独立的连接,性能可能会下降。
    • 不适合复杂的分布式环境(如 Redis Cluster)。

(3) 易用性
  • Lettuce

    • 提供了丰富的 API,包括同步、异步和响应式编程支持。
    • 学习曲线稍高,尤其是对于不熟悉异步编程的开发者。
    • 示例代码:
      RedisClient redisClient = RedisClient.create("redis://localhost:6379");
      StatefulRedisConnection<String, String> connection = redisClient.connect();
      RedisCommands<String, String> syncCommands = connection.sync();
      
      syncCommands.set("key", "value");
      String value = syncCommands.get("key");
      System.out.println(value);
      
      connection.close();
      redisClient.shutdown();
      
  • Jedis

    • API 简单直观,易于上手。
    • 更适合初学者或对异步编程没有需求的项目。
    • 示例代码:
      Jedis jedis = new Jedis("localhost", 6379);
      jedis.set("key", "value");
      String value = jedis.get("key");
      System.out.println(value);
      jedis.close();
      

(4) 连接管理
  • Lettuce

    • 支持长连接,单个连接可以被多个线程共享。
    • 无需频繁创建和销毁连接,减少了资源开销。
  • Jedis

    • 每个线程需要独立的连接,通常需要使用连接池(如 JedisPool)来管理连接。
    • 连接池的配置和管理增加了复杂性。

(5) 对 Redis 新特性的支持
  • Lettuce

    • 支持 Redis 的最新特性,如 Redis Cluster、Redis Sentinel、Pub/Sub、事务等。
    • 更加灵活,适合复杂的分布式环境。
  • Jedis

    • 对新特性的支持相对滞后。
    • 虽然也支持 Redis Cluster 和 Redis Sentinel,但配置和使用较为复杂。

3. 适用场景

(1) Lettuce 的适用场景
  • 高并发场景:Lettuce 的异步和非阻塞特性使其在高并发环境下表现优异。
  • 分布式系统:支持 Redis Cluster 和 Redis Sentinel,适合大规模分布式环境。
  • 微服务架构:支持响应式编程,适合现代微服务架构。
  • 长连接需求:单个连接可以被多个线程共享,减少了连接管理的复杂性。
(2) Jedis 的适用场景
  • 简单项目:Jedis 的 API 简单直观,适合小型项目或对性能要求不高的场景。
  • 低并发场景:在低并发环境下,Jedis 的性能表现良好。
  • 初学者:API 易于理解,学习成本较低。

4. 总结

特性LettuceJedis
线程模型异步、非阻塞阻塞式
连接管理单个连接可共享,支持长连接每个线程独立连接,需连接池管理
性能高并发场景下性能优异低并发场景下性能良好
易用性提供异步和响应式支持,学习曲线较高API 简单直观,易于上手
适用场景高并发、分布式、微服务架构小型项目、低并发、初学者

5. 如何选择?

  • 如果项目是高并发、分布式或微服务架构,建议选择 Lettuce
  • 如果项目规模较小、并发量较低或团队成员对异步编程不熟悉,可以选择 Jedis
  • Spring Boot 项目 中,默认使用 Lettuce,但如果需要切换到 Jedis,可以通过排除 Lettuce 并引入 Jedis 依赖实现。

下一篇:Redis基础知识-3

http://www.dtcms.com/a/108792.html

相关文章:

  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.1百度ERNIE、阿里通义千问的技术对比
  • 程序化广告行业(56/89):S2S对接与第三方广告监测全解析
  • 《第三次世界大战》第七章:破碎的未来
  • 《实战AI智能体》MCP对Agent有哪些好处
  • [CISSP] [7] PKI和密码应用
  • 应用安全系列之四十五:日志伪造(Log_Forging)之二
  • 基于BusyBox构建ISO镜像
  • 多模态模型:专栏概要与内容目录
  • 网络爬虫的基础知识
  • 《inZOI(云族裔)》50+MOD整合包
  • 【目标检测】【深度学习】【Pytorch版本】YOLOV2模型算法详解
  • 【现代深度学习技术】现代卷积神经网络07:稠密连接网络(DenseNet)
  • CFResNet鸟类识别:原网络基础上改进算法
  • Springboot logback日志实例
  • RK3568下的QT工程配置
  • Joomla教程—Joomla 模块管理与Joomla 模块类型介绍
  • AI SEO内容优化指南:如何打造AI平台青睐的高质量内容
  • 在 Elasticsearch 中使用 Amazon Nova 模型
  • Vue父组件调用子组件设置table表格合并
  • chromium魔改——修改 navigator.webdriver 检测
  • 【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇
  • Leetcode hot 100(day 4)
  • 03.01、三合一
  • 使用Amazon Bedrock Guardrails保护你的DeepSeek模型部署
  • 一问讲透redis持久化机制-rdb aof
  • 深度优化:解决SpringBoot应用启动速度慢的8个关键策略
  • 部署大模型实战:如何巧妙权衡效果、成本与延迟?
  • 智慧园区大屏如何实现全局监测:监测意义、内容、方式
  • .NET WebApi的详细发布流程——及其部署到Linux与Windows平台
  • AG32:MCU和CPLD如何交互?