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依赖已自动引入,无需额外导包
相关推荐
瑞克-桑切斯1 小时前
企业生产环境:https部署+nginx高可用(业务不中断)
linux·服务器·数据库
Pniubi7 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko78 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师8 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.8 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼9 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
zyseo810 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
福兮说10 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
xiaogai_gai11 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
紧跟先前的步伐12 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang