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。
优点:
- 成熟稳定: Jedis 是 Redis 官方推荐的 Java 客户端,稳定性较高。易于上手,适用于简单的 Redis 操作。
- 性能:
在单线程环境下,Jedis 的性能较好
,适用于对单个连接执行操作的场景。
缺点:
- 非线程安全: Jedis 在多线程环境是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接。
- 连接管理: Jedis 通常使用连接池来管理连接,但连接池的维护需要额外的开销。
Lettuce
Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,因为StatefulRedisConnection是线程安全的
,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况下也可以按需增加连接实例。
优点:
- 线程安全: Lettuce 是基于 Netty 实现的,支持多线程并发操作,适用于高并发环境。
- 异步操作: Lettuce 支持异步操作,可以更好地利用 CPU 和网络资源。
- 连接池与连接管理: Lettuce 内置了连接池,自动管理连接的创建和回收,更高效地复用连接。
- 拓展性: Lettuce 提供了一些高级特性,如 Sentinel 和 Redis Cluster 的支持。
适用场景
- Jedis 适用场景: 对于简单的 Redis 操作,单线程环境下的操作,以及不涉及高并发的场景,Jedis 是一个不错的选择。
- Lettuce 适用场景: 在多线程并发的高并发环境下,特别是需要异步操作或者对连接池管理有高要求的情况下,Lettuce 是更好的选择。
总结
如果你的应用需要高并发
、线程安全
、异步操作
和连接池管理
等特性,Lettuce 可能更适合;而如果你需要简单的操作
和稳定性
,Jedis 可能更为合适。
待补充
需要添加Redis序列化方法的详细原因