SpringBoot——整合Redis

news2024/11/17 15:26:36

简单介绍

redis是一款key-velue存储结构的内存级NoSQL数据库

  • - 支持多种数存储格式
  • - 支持持久化
  • - 支持集群

简单理解成一个大Map,反正我就是这么理解的。当然他的内部有很多复杂的数据类型和操作,咱们在这里就不过多赘述了。

安装并简单的使用Redis

首先你要操作Redis你得先有Redis的服务,那么第一步就是安装Redis,在Ubuntu中操作如下:

sudo apt update
sudo apt install redis-server

操作完成之后,我们的Redis的服务就已经安装好了,然后就是查看Redis服务的运行状态: 

sudo systemctl status redis-server

正常的情况下,你会看到这些提示信息: 这就表示你已经安装完成并且服务已经启动了。

关于Redis的操作,我们这里只介绍一下基本的增删查,要想更深入地学习Redis,那你不应该来这里。

首先我们在控制台上输入命令:redis-cli 就会进入Redis的客户端,在这里可以看到Redis的IP地址和端口号,这里都是保持默认状态的。然后我们在命令行里输入内容: 

之前我们说Redis是以键值对的方式存储数据的,那么在这里,set表示插入数据的操作,Redis没有表这些概念,你可以直接开始就操作数据,第二个spring表示键,anythen表示值。也就是说在之后的操作中,我们可以根据spring查到到他对应的只anythen: 

get表示获取,根据键获取对应的值,在这里我们用spring获取到了它对应的值anythen。

SpringBoot集成Redis

其实SpringBoot集成任何的第三方技术就那么几个步骤,首先导入坐标,然后编写配置,自动注入操作对象完成操作:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

上面就是操作redis的坐标,我们在Pom文件中添加这个坐标就可以引入一个操作Redis的对象,然后我们去编写配置文件:

当我们在配置文件中敲上一个redis之后,会弹出很多的提示项,其中中间的redis在前面的都是关于Redis数据库的配置项,其他的不是,其他的都是第三方技术基于Redis的解决方案的配置项,并且我们主要用到的两个配置项host和port都有了默认的配置,也就是我们当前使用的默认配置,所以其实这里的配置不写也行,但是为了演示一下作用,我们现在先加上:

spring:
  redis:
    host: localhost
    port: 6379

配置就完成了,然后来到测试类中,对Redis进行一个增加数据和读写数据的测试:

@SpringBootTest
public class RedisTest {
    @Test
    public void SetTest(@Autowired RedisTemplate redisTemplate){
        ValueOperations value = redisTemplate.opsForValue();
        value.set("springBoot","RedisOnSpringBoot");
    }
    @Test
    public void GetTest(@Autowired RedisTemplate redisTemplate){
        ValueOperations value = redisTemplate.opsForValue();
        Object o = value.get("springBoot");
        System.out.println(o);
    }
}

上面的代码就是通过RedisTemplate去操作Redis的测试代码,其实关键的就是通过自动注入的方式,获取操作Redis的对象RedisTemplate,然后再去获取Redis中不同数据结构的操作对象ops,之后通过ops去添加,查询对象,我们运行两个测试方法,会在控制台中查出我们刚才插入的数据: 

在一大堆的配置文件中找到了数据,这个就是我们在测试方法中添加进入的数据。

总结 

在SpringBoot集成Redis中,其实就是一个启动服务,然后导入坐标,编写配置,获取RedisTemplate对象操作Redis的过程,其他的操作由于我们没有Redis基础所有我们也没办法做过多的操作,但是最基础的SpringBoot对于Redis的集成到这里就完成了。

两个不同的API

之前我们在控制台里操作了一个数据,然后再SpringBoot环境下又操作了一个值,那么按照道理来想,我既然操作的是一个数据库,那么我无论在哪里应该都能获取到我写入的值对吧,我们在控制台里看一下:

当我想要获取springBoot这个键对应的值的时候,很不幸,查不到,并不是值写错了的问题,而是确确实实的查不到,那么再来SpringBoot中查找我们在控制台操作的值:

