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依赖已自动引入,无需额外导包
相关推荐
xcl09251 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
龙腾AI白云3 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
一 乐3 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
zzj_2626103 小时前
MySQL常用操作
数据库·mysql
卓怡学长3 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn3 小时前
Spring 注解使用详解
java·spring
其实防守也摸鱼3 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
一条小小yu3 小时前
Spring IoC的理解
java·后端·spring
haerapi3 小时前
把 PostgreSQL 复制巡检做成可审计闭环:确定性采集、阈值判定与受控模型归纳
数据库·postgresql
落魄实习生4 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai