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依赖已自动引入,无需额外导包
相关推荐
zzzll111136 分钟前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
三8448 小时前
redis防御加固与安全基线
数据库·redis·安全·应急响应·防御
lhldsg8 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都8 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
SendTomo8 小时前
【技术交流】从0到1构建一个汉字学习平台:汉字吧(hanzi8.com)的技术架构猜想
redis·mysql·nginx·php·个人开发
泡海椒8 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye8 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
IT大白鼠8 小时前
MySQL 分布式集群系列 · 第四篇——实操部署指南:从零搭建生产级 MySQL NDB 集群
数据库·分布式·mysql
IT大白鼠8 小时前
MySQL 分布式集群系列 · 第三篇——核心原理精讲:NDB 自动分片、多主写入与数据同步
数据库·分布式·mysql