Redis的Java客户端
1. Jedis客户端
Jedis是一个Java语言编写的Redis客户端库,用于与Redis服务器进行通信。它提供了易于使用的API,使Java开发人员可以轻松地与Redis进行交互。使用Jedis,你可以执行各种Redis操作,如设置和获取键值对、执行命令、订阅和发布消息等。
优点:
- 易于使用: Jedis提供了简单易用的API,使得与Redis服务器进行通信变得简单直观。它提供了直观的方法来执行各种Redis操作,降低了使用难度。
- 完整的功能支持: Jedis支持Redis的大多数功能,包括基本的操作(如设置和获取键值对)、事务、管道操作、发布/订阅、分布式锁等。你可以使用Jedis来执行各种操作,从简单的数据存储到复杂的Redis功能。
- 灵活性: Jedis允许你通过配置文件或代码进行各种定制,例如设置连接池、超时设置等,以满足你的特定需求。
缺点:
- 同步阻塞模型: Jedis默认采用同步阻塞模型,这意味着在执行某些操作时,客户端可能会被阻塞,直到操作完成。对于大量并发请求或需要高吞吐量的应用程序,这可能会导致性能瓶颈。
- 单线程性能限制: Jedis的单个实例是单线程的,因此在处理高并发负载时可能会受到性能限制。这意味着需要使用多个Jedis实例或其他技术来处理高负载情况。
- 依赖管理: 尽管Jedis本身很容易使用,但在项目中使用Jedis时,你需要管理其依赖关系。这可能包括将Jedis库添加到项目的依赖中,并确保版本与其他库兼容。
- 内存管理: 在某些情况下,由于Jedis客户端需要在客户端维护数据的副本,因此可能会导致内存消耗较高。这对于大规模数据操作可能会带来挑战。
1.1 使用步骤
- 引入依赖
- 创建对象,建立连接
- 使用Jedis,方法名与Redis命令一致
- 释放资源
1.2 配置连接池
public class JedisConnectionFactory {
// 配置连接池
private static final JedisPool jedisPool;
static {
// 配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8);
poolConfig.setMaxIdle(8);
poolConfig.setMinIdle(0);
poolConfig.setMaxWaitMillis(1000);
// 创建连接池对象
jedisPool = new JedisPool(poolConfig, "192.168.1.107", 6379, 1000 ,"123456");
}
// 创建连接池对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
1.3 使用案例
public class JedisTest {
private Jedis jedis;
@BeforeEach
void setUp() {
/*
1.建立连接
2.设置密码
3.选择库
*/
// jedis = new Jedis("192.168.1.107",6379);
// jedis.auth("123456");
// jedis.select(0);
jedis = JedisConnectionFactory.getJedis();
}
@Test
void testString(){
// 存入数据
String result = jedis.set("name", "虎哥");
System.out.println("result = "+result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = "+name);
}
@Test
void testHash(){
jedis.hset("user:1","name","jack");
jedis.hset("user:1","age","21");
Map<String, String> map = jedis.hgetAll("user:1");
System.out.println(map);
}
@AfterEach
void tearDown(){
if (jedis!=null) {
jedis.close();
}
}
}
2. SpringDataRedis客户端
Spring Data 是一系列旨在简化基于 Java 的应用程序中数据库访问的项目集合。它提供了一致的编程模型,减少了数据库交互所需的样板代码量。
Spring Data 的关键组件之一是存储库抽象,它允许开发人员在不编写实际实现代码的情况下进行数据访问操作。Spring Data 存储库可以配置为与各种数据存储一起工作,包括关系数据库如 MySQL、PostgreSQL 和 Oracle,以及 NoSQL 数据库如 MongoDB、Redis 和 Cassandra。
Spring Data Redis 是 Spring Data 项目的一部分,专门用于简化在基于 Java 的应用程序中与 Redis 数据库的交互。Redis 是一种高性能的键值存储数据库,常用于缓存、会话存储和消息队列等用途。
功能包括:
- RedisTemplate: 提供了一个模板化的方式来执行 Redis 操作,例如设置键值对、执行列表操作、操作哈希等。
- Repository 抽象: 类似于 Spring Data 的其他模块,Spring Data Redis 也提供了存储库抽象,使开发人员可以以声明性的方式定义 Redis 实体和查询方法。
- 支持对象映射: Spring Data Redis 支持将 Java 对象序列化为 Redis 数据结构,例如将 Java 对象序列化为 JSON 或二进制数据,并存储在 Redis 中。
- 缓存支持: Spring Data Redis 提供了与 Spring Cache 抽象的集成,可以使用 Spring 的缓存注解轻松地将数据缓存到 Redis 中,从而提高应用程序的性能。
- Pub/Sub 支持: 提供了对 Redis 发布/订阅功能的支持,使应用程序能够实现消息传递和事件驱动的功能。
2.1 连接步骤
- 引入spring-boot-starter-data-redis依赖
- 在application.yml配置Redis信息
- 注入RedisTemplate
2.2 对应的配置文件
对应的springboot版本为2.6.5
spring:
redis:
host: 192.168.1.107
port: 6379
password: 123456
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
2.3 使用例子
@SpringBootTest
class SpringdataRedisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString(){
// 写入一条数据
redisTemplate.opsForValue().set("name","张总");
// 读取一条数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = "+name);
}
}
2.4 为key和value设置序列化器
默认的jdk序列化器十分不友好,需要通过配置相应的序列化器来解决这个问题。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置Key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}
修改之后存入的数据为:
新的问题:带有了额外的参数@class,容易浪费内存空间。为了节省内存空间,我们并不会使用]SON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储lava对象时,手动完成对象的序列化和反序列化。
2.5 StringRedisTemplate
Spring默认提供了一个StringRedistemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程。需要手动完成对象的序列化和反序列化。
@Autowired
private StringRedisTemplate stringRedisTemplate;
//JSON工具
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException {
User user = new User("欢哥", 18);
String json = mapper.writeValueAsString(user);
// 写入一条数据到redis
stringRedisTemplate.opsForValue().set("user:200",json);
// 读取数据
String val = stringRedisTemplate.opsForValue().get("user:200");
User user1 = mapper.readValue(val, User.class);
System.out.println("user = "+user1);
}