和不幸,也没有找到,也就是说我们明明操作的是一个数据库,但是操作的结果谁也查不到谁,那就很奇怪了,这是因为在操作Redis的时候,他提供了两个API供我们使用,一种是我们刚才使用的RedisTemplate,另一种就是专门为了操作字符串而出现的StringRedisTemplate: 

    @Test
    public void GetTest2(@Autowired StringRedisTemplate stringRedisTemplate){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String spring = ops.get("spring");
        System.out.println(spring);
    }

 也就是说,这个API才是和我们在控制台上操作的API是同一个,只有通过这个才能查询到刚才我们在控制台中设置的变量,现在我们运行这个新的测试类查看一下运行结果:

现在就能查询到刚才我们在控制台操作的数据了,其实这个API和刚才的API操作的ops是同一个,只不过区别在于两个类的泛型不同: 

注意看这里的区别。在没有指定泛型的时候默认的泛型类型是Object也就是对象,只有指定了泛型的类型是String之后才能操作字符串,与控制台保持一致。 

具体的区别就是如果你不指定泛型的话,在写入数据库的时候,会将字符当做对象进行序列化,到时候就不是看到的字符串了,而如果指定他为字符串的话,就会不进行序列化直接存储,与控制台的操作等效。

其实手动指定泛型的效果是一样的。

两个客户端

Redis提供了两个客户端,一个是比较老的jedis,以及一个比较新的lettuce,在当前的环境中默认使用的是lettuce,如果你想要切换成jedis,那么你需要进行以下几个方面的修改。

首先导入jedis客户端的坐标:

<dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
</dependency>

由于SpringBoot默认维护了jedis的最优的版本,所以在SpringBoot中不需要多写版本号。然后我们需要在配置文件中将客户端的类型修改成jedis:

spring:
  redis:
    host: localhost
    port: 6379
    client-type: jedis

然后我们其他的什么都不用改,直接启动刚才做的测试类即可:

如果测试通过,则说明当前操作的客户端已经修改成了jedis,并且运行成功了。 

并且在修改了客户端类型之后,可以对相应的客户端进行更加丰富的配置,至于为什么会出现两个客户端,是因为jedis客户端作为早期的客户端,依然还有人在用,而lettcus作为新的客户端,实现的技术不一样,就容易导致在更换客户端技术的时候对老技术有不兼容的可能性,所以除了支持最新的客户端,对于老产品的兼容也是很重要的。

lettcus与jedis的区别:

jedis链接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个链接专用,这样整体性能就大受影响。

lettcus基于Netty框架与Redis服务器连接,底层设计中蚕蛹StatusFulRedisConnection。StatusFulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个链接可以被多线程复用。当然Lettcus也支持多连接实例一起工作。

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

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

相关文章

JVM-类加载

