java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java连接并操作Redis

Java连接并操作Redis超详细教程

作者:Code哈哈笑

在分布式系统和高并发场景中,Redis 作为高性能内存数据库的地位举足轻重,对于 Java 开发者而言,掌握 Redis 的连接与操作是进阶必备技能,本文从 Java 操作 Redis 的核心需求出发,通过完整代码示例与逐行解析,需要的朋友可以参考下

引言

在分布式系统和高并发场景中,Redis 作为高性能内存数据库的地位举足轻重。对于 Java 开发者而言,掌握 Redis 的连接与操作是进阶必备技能。然而,从基础的 Jedis 原生客户端到 Spring 封装的 RedisTemplate,不同连接方式的原理与适用场景常让初学者困惑。如何选择合适的连接方式?序列化配置背后的逻辑是什么?生产环境中又该如何优化?

本文从 Java 操作 Redis 的核心需求出发,通过完整代码示例与逐行解析,系统讲解 Jedis 直接连接、连接池、RedisTemplate 及 StringRedisTemplate 的使用方法,深入剖析连接原理、序列化机制与性能优化策略。无论你是刚接触 Redis 的小白,还是需要规范项目实践的开发者,都能从代码细节与原理分析中获得启发,掌握从基础连接到高级应用的全流程实战技巧。

1. Redis 基础概念与 Java 生态概览

1.1 Redis 是什么?

Redis(Remote Dictionary Server)是一个基于内存的高性能键值对存储系统,具有以下核心特性:

在 Java 生态中,主流的 Redis 客户端包括:

1.2 Java 操作 Redis 的核心场景

2.Jedis 原生客户端:从直接连接到连接池

2.0 Maven依赖

<!--        Jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>

2.1 Jedis 直接连接(非池化方式)

2.1.1 核心代码解析

@Slf4j
@SpringBootTest
public class JedisDirect {
    private Jedis jedis;

    @BeforeEach
    public void setUp(){
        //建立连接
        jedis = new Jedis("x.x.x.x",6379);

        //设置密码
        jedis.auth("xxxx");

        //选择库
        jedis.select(0);
    }

    @Test
    public void testString(){
        jedis.set("namePool","zhangsanPool");
        String value = jedis.get("name");
        log.info("value:"+value);
    }

    @Test
    public void testHash(){
        jedis.hset("user:2","name","lisiPool");
        jedis.hset("user:2","age","21");
        Map<String,String> map = jedis.hgetAll("user:1");

         log.info("map:"+ map.toString());
    }


    @AfterEach
    public void tearDown(){
        if(jedis != null){
            jedis.close();
        }
    }


}

代码的执行结果:

结果1:

在这里插入图片描述

结果2:

在这里插入图片描述

2.1.2 核心类与对象

Jedis:核心客户端类,封装了所有 Redis 命令

构造方法:Jedis(String host, int port) 初始化连接

常用方法:

@BeforeEach/@AfterEach:JUnit5 生命周期注解,分别用于初始化和销毁资源

2.1.3 原理分析

连接过程:

命令执行:

2.1.4 优缺点

2.2 Jedis 连接池(池化连接)

2.2.1 连接池配置类

public class JedisConnectionFactory {
    private static final JedisPool jedisPool;

    static{
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

        //最大连接
        jedisPoolConfig.setMaxTotal(10);
        //最大空闲连接
        jedisPoolConfig.setMaxIdle(10);
        //最小空闲连接
        jedisPoolConfig.setMinIdle(5);

        //设置最长等待时间
        jedisPoolConfig.setMaxWaitMillis(200);

        jedisPool = new JedisPool(jedisPoolConfig,"x.x.x.x",6379,
                1000,"xxxx");

    }

