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);
    }
}
posted @ 2025-09-09 17:06  雨花阁  阅读(19)  评论(0)    收藏  举报