1.了解冯诺依曼计算机结构 1.1计算机处理数据过程 (1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来 (2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令 (3)执行阶段:再由控制器把需要处理或计算的数据调入运算器 (4)最终阶段:由输出设备把最后运…

postgresql13远程连接报错 Connection to 117.50.184.237:5432 refused. Check that the hostname and port are c

报错信息 Connection to hostname:port refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. Connection refused: no further information 解决方案 修开配置文件 vim /var/lib/pgsql/13/data/postgresql.conf…

二叉树某个节点的深度

微信公众号&#xff1a;码云成化 关注可了解更多的教程及进阶技巧。问题或建议&#xff0c;请公众号留言;如果你觉得阿云对你有所帮助&#xff0c;欢迎赞赏 深度的定义 [ 当前结点的层数。默认叶子节点是 null 节点&#xff0c;深度是 0 。其子节点是 null 节点&#xff0c;深…

JAVA基础-多线程入门(详解)

目录 引言 一&#xff0c;线程概念 二&#xff0c;创建线程 2.1&#xff0c;继承Thread类&#xff0c;重写run方法 2.2&#xff0c;实现Runnable接口&#xff0c;重写run方法&#xff0c;实现Runnable接口的实现类的实例对象作为Thread构造函 数的target 2.3&#xff0c;通…

【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C# SourceGenerator 源生成器初探

简介 注意&#xff1a; 坑极多。而且截至2023年&#xff0c;这个东西仅仅是半成品 利用SourceGenerator可以在编译结束前生成一些代码参与编译&#xff0c;比如编译时反射之类的&#xff0c;还有模板代码生成都很好用。 演示仓库传送门-Github-yueh0607 使用 1. 创建项目 …

EPICS asyn测试程序--如何连接asynManager

这是一个如何连接asynManager的示例。这个示例放在<top>/testApp中并且包含以下组件&#xff1a; rootorangepi5:/usr/local/EPICS/program/asynTest/testApp# ls -R .: Db Makefile src./Db: Makefile test.db./src: echoDriver.c echoDriver.dbd Makefile testM…

3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

本文目录如下&#xff1a; 七、JVM一、JVM 基础什么是Java虚拟机?Java对象 创建过程?对象有哪几种引用&#xff1f; 二、内存管理说⼀下 JVM 的内存区域 (堆 和 栈)&#xff1f;内存溢出 和 内存泄漏 是什么意思&#xff1f;内存泄漏可能由哪些原因导致呢&#xff1f;Java 堆…

OceanMind海睿思助力南京钢铁苏粮集团入选中国信通院审计“领航”案例

近日&#xff0c;由中国内部审计协会指导&#xff0c;中国信息通信研究院主办的2023年内部审计数字化转型“领航”案例征集结果公布。 其中&#xff0c;中新赛克海睿思参与建设的《南京钢铁-基于数字化审计为核心的全域风控管理》入选标杆案例&#xff0c;《苏粮集团-风控内控合…

Vue中使用echarts

1 安装 npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install echarts -S 2 main.js引入 3 引入成功

C++ 成员初始化列表

如果数据成员是常量或者引用的情况&#xff1a; 1.常量和引用不可以在构造函数中进行赋值&#xff1a; #include<iostream> using namespace std; class A { public:A(int i 0){m_i 10;m_j 30; //error 这一句代码叫做赋初值m_k m_i; //error} private:int m_i;/…

openGauss学习笔记-23 openGauss 简单数据管理-时间/日期函数和操作符

文章目录 openGauss学习笔记-23 openGauss 简单数据管理-时间/日期函数和操作符23.1 时间日期操作符23.2 时间/日期函数23.3 TIMESTAMPDIFF23.4 EXTRACT23.5 date_part openGauss学习笔记-23 openGauss 简单数据管理-时间/日期函数和操作符 23.1 时间日期操作符 用户在使用时…

Appium+python自动化(三十三)- 本地调试测试代码,远程控制测试环境-Remote(超详解)

简介 在前边所有涉及启动app的时候有这样一行代码driver webdriver.Remote(http://127.0.0.1:4723/wd/hub, desired_caps)&#xff0c;很多小伙伴们和同学们不知道这个ip和端口哪里来的&#xff0c;我觉得有必要给小伙伴解释一下&#xff0c;于是决定写一篇关于这个appium的服…

直播美颜技术的未来:美型SDK的前沿探索

一、时代背景 随着社交媒体和视频直播的兴起&#xff0c;直播美颜技术的需求日益增长。从简单的滤镜效果到人脸美颜算法的应用&#xff0c;这一领域一直在迅速发展。然而&#xff0c;美型SDK的问世标志着直播美颜技术的新篇章&#xff0c;它以更加精细化的处理和更强大的功能&…

使用win10专业版自带远程桌面公司内网电脑

在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数据采集和储存的场景&#xff08;如安保监控、自动化流程等等&#xff09;&#xff0c;更是离不…

大数据课程D4——hadoop的MapReduce

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解MapReduce的作用和特点&#xff1b; ⚪ 掌握MapReduce的组件&#xff1b; ⚪ 掌握MapReduce的Shuffle&#xff1b; ⚪ 掌握MapReduce的小文件问题&#xff1b; ⚪…

Vue项目引入图片的两种场景和三种方式

场景一&#xff1a;public目录下的图片 public目录 public目录下的图片引入方式&#xff1a; Bash <!--/images/图片名称&#xff0c;这种属于绝对路径&#xff0c;/指向public目录 --> <img src"/images/image.png"> 场景二&#xff1a;在src目录…

【Spring】更简单的读取和存储对象,五大类注解

经过前面的学习&#xff0c;我们已经可以实现基本的 Spring 读取和存储对象的操作了&#xff0c;但在操作的过程中我们发现读取和存储对象并没有想象中的那么 “简单”&#xff0c;所以接下来我们要学习更加简单的操作 Bean 对象的方法 在 Spring 中想要更简单的存储和读取对象…

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…

YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)

YOLOv5&#xff1a;使用7.0版本训练自己的实例分割模型&#xff08;车辆、行人、路标、车道线等实例分割&#xff09; 前言前提条件相关介绍使用YOLOv5-7.0版本训练自己的实例分割模型YOLOv5项目官方源地址下载yolov5-7.0版源码解压目录结构 准备实例分割数据集在./data目录下&…