当前位置: 首页 > article >正文

SpringDataRedis 操作 Redis,并指定数据序列化器

文章目录

  • 1. SpringDataRedis 概述
  • 2. 快速入门
    • 2.1 导入pom坐标
    • 2.2 配置文件
    • 2.3 测试代码
    • 2.4 数据序列化器
    • 2.5 StringRedisTemplate
    • 2.6 总结



在这里插入图片描述

1. SpringDataRedis 概述

SpringDataSpring 中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做 SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

在这里插入图片描述


2. 快速入门

SpringBoot 已经提供了对 SpringDataRedis 的支持,使用非常简单:

2.1 导入pom坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.snow</groupId>
    <artifactId>studyRedis</artifactId>
    <version>1.0</version>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>


    <dependencies>
        <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--common-pool-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

2.2 配置文件

spring:
  redis:
    host: 192.168.98.98
    port: 6379
    password: snow
    lettuce:
      pool:
        max-active: 8  #最大连接
        max-idle: 8   #最大空闲连接
        min-idle: 0   #最小空闲连接
        max-wait: 100ms #连接等待时间

2.3 测试代码

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void testString() {
        // 写入一条String数据
        redisTemplate.opsForValue().set("age", "20");
        // 获取string数据
        Object age = redisTemplate.opsForValue().get("age ");
        System.out.println("age = " + age );
    }
}

2.4 数据序列化器

RedisTemplate 可以接收任意 Object 作为值写入 Redis

只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

在这里插入图片描述

缺点:

  • 可读性差
  • 内存占用较大

我们可以自定义 RedisTemplate 的序列化方式,代码如下:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建 RedisTemplate 对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建 Fastjson 序列化工具
        FastJsonRedisSerializer<Object> jsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        // 设置 Key 序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置 Value 序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

这里采用了 JSON 序列化来代替默认的 JDK 序列化方式。最终结果如图:

在这里插入图片描述

整体可读性有了很大提升,并且能将Java对象自动的序列化为JSON字符串,并且查询时能自动把JSON反序列化为Java对象。

不过,其中记录了序列化时对应的 class 名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。


2.5 StringRedisTemplate

尽管之前 JSON 的序列化方式可以满足我们的需求,但依然存在一些问题,如图:

在这里插入图片描述

为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间

在这里插入图片描述

这种用法比较普遍,因此 SpringDataRedis 就提供了 RedisTemplate 的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。

省去了我们自定义RedisTemplate的序列化方式的步骤,而是直接使用:

@SpringBootTest
class RedisStringTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testSaveUser() {
       // 写入一条String数据
        ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
        Student student = new Student(2, "swallow", 12);
        opsForValue.set("swallow", JSON.toJSONString(student));
    }

}

此时我们再来看一看存储的数据,小伙伴们就会发现那个class数据已经不在了,节约了我们的空间(节约了一半呢~~~)~

在这里插入图片描述


当使用了 fastjson 作为序列化方式后,也可以使用 redisTemplate :

 @Test
    void testString3() {
        // 写入一条String数据
        ValueOperations opsForValue = redisTemplate.opsForValue();
        Student student = new Student(12, "刘德华", 42);
        opsForValue.set("liudehua", student);
        System.out.println("liudehua:" + opsForValue.get("liudehua"));
    }

在这里插入图片描述


2.6 总结

RedisTemplate的两种序列化实践方案:

  • 方案一:

    • 自定义RedisTemplate
  • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

    会占用额外的内存空间 记录字节码

  • 方案二:

    • 使用StringRedisTemplate
    • 写入Redis时,手动把对象序列化为JSON
    • 读取Redis时,手动把读取到的JSON反序列化为对象

在这里插入图片描述


http://www.kler.cn/news/159866.html

相关文章:

  • git 克隆无权限-重新输入账号密码
  • 文献阅读:基于改进ConvNext的玉米叶片病害分类
  • 计算机网络之网络传输,三次握手和四次挥手
  • 结构体精讲1
  • vscode插件离线下载
  • 国产智能运维操作系统新选择-浪潮KeyarchOS
  • DockerCompose修改某个服务的配置(添加或编辑端口号映射)后如何重启单个服务使其生效
  • Selenium 中并行测试的重要性!
  • java面试题-Hashmap、Hashtable、ConcurrentHashMap原理
  • 微信小程序基础bug
  • 学生档案管理系统设计
  • AI界的“复仇者联盟”:Meta和IBM领衔50+机构对决OpenAI
  • 如何关闭vue项目中的[eslint]校验
  • 纠正性反馈回路
  • 上门安装维修平台开发之产品模型属性设计解析
  • 学习UnitTest框架,轻松打造无懈可击的代码!
  • 外包干了2个月,技术倒退2年。。。
  • MySQL四 | 约束
  • C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)
  • ZPLPrinter Emulator SDK for .NET 6.0.23.1123​ Crack
  • 数据科学:Scipy、Scikit-Learn笔记
  • 汽车内饰灯不亮问题修复
  • Redis滚动分页的使用
  • MySQL Binlog Digger 4.31
  • ubuntu上创建服务启动python脚本
  • visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较
  • Codeforces Round 913 (Div. 3) A~E
  • 通过docker安装人大金仓数据库并挂在数据卷
  • LeetCode860. Lemonade Change
  • crui_lvgl 一个LVGL的DSL辅助工具的设想