Redis 教程:Java 客户端 Jedis、连接池与 Spring Data Redis 入门

· Redis笔记 JAVA Redis 缓存 入门笔记 NoSQL · 0 阅读 · 约 9 分钟

前言

Redis 本身是 C 语言开发的,官方并没有直接提供 Java 客户端,但官方推荐了三种主流方案:Jedis、Lettuce 和 Redisson。本文记录 Jedis 的基本用法、连接池配置,以及 Spring Data Redis 的整合方式。

Jedis 快速入门

引入依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.1</version>
</dependency>

使用示例

import redis.clients.jedis.Jedis;

public class JedisDemo {
    public static void main(String[] args) {
        // 1. 建立连接,host 是 Redis 所在服务器的 IP
        Jedis jedis = new Jedis("192.168.1.100", 6379);
        // 2. 如果设置了密码需要认证
        // jedis.auth("123456");
        // 3. 选择库,默认 0
        jedis.select(0);

        // 4. 写入数据,方法名和 redis 命令一一对应
        jedis.set("name", "zhangsan");
        // 5. 读取数据
        String name = jedis.get("name");
        System.out.println(name);

        // 6. 释放资源
        jedis.close();
    }
}

方法名基本与 Redis 命令同名,set、get、hset、zadd 等都能直接使用,上手成本很低。

Jedis 连接池

每次 new Jedis() 都会建立 TCP 连接,频繁创建销毁开销很大,生产环境应该使用 JedisPool 连接池。

池化工具类

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 config = new JedisPoolConfig();
        config.setMaxTotal(8);        // 最大连接数
        config.setMaxIdle(8);         // 最大空闲连接
        config.setMinIdle(0);         // 最小空闲连接
        config.setMaxWaitMillis(200); // 最大等待时间
        jedisPool = new JedisPool(config, "192.168.1.100", 6379, 1000);
    }

    // 从池中获取连接,用完必须归还
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }
}

使用方式

Jedis jedis = JedisConnectionFactory.getJedis();
try {
    jedis.set("age", "18");
    System.out.println(jedis.get("age"));
} finally {
    jedis.close(); // 这里 close 是归还连接,不是关闭
}

注意:从连接池拿到的 Jedis 对象调用 close() 并不会真正断开连接,而是把连接归还给池子。

Spring Data Redis

Spring 对 Redis 做了封装,底层客户端可以在 Lettuce 和 Jedis 之间切换,默认使用 Lettuce,不需要手动管理连接。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置连接信息

spring:
  redis:
    host: 192.168.1.100
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8   # 最大连接
        max-idle: 8     # 最大空闲
        min-idle: 0     # 最小空闲
        max-wait: 1000  # 等待时间

使用 Lettuce 连接池需要额外引入 commons-pool2 依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

RedisTemplate 操作示例

@SpringBootTest
public class RedisTemplateTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("city", "beijing");
        Object city = redisTemplate.opsForValue().get("city");
        System.out.println(city);
    }

    @Test
    void testHash() {
        redisTemplate.opsForHash().put("user:1", "name", "lisi");
        Object name = redisTemplate.opsForHash().get("user:1", "name");
        System.out.println(name);
    }
}

常用 API 与 Redis 数据结构的对应关系:

  • opsForValue():对应 String
  • opsForHash():对应 Hash
  • opsForList():对应 List
  • opsForSet():对应 Set
  • opsForZSet():对应 SortedSet

序列化问题

RedisTemplate 默认使用 JDK 序列化,写入的数据在 redis-cli 里会看到乱码且占用空间大。常见做法是自定义序列化方式:

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(factory);
    // key 用 String 序列化
    template.setKeySerializer(RedisSerializer.string());
    // value 用 JSON 序列化
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(RedisSerializer.string());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
}

这样 key 和 value 都是可读的 JSON 格式,调试也方便。另一种思路是 key 用 String 序列化、value 统一用 JSON 字符串存取,配合 StringRedisTemplate 手动序列化,占用空间更小,适合对内存敏感的场景。

小结

  • Jedis 简单直接,API 与命令同名,适合学习和小项目,但要注意用连接池
  • Lettuce 基于 Netty,支持异步,Spring Boot 默认集成
  • Spring Data Redis 屏蔽了连接管理细节,实际项目中最常用,重点注意序列化配置