SpringDataRedis客户端详解

news2025/1/18 4:29:04

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对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封装到了不同的类型中:
在这里插入图片描述

1. 快速入门

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

  • pom.xml文件中引入依赖
<!--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>
<!--Jackson依赖-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
  • application.yaml配置文件中 配置Redis

SpringDataRedis底层原理为 lettuce,如果想使用jedis,需要导入对应的依赖

spring:
  redis:
    host: 192.168.150.101
    port: 6379
    password: 123321
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 100ms
  • 自定义序列化

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,导致可读性差和内存占用大

jdk序列化
自定义RedisTemplate的序列化方式:

package com.example.springdataredisdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

import javax.annotation.Resource;

@Configuration
public class RedisConfig {
    @Bean
    @Resource
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}
  • 编写测试类
package com.example.springdataredisdemo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import javax.annotation.Resource;

@SpringBootTest
class SpringDataRedisDemoApplicationTests {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

	// value值为字符串
    @Test
    void testString() {
        // 写入一条String数据
        redisTemplate.opsForValue().set("name", "黄宇诗是一个笨蛋");
        // 获取string数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }

	// value值为User对象
	@Test
    public void testUser(){
        redisTemplate.opsForValue().set("heima:user:7",new User(7,"lyq",19));
        User user = (User) redisTemplate.opsForValue().get("heima:user:7");
        System.out.println("user: " + user);
    }

}

这里采用了JSON序列化来代替默认的JDK序列化方式。最终结果如图:
在这里插入图片描述
整体可读性有了很大提升,并且能将Java对象自动的序列化为JSON字符串,并且查询时能自动把JSON反序列化为Java对象。不过,其中记录了序列化时对应的class名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。

  • StringRedisTemplate

为了节省内存空间,我们可以不使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。

在这里插入图片描述

package com.example.springdataredisdemo;

import com.example.springdataredisdemo.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.annotation.Resource;

@SpringBootTest
class Tests {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    // JSON序列化工具
    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    public void testString() {
        // 写入一条String数据
        stringRedisTemplate.opsForValue().set("name", "黄宇诗");
        // 获取string数据
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }

    @Test
    public void testUser() throws JsonProcessingException {
        // 创建对象
        User user = new User(8,"陆云巧", 19);
        // 手动序列化
        String json = mapper.writeValueAsString(user);
        // 写入数据
        stringRedisTemplate.opsForValue().set("heima:user:8", json);
        // 获取数据
        String jsonUser = stringRedisTemplate.opsForValue().get("heima:user:8");
        // 手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println("user1 = " + user1);
    }

