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依赖已自动引入,无需额外导包
相关推荐
Thanks_ks3 小时前
SQL 的 GROUP BY 与聚合函数:从会写 SELECT 到会做统计
数据库·sql·mysql·group by·数据统计·聚合函数·having
天天被压力3 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
IT规划师3 小时前
Redis 数据类型全解 - Stream 深度:消费者组、Pending 队列与死信处理(十)
redis·.net
Decay__12 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
笃行35012 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解
数据库
Wang's Blog12 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain13 小时前
C++转Java日记(03)
java·开发语言·c++
皮皮林55113 小时前
Java实现微信扫码登录
java
我是大猴子14 小时前
redis
数据库·redis·缓存
Yyyyyy~16 小时前
【Java】Day4Web基础知识
java·spring boot