Jedis与SpringDataRedis
什么是 Jedis?
Jedis 是一个轻量级、功能齐全的 Redis Java 客户端。
它提供了 Java 应用程序与 Redis 服务器进行交互的 API,允许你通过 Java 代码轻松地执行 Redis 的命令,实现数据的存储、读取、删除等操作。
你可以把它理解为连接 Java 程序和 Redis 数据库之间的一个“桥梁”或“驱动程序”。
以下是一个使用 Jedis 进行基本操作的简单例子:
引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
JedisConnectionFactory.java
单个 Jedis 实例不是线程安全的,可以通过 JedisPool(连接池)来管理多个连接,从而安全地在多线程环境中使用。
package com.example.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间, 1000ms
jedisPoolConfig.setMaxWaitMillis(1000);
jedisPool = new JedisPool(jedisPoolConfig, "192.168.88.151", 6379,1000, "123456"); }
// 获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}}
JebisTest.java
package com.example.test;
import com.example.util.JedisConnectionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import java.util.Map;
public class JebisTest {
private Jedis jedis;
@BeforeEach
void setUp() {
// 建立连接
// jedis = new Jedis("192.168.88.151", 6379);
jedis = JedisConnectionFactory.getJedis();
// 设置密码
jedis.auth("123321");
// 选择库
jedis.select(0);
}
@Test
void testString() {
//存入数据
String result = jedis.set("name","测试1");
System.out.println(result);
//获取数据
String name = jedis.get("name");
System.out.println("name = "+name);
}
@Test
void testHesh() {
//插入数据
jedis.hset("user:1","name","测试2");
jedis.hset("user:1","age","20");
//获取数据
Map<String, String> map = jedis.hgetAll("user:1");
System.out.println(map);
}
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
}
什么是 Spring Data Redis?
Spring Data Redis 是更大的 Spring Data 家族的一部分,它的目标是为 Redis 这种流行的键值存储提供一种简单且一致的编程模型。它本质上不是一个独立的 Redis 客户端,而是建立在现有 Java Redis 客户端(如 Jedis 或 Lettuce)之上的一层高级抽象。
你可以把它理解为:
Jedis/Lettuce:是基础工具,提供了直接、底层的 Redis 命令操作。
Spring Data Redis:是高级封装,提供了更简单、更符合 Spring 风格的方式来使用这些工具,让你专注于业务逻辑而不是样板代码。
基本使用示例:
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Spring Boot 默认使用 Lettuce,如果需要 Jedis,需排除 Lettuce 并显式引入 Jedis -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置连接 (application.yml)
spring:
data:
redis:
host: 192.168.88.151
port: 6379
password: 123321
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 1000ms
User.java
package com.example.entity;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public User() {}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
SpringDataRedisDemoApplicationTests.java
package com.example;
import com.example.entity.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.Map;
@SpringBootTest // 标记为Spring Boot测试类,会自动加载应用程序上下文
class SpringDataRedisDemoApplicationTests {
@Autowired // 自动注入StringRedisTemplate,专门用于处理字符串类型的Redis操作
private StringRedisTemplate stringRedisTemplate;
// 测试String类型数据的操作
@Test
void testString() {
// 写入一条String类型数据到Redis,key为"name",value为"测试3"
stringRedisTemplate.opsForValue().set("name", "测试3");
// 根据key获取数据并打印
System.out.println(stringRedisTemplate.opsForValue().get("name"));
}
// 创建Jackson的ObjectMapper实例,用于JSON序列化和反序列化
private static final ObjectMapper mapper = new ObjectMapper();
// 测试将Java对象序列化为JSON并存储到Redis
@Test
void testSaveUser() throws JsonProcessingException {
// 准备一个User对象
User user = new User("测试5", 15);
// 手动将User对象序列化为JSON字符串
String json = mapper.writeValueAsString(user);
// 将JSON字符串写入Redis,key为"user:100"
stringRedisTemplate.opsForValue().set("user:100", json);
// 从Redis中读取数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:100");
// 将JSON字符串反序列化为User对象
User user1 = mapper.readValue(jsonUser, User.class);
// 打印反序列化后的User对象
System.out.println("user1 = " + user1);
}
// 测试Hash类型数据的操作
@Test
void testHash(){
// 向Hash结构中添加字段,key为"user:400",字段名为"name",值为"测试6"
stringRedisTemplate.opsForHash().put("user:400","name","测试6");
// 向同一个Hash结构中添加另一个字段,字段名为"age",值为"24"
stringRedisTemplate.opsForHash().put("user:400","age","24");
// 获取Hash结构中的所有字段和值
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
// 打印Hash中的所有内容
System.out.println("entries = " + entries);
}
}
浙公网安备 33010602011771号