	// 测试Hash类型
    @Test
    public void testHash(){
        stringRedisTemplate.opsForHash().put("heima:user:9","id","9");
        stringRedisTemplate.opsForHash().put("heima:user:9","name","孙彩霞");
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("heima:user:9");
        System.out.println("entries:" + entries);
    }

}

String手动序列化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

乡村振兴吹响品牌号角——首届中国乡村振兴品牌大会成功举办

“品牌是力量&#xff0c;是变量&#xff0c;也是流量。”这是浙江省衢州市人大常委会副主任、常山县委书记潘晓辉在首届中国乡村振兴品牌大会上分享的乡村振兴实践体会&#xff0c;引发与会代表的广泛共鸣。 首届中国乡村振兴品牌大会主会场 4月10日至11日&#xff0c;以“加…

计组2.2——数据在计算机中的存储

计组2.2定点数和浮点数定点数无符号数有符号数的定点表示——定点整数和定点小数移位运算1.算术移位1.原码算数移位2.反码算数移位3.补码算术移位4.计算机硬件的乘法是基于算数移位和加法完成的2.逻辑移位3.循环移位加减运算溢出判断硬件判断溢出法一&#xff1a;单一符号位法二…

51单片机语音提示盲人拐杖整点报时夜间警示超声波测距

实践制作DIY- GC0128-语音提示盲人拐杖 一、功能说明&#xff1a; 基于51单片机设计-语音提示盲人拐杖 二、功能介绍&#xff1a; 硬件组成&#xff1a; STC89C52单片机最小系统LCD1602显示器红色LED灯ADC0832光敏电阻采集光强DY-SV17F语音播报模块HSR04超声波测距多个按键…

如何在facebook上打造成功的个人品牌?马克·扎克伯格告诉你!

在现代商业社会中&#xff0c;一个企业成功的关键之一是打造出良好的企业形象&#xff0c;即所谓的“人设”。一个好的企业形象可以让消费者产生信任感和归属感&#xff0c;从而吸引更多的客户和业务机会。而如今&#xff0c;社交媒体成为了一个打造企业形象的重要工具&#xf…

JS操作文本域获取光标/指定位置插入

学习链接 js 如何获取与设置光标在input框的位置 在输入框/文本域中光标位置插入字符串 Web 中的“选区”和“光标” 可参考另外一篇&#xff1a;vue.js支持表情输入&#xff0c;这个比操作 div简单多了。 效果图 代码 <style scoped> textarea {outline: none;res…

微信小程序开发 | API应用案例(下)

API应用案例&#xff08;下&#xff09;6.1【案例5】模拟时钟6.1.1 案例分析6.1.2 前导知识6.1.3 钟表页面布局6.1.4 钟表页面绘制6.2【案例6】罗盘动画6.2.1 案例分析6.2.2 前导知识6.2.3 设计罗盘页面布局6.2.4 手指触摸旋转罗盘6.2.5 单击按钮操作罗盘6.3【案例7】文件上传与…

总结821

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;早上背颂并默写第19篇文章《I always knew I was going to be rich》&#xff0c;还有两三篇就达成…

Xamarin 可能的替代者.NET MAUI

Xamarin&#xff0c;虽然在 Android、iOS 和 Windows 上做得很好&#xff0c;但我们很快就会忘掉它。Xamarin的替代者已接近完成正式版并且有许多的改进&#xff1a; .NET MAUI。 就像很多人知道的那样&#xff0c;Xamarin 是微软专注于移动应用程序( iOS、Android和Windows)并…

JavaSE学习进阶day04_05 常见算法和泛型

9.1 排序概述 另外一种排序的方式&#xff0c;每一次比较完毕之后&#xff0c;本次循环中最大的数字就跑到右边去了 建议复习一下数据结构的排序章节 代码实现就不再说了&#xff0c;大家可以尝试写&#xff0c;但是我们今后一般都调用java里已经写好的排序算法。在C里也有已…

【AXU3EG】UltraScale+ MPSoC以及开发板介绍

Copyright © 2012-2020 芯驿电子科技&#xff08;上海&#xff09;有限公司 UltraScale MPSoC Zynq UltraScale MPSoC 系列是 Xilinx 第二代平台&#xff0c;其在 FPGA 内部集成了完整 ARM 处理子系统&#xff08;PS&#xff09;&#xff0c;包含了四核 Cortex-A53 加双核…

03-深度学习

一、适合图像处理的卷积神经网络 1. 为什么卷积神经网络适合图像处理? 如上图所示,如果使用全连接神经网络的话,输入图像大小为 1024x1024,第一层隐层神经元个数为 1000,第一层权重数量级为 109,过多的参数会导致过拟合。而卷积神经网络可以有效减少权重数量。 2. 卷积神…

HTML5 表单元素

文章目录HTML5 表单元素HTML5 新的表单元素HTML5 \<datalist> 元素HTML5 \<keygen> 元素HTML5 \<output> 元素HTML5 新表单元素HTML5 表单元素 HTML5 新的表单元素 HTML5 有以下新的表单元素: <datalist><keygen><output> 注意:不是所有…

【LLM】Windows本地CPU部署民间版中文羊驼模型踩坑记录

目录 前言 准备工作 Git Python3.9 Cmake 下载模型 合并模型 部署模型 前言 想必有小伙伴也想跟我一样体验下部署大语言模型, 但碍于经济实力, 不过民间上出现了大量的量化模型, 我们平民也能体验体验啦~, 该模型可以在笔记本电脑上部署, 确保你电脑至少有16G运行…

HTML学习(3)

文章目录HTML计算机代码HTML5语义元素HTML5 代码约定HTML字符集与符号HTML URLHTML 背景我的个人博客&#xff1a;欢迎来逛逛 HTML计算机代码 支持固定的字母尺寸和间距&#xff1a;<kbd> <samp> <code> <html><body><p>open a file,sel…

应用信息资源管理(张士玉、董焱)——第一章 总论

第一章 总论 1.1 信息社会 1.1.1 信息社会的形成 信息社会是指以信息技术为基础&#xff0c;信息产业为支撑&#xff0c;信息化为主要特征的社会形态。其形成经历了以下几个阶段&#xff1a; 信息化初期&#xff1a;20世纪60年代至70年代&#xff0c;电子计算机的出现和发展…

HummerRisk V1.0.0:架构全面升级,开启新篇章

HummerRisk V1.0.0发布&#xff1a; HummerRisk 由 SpringBoot 单体架构升级为 SpringCloud 微服务架构&#xff0c;性能和效率显著提升。同时新增 K8s 的检测规则组和规则实现&#xff0c;并优化多个模块的设计逻辑。 HummerRisk 保持高速的迭代&#xff0c;期待您的关注。 …

Cesium实践(3)——坐标系与相机系统

文章目录前言Cesium 坐标系屏幕坐标系空间直角坐标系WGS-84坐标系坐标系转换角度与弧度互转84坐标转笛卡尔空间坐标笛卡尔空间坐标转84坐标屏幕坐标转笛卡尔空间坐标笛卡尔空间直角坐标转屏幕坐标Cesium相机默认交互相机姿态参数常用方法DEFAULT_VIEW_RECTANGLEsetViewflyToflo…

关于DMA的笔记

DMA(Direct Memory Access, 直接储存器访问)&#xff0c;是部分总线架构提供的功能&#xff0c;DMA传输功能能将数据从一个地址空间复制到另一个地址空间&#xff0c;实现从附加设备/外设与储存器或储存器与储存器之间的高速传输。 我们结合案例解释DMA的功能&#xff1a;在我…

HTTPS 加密协议

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录HTTPS"加密" 是什么HTTPS 的工作过程引入证书HTTPS http 安全层 (SSL) SSL 用来加密的协议&#xff0c;也叫 TLS …

类型转换——C++

1. C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c; C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换…