    //获取jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

说明:

JedisPool:连接池核心类,管理连接的创建和回收

JedisPoolConfig:连接池配置类,常用参数:

maxWaitMillis:获取连接超时时间(避免无限阻塞)

2.2.2 连接池工作原理

初始化阶段:

获取连接:

归还连接:

2.2.3 使用示例

@Slf4j
@SpringBootTest
public class JedisPool {

    private Jedis jedis;

    @BeforeEach
    public void setUp(){
        //建立连接
        jedis = JedisConnectionFactory.getJedis();

        //设置密码
        jedis.auth("dhj20030916.");

        //选择库
        jedis.select(0);
    }

    @Test
    public void testString(){
        jedis.set("name","zhangsan");
        String value = jedis.get("name");
        log.info("value:"+value);
    }

    @Test
    public void testHash(){
        jedis.hset("user:1","name","lisi");
        jedis.hset("user:1","age","21");
        Map<String,String> map = jedis.hgetAll("user:1");

        log.info("map:"+ map.toString());
    }


    @AfterEach
    public void tearDown(){
        if(jedis != null){
            jedis.close();
        }
    }
}

运行结果:

结果1:

在这里插入图片描述

结果2:

在这里插入图片描述

2.2.4 优势对比

特性直接连接连接池方式
连接创建每次新建复用已有连接
并发支持差好(控制连接数)
资源利用率低高
性能差(连接开销)好(减少握手)
适用场景单线程测试高并发生产环境

3. Spring Data Redis:高层抽象与模板化操作

3.1 核心依赖与配置

3.1.1 Maven 依赖

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

3.1.2 YAML 配置

spring:
  redis:
    host: x.x.x.x
    port: 6379
    password: xxxx
    lettuce:
      pool:
        max-active: 10 #最大连接
        max-idle: 10   #最大空闲连接
        min-idle: 0    #最小空闲连接
        max-wait: 100  #连接等待时间

3.2 RedisTemplate 核心类解析

3.2.1 基础操作示例

@SpringBootTest
@Slf4j
public class RedisTem {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test(){

        //插入一条String类型的数据
        redisTemplate.opsForValue().set("nameTem","赵六");
        Object s = redisTemplate.opsForValue().get("nameTem");
        log.info("nameTem:"+ s);
    }
}

运行结果:

在这里插入图片描述

3.2.2 核心类结构

RedisTemplate:

泛型参数:<K, V> 分别表示键和值的类型

核心方法:

RedisConnectionFactory:

3.3 序列化机制详解

3.3.1 默认序列化问题

Spring Data Redis 默认使用JdkSerializationRedisSerializer:

3.3.2 JSON 序列化配置

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {

        // 创建redisTemplate对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        //设置连接工厂
        redisTemplate.setConnectionFactory(connectionFactory);

        // 创建json序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置Key的序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);

        return redisTemplate;

    }
}

3.3.3 序列化流程

存储数据:

读取数据:

3.4 对象存储实战(序列化配置后)

3.4.1 User 实体类

@Data
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

3.4.2 测试代码

@SpringBootTest
@Slf4j
public class RedisTemSer {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testString(){
        redisTemplate.opsForValue().set("nameTemSer","test");
        String value = (String)redisTemplate.opsForValue().get("nameTemSer");
        log.info("value"+ value);
    }

    @Test
    public void testHash(){
        redisTemplate.opsForHash().put("user:3","name","hash");
        redisTemplate.opsForHash().put("user:3","age","22");
        Map<String,Object> map = (Map<String,Object>)redisTemplate.opsForHash().entries("user:3");
        log.info("map"+ map);
    }

    @Test
    public void testObject(){
        User user = new User();
        user.setId(1);
        user.setName("object");
        user.setAge(20);

        redisTemplate.opsForValue().set("User",user);

        Object object = redisTemplate.opsForValue().get("User");
        log.info("object"+ object);
    }

}

运行结果:

结果1:

在这里插入图片描述

结果2:

在这里插入图片描述

结果3:

在这里插入图片描述

3.4.3 关键细节

类型转换:

