概述
1、Jedis
(1)为性能和易用性而设计的 Java Redis 客户端
(2)以 Redis 命令作为方法名称,学习成本低,简单实用
(3)但 Redis 实例是线程不安全的,多线程环境下需要配合连接池使用
2、Lettuce
(1)高级 Java Redis 客户端,基于 Netty 实现
(2)支持同步、异步、响应式编程方式,并且线程安全
(3)支持 Redis 哨兵模式、集群模式、管道模式、编解码
3、Redisson
(1)具有内存数据网格功能的 Java Redis 客户端
(2)超过 50 个基于 Redis 的 Java 对象和服务
(3)基于 Redis 实现的分布式、可伸缩的 Java 数据结构集合,如:Map、Queue
(4)支持跨进程的同步机制:Lock、Semaphore,比较适合实现特殊的功能需求
4、Spring Data Redis
(1)Jedis、Lettuce 主要提供 Redis 命令对应 API,方便操作 Redis
(2)Spring Data Redis 对两者抽象、封装
Jedis
1、依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.3</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
2、Jedis 本身是线程不安全的,并且频繁的创建、销毁连接会有性能损耗,建议使用 Jedis 连接池代替 Jedis 直连
SpringDataRedis客户端
1、SpringData 是 Spring 中数据操作的模块,包含对各种数据库的集成,其中对 Redis 集成模块为 SpringDataRedis
(1)提供对不同 Redis 客户端的整合(Lettuce、Jedis)
(2)提供 RedisTemplate 统一 API 操作 Redis,封装对 Redis 操作,并且将不同数据类型的操作 API 封装到不同类型中
(3)支持 Redis 发布订阅模型
(4)支持 Redis 哨兵、Redis 集群
(5)支持基于 Lettuce 的响应式编程
(6)支持基于 JDK、JSON、字符串、Spring 对象的数据序列化、反序列化
(7)支持基于 Redis 的 JDKCollection 实现
2、使用步骤
(1)引入依赖
<!-- SpringBoot整合Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.4</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
(2) 在 application.yml 配置 Redis 信息
(3)注入 RedisTemplate
3、SpringDataRedis 序列化方式
(1)RedisTemplate 可以接收任意 Object,作为值写入 Redis,写入前会把 Object 序列化为字节形式,默认采用 JDK 序列化
(2)缺点:可读性差、内存占用较大
4、JSON 序列化
(1)自定义 RedisTemplate
(2)修改 RedisTemplate 序列化器为 GenericJackson2JsonRedisSerializer
(3)缺点:为了在反序列化时,知道对象的类型,JSON 序列化器会将类的 Class 类型,写入 json 结果中,存入 Redis,会带来额外的内存开销
5、StringRedisTemplate
(1)为了节省内存空间,不会使用 JSON 序列化器处理 value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value
(2)Spring 默认提供 StringRedisTemplate 类,它的 key 和 value 的序列化方式默认为 String 方式,省去自定义 RedisTemplate 过程
(3)当需要存储 Java 对象时,手动完成对象的序列化、反序列化
(4)写入 Redis 时,手动把对象序列化为 JSON
(5)读取 Redis 时,手动把读取的 JSON 反序列化为对象