Redis基础day02

一、Jedis

1. Jedis官网地址

https://github.com/redis/jedis

2. 快速入门

(1)引入Maven依赖
xml 复制代码
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
(2)建立Redis直连
java 复制代码
private Jedis jedis;

@BeforeEach
void setUp(){
    //建立连接
    jedis = new Jedis("192.168.100.129", 6379);
    //设置密码
    jedis.auth("1234");
    //选择数据库
    jedis.select(0);
}
(3)测试String类型操作
java 复制代码
@Test
void testString(){
    //添加
    String result = jedis.set("name", "阳哥");
    System.out.println(result);
    //获取
    String name = jedis.get("name");
    System.out.println(name);
}
(4)释放连接资源
java 复制代码
@AfterEach
void tearDown(){
    if(jedis != null){
        jedis.close();
    }
}

3. Jedis连接池

使用原因

Jedis原生直连线程不安全 ;频繁创建、销毁TCP连接会产生大量性能开销,项目生产环境推荐使用Jedis连接池复用连接。

连接池工具类
java 复制代码
public class JedisConnectionFactory {
    private static 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.100.129", 6379, 1000, "1234");
    }

    // 从连接池获取Jedis连接
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

二、SpringDataRedis

简介

SpringDataRedis是Spring家族中用于数据访问的子模块,专门封装Redis客户端操作,底层支持Lettuce (默认,基于Netty异步非阻塞)与Jedis 两种客户端,提供统一RedisTemplateAPI简化Redis各类数据类型操作。

核心能力:

  1. 统一封装Redis五大常用数据类型操作API
  2. 原生支持发布订阅、哨兵、Redis集群
  3. 支持响应式编程、多种序列化方案
  4. 提供集合封装,可直接用Java集合方式操作Redis

1. 快速入门

(1)导入依赖
xml 复制代码
<!-- SpringBoot Redis Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
(2)application.yml 配置文件
yaml 复制代码
spring:
  data:
    redis:
      host: 192.168.100.129
      port: 6379
      password: 1234
      lettuce:
        pool:
          max-active: 8
          max-idle: 8
          min-idle: 0
          max-wait: 100
(3)注入模板并测试
java 复制代码
@Autowired
private RedisTemplate redisTemplate;

@Test
void testString() {
    //写入数据
    redisTemplate.opsForValue().set("name", "小王");
    //获取数据
    Object name = redisTemplate.opsForValue().get("name");
    System.out.println(name);
}

RedisTemplate 分类API对照表

API 返回值类型 说明
redisTemplate.opsForValue() ValueOperations 操作String字符串类型
redisTemplate.opsForHash() HashOperations 操作Hash哈希类型
redisTemplate.opsForList() ListOperations 操作List列表类型
redisTemplate.opsForSet() SetOperations 操作Set无序集合类型
redisTemplate.opsForZSet() ZSetOperations 操作SortedSet有序集合
redisTemplate 本身 RedisTemplate 通用Redis全局命令(删除key、设置过期时间、查询key等)

三、SpringDataRedis 序列化机制详解

1. 默认序列化规则与问题

RedisTemplate默认使用 JDK原生序列化

存入Redis时会把Java对象序列化为二进制字节数组,读取时再反序列化转回对象。

两大缺点
  1. 可读性极差 :Redis客户端查看key/value会显示乱码二进制串(对应你截图里的\xac\xed前缀乱码),无法直观查看存储内容;
  2. 内存冗余大 :JDK序列化会附带类路径、版本号等额外元信息,占用更多Redis存储空间。

2. 两种主流优化序列化方案

方案一:自定义RedisTemplate,全局JSON序列化

替换默认JDK序列化器,Key/HashKey使用字符串序列化Value/HashValue使用Jackson JSON序列化,存入Redis为标准JSON格式,兼顾可读性与便捷性。

java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(factory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key、hashKey 序列化方式为字符串
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置value、hashValue 序列化方式为JSON
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

优点:直接存入Java对象,框架自动序列化/反序列化,业务代码极简;

缺点:JSON中会额外携带@class字段记录实体类全限定名,依旧存在少量内存浪费。

方案二:使用原生 StringRedisTemplate(推荐)

SpringBoot内置StringRedisTemplate所有key、value强制只能存储String字符串 ,无任何默认序列化乱码问题。

需要存储Java对象时,手动借助ObjectMapper完成 对象 ↔ JSON字符串 互转

示例代码
java 复制代码
// Jackson提供,负责Java对象与JSON字符串双向转换
private static final ObjectMapper objectMapper = new ObjectMapper();

@Test
void testUser(){
    //创建实体对象
    User user = new User("虎哥", 21);
    //手动序列化:Java对象 → JSON字符串
    String json = objectMapper.writeValueAsString(user);
    //写入Redis
    stringRedisTemplate.opsForValue().set("user:200", json);
    //读取Redis字符串
    String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
    //手动反序列化:JSON字符串 → Java对象
    User user1 = objectMapper.readValue(jsonUser, User.class);
    System.out.println(user1);
}

优点:Redis存储纯JSON文本,无多余字段,内存占用最小、无乱码、排查数据极其方便;

缺点:存取对象需要手动序列化与反序列化,少量增加代码量。

补充说明

  • ObjectMapper属于Jackson框架核心工具类,SpringBoot web依赖已自动引入,无需额外导包
相关推荐
spter。18 小时前
一次 Redis SETNX 的小插曲,我重新理解了原子性
前端·redis·bootstrap
一只叫煤球的猫18 小时前
从 Java 21 到 Java 25:ThreadLocal 以外的选择—— ScopedValue
java·后端·架构
zcmodeltech18 小时前
工程机械与矿山机械沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的露天开采-井下掘进-智慧矿山全场景联动方案
数据库·stm32·单片机·嵌入式硬件·制造·多分类
曹牧18 小时前
Oracle:空值排序
数据库·oracle
SelectDB18 小时前
Apache Doris 与 StarRocks 深度对比:2026 年 OLAP 引擎选型指南
数据库
步行cgn18 小时前
MyBatis 多对一关联映射详解
java
仍然.18 小时前
SpringCloud---Eureka介绍
java·spring cloud·eureka
霸道流氓气质18 小时前
Spring 事务同步机制 —— AfterTransactionActionCollector 的异步解耦原理
java·后端·spring
lbb 小魔仙19 小时前
谁替 AI Agent 记住时间?——从航海钟到智能数据库,三百年时延坍缩史
数据库·人工智能·db
Lightpwd19 小时前
PostgreSQL jsonb 写入踩坑:一条 `\u0000` 如何让整批同步失败,还把异常伪装成“数据完整性冲突”
java