Hash 操作:

4. StringRedisTemplate:专注字符串场景

4.1 基本概念

StringRedisTemplate 是 RedisTemplate<String, String> 的子类

默认配置:

4.2 对象操作实战

4.2.1 测试代码

@Slf4j
@SpringBootTest
public class StringRedisTem {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    public void testObject() throws JsonProcessingException {
        User user = new User();
        user.setId(2);
        user.setName("StringRedisTem");
        user.setAge(20);

        // 手动序列化value
        String json = mapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set("UserRedis", json);

        // 获取数据
        String val = stringRedisTemplate.opsForValue().get("UserRedis");

        // 手动反序列化
        User userValue = mapper.readValue(val,User.class);
        log.info(userValue.toString());
    }


}

运行结果:

在这里插入图片描述

4.2.2 核心步骤解析

序列化:

存储与获取:

反序列化:

4.3 与 RedisTemplate 的对比

特性RedisTemplateStringRedisTemplate
泛型参数<K, V> 任意类型<String, String>
序列化支持自定义序列化固定 String 序列化
对象操作自动序列化 / 反序列化需手动序列化 / 反序列化
键类型任意类型(需序列化)只能是 String 类型
适用场景复杂数据类型(对象、Hash 等)纯字符串场景(如缓存文本)

5. 连接方式深度对比与选型建议

5.1 技术维度对比

维度Jedis 直接连接Jedis 连接池RedisTemplateStringRedisTemplate
连接管理手动创建连接池管理框架管理框架管理
序列化支持无(需手动)无支持自定义仅 String 序列化
Spring 集成弱弱强(自动装配)强(自动装配)
学习成本低中中低
并发性能差优优优

5.2 场景化选型建议

5.2.1 学习阶段

推荐使用 Jedis 直接连接:

5.2.2 小型项目(非 Spring)

推荐 Jedis 连接池:

5.2.3 Spring Boot 项目

优先使用 RedisTemplate:

5.2.4 纯字符串场景

使用 StringRedisTemplate:

5.3 生产环境最佳实践

连接池配置:

序列化选择:

异常处理:

监控与调优:

6. 常见问题与解决方案

6.1 连接失败问题

现象:

可能原因:

解决方案:

6.2 数据乱码问题

现象:

Redis 存储的字符串在 Java 中获取时出现乱码

可能原因:

解决方案:

Jedis 中指定编码:

jedis.get("key", StandardCharsets.UTF\_8); // 显式指定编码

RedisTemplate 统一使用 String 序列化:

template.setKeySerializer(RedisSerializer.string());

6.3 对象反序列化失败

现象:

可能原因:

解决方案:

7. 扩展知识:异步客户端 Lettuce

7.1 Lettuce 简介

7.2 核心差异

特性JedisLettuce
IO 模型同步阻塞异步非阻塞
连接方式每个线程一个连接单个连接处理多个请求
线程安全非线程安全线程安全
适用场景简单同步场景异步 / 反应式场景

7.3 配置示例

spring:
  redis:
    host: 1.94.22.150
    port: 6379
    password: dhj20030916.
    lettuce:
      pool:
        max-active: 10 #最大连接
        max-idle: 10   #最大空闲连接
        min-idle: 0    #最小空闲连接
        max-wait: 100  #连接等待时间

8. 总结:从入门到实战的成长路径

8.1 学习阶段建议

8.2 核心知识图谱

在这里插入图片描述

8.3 结语

通过本文的系统学习,读者应能熟练掌握 Java 操作 Redis 的主流方式,理解不同连接方式的适用场景和底层原理,并能够在实际项目中根据需求选择合适的技术方案。记住,实践是最好的老师,建议通过实际项目练习加深理解,遇到问题时结合官方文档和源码进行分析,逐步提升 Redis 开发与运维能力。

以上就是Java连接并操作Redis超详细教程的详细内容,更多关于Java连接并操作Redis的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文