【Redis】redis的理解与使用、springboot中redis的五种数据类型的相关存取、StringRedisTemplate

news2024/9/23 11:22:45

文章目录

    • Redis
      • 简介:
      • redis的安装与使用:
        • 1.启动方式:
        • 2.修改密码
        • 3. Redis可视化软件
        • 4.redis的使用
        • 5.有关redis的存储问题
      • springBoot项目使用redis
        • ▶jar包:
        • ▶示例:
          • 1.使用opsForValue操作字符串
          • 2.使用opsForList操作List
          • 3.使用opsForSet操作set
          • 4.使用opsForZSet操作有序set
          • 5.Redis 哈希(Hash)命令
      • StringRedisTemplate
      • 解决报错:

Redis

简介:

  • 关系型数据库(sql):mysql、oracle、pgsql等,以表格的形式进行存储。
  • 非关系型数据库(Nosql):mongodb、cassandra、redis,(后端分离)。

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多。
redis可以存储哪些数据类型:

  • string(字符串)
  • list(链表)
  • set(集合)
  • zset(sorted set --有序集合)
  • hash(哈希类型)(不常用)

这些数据类型都支持(增删改查)push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中
持久化存储:redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis能做什么?
Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件

1、 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;

2、排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;

3、计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
注:限速器也是对请求限流的一种实现方式。

4、好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;

5、简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;

6、Session共享,默认Session是保存在服务器的文件中,即当前服务器,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。

redis特点

  • Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。
  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。
  • Redis可以将数据复制到任意数量的从机中。

redis优点

  • 异常快:
    Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • 支持丰富的数据类型:
    Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
  • 操作具有原子性:
    所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
  • 多实用工具:
    Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

redis的安装与使用:

下载:https://github.com/MicrosoftArchive/redis/releases
解压到自己常用软件类磁盘,目录打开如图:
在这里插入图片描述

1.启动方式:

三种启动反式:

  • 1
    在这个目录下cmd,然后直接输入命令redis-server.exe redis.windows.conf,即可启动redis

  • 2
    新建记事本文件startup.bat,输入命令redis-server.exe redis.windows.conf,保存此文件,单击此文件启动、

  • 3
    直接在解压文件中点击redis-server.exe(防火墙要同意它的通过)

  • 启动后会有下图:此页面不关闭代表启动在这里插入图片描述

2.修改密码

解压目录下找到redis.windows.conf:大概在387行左右有requirepass 下添加requirepass 密码,保存,重新运行即可。(密码不一定设置成功)

在这里插入图片描述

3. Redis可视化软件

下载安装RedisDesktopManager,并连接redis(关闭防火墙并设置允许远程连接此电脑)

度娘搜索,或者资源下载:https://download.csdn.net/download/m0_70083523/87216140

  • 免安装版本的点击rdm.exe运行:
    在这里插入图片描述

  • 连接:在这里插入图片描述

  • 一个连接默认给0~15,共16个数据库

  • 操作数据库使用控制台

  • 在这里插入图片描述

默认连接你新建的连接的第一个数据库0,若是切换可使用:select 1
在这里插入图片描述

4.redis的使用

一堆命令使用:redisdoc.com/string/index.html
示例:

  • 放入字符串:set uname "朱尔斯"
    在这里插入图片描述

  • 放入数据也可以直接添加:
    在这里插入图片描述

  • 取值:get uname
    在这里插入图片描述

  • 设置缓存时间:
    在这里插入图片描述

-1:表示持久化保存,永久生效
-2:表示已经过期
正数:表示多少秒后过期

5.有关redis的存储问题

一般情况下,当我们关闭redis服务和可视化界面,之前存储的数据会消失,持久化存储需要在设置。但是在一些情况下我们会触发持久化存储。

RDB 持久化机制
RDB 全称为:Redis DataBase,是 Redis 当中默认的持久化方案。当触发持久化条件时,Redis 默认会生成一个 dump.rdb 文件,Redis 在重启的时候就会通过解析 dump.rdb 文件进行数据恢复。

RDB 机制触发条件:自动触发和手动触发
详细内容:https://blog.csdn.net/zhangbaidi_WinCE/article/details/127209803

说明:
持久化机制在我们第一次使用redis服务,在可视化界面添加数据时,就会产生一个文件dump.rdb,此文件的存在,会使我们修改value无效,服务关闭在开启,发现值修改不成功,就是此文件的影响(不要管文件图标是否一样)。

在这里插入图片描述

springBoot项目使用redis

▶jar包:

肯定先创建springboot项目,使用redis就要导入jar包(最新版去maven官网下载)
其实导入jar包就已将redis的相关连接配置完成,不需要在application.xxx文件中配置

<!--redis数据库连接-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>

# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379  
# Redis服务器连接密码(默认为空)
spring.redis.password=123456

一些application.properties的相关配置:


# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8  
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1  
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8  
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0  
# 连接超时时间(毫秒)
spring.redis.timeout=0  

【SpringBoot自动在Spring容器中配置一个redisTemplate的Bean,所以可以直接使用redisTemplate】

▶示例:

使用Spring封装的RedisTemplate操作redis,常用方法:

  • redisTemplate.opsForValue(); //操作字符串
  • redisTemplate.opsForHash(); //操作hash
  • redisTemplate.opsForList(); //操作list
  • redisTemplate.opsForSet(); //操作set
  • redisTemplate.opsForZSet(); //操作有序set
1.使用opsForValue操作字符串
1.存储字符串
使用:redisTemplate.opsForValue().set("name","tom");
结果:redisTemplate.opsForValue().get("name")  输出结果为tom
2.设置失效时间
使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
TimeUnit.DAYS           //天  
TimeUnit.HOURS          //小时
TimeUnit.MINUTES        //分钟  
TimeUnit.SECONDS        //秒
TimeUnit.MILLISECONDS   //毫秒
结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
3.支持整型与浮点型(increment)
使用:redisTemplate.opsForValue().increment("sex",1);
System.out.println(redisTemplate.opsForValue().get("sex"));
结果:1
4.如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。如果键不存在,则它被创建并设置为空字符串,因此APPEND在这种特殊情况下将类似于SET
使用:redisTemplate.opsForValue().append("name"," hello");
      System.out.println(redisTemplate.opsForValue().get("name"));
结果:tom Hello
5.截取key所对应的value字符串
System.out.println("*********"+redisTemplate.opsForValue().get("name",0,3));
结果:tom
6.返回key所对应的value值得长度
System.out.println("***************"+redisTemplate.opsForValue().size("key"));
7.存储一个对象(此类必须先序列化实现接口Serializableimport java.io.Serializable;
import java.util.Date;
@Data
public class Provider implements Serializable {	
	private Integer id;   //id
======================================================
RedisSerializer rs = new StringRedisSerializer();
redisTemplate.setStringSerializer(rs);
ValueOperations ops = redisTemplate.opsForValue();
ops.set("user",user);//放入redis
//取出对象
User setuser = (User) redisTemplate.opsForValue().get("user");

具体范例代码:===========================================================

@RestController
public class RedisController {

//    @Autowired
//    private RedisTemplate redisTemplate; //RedisTemplate是从jar包中来的

    private RedisTemplate redisTemplate;
    //指定用redis的序列化方式进行序列化
    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String
        //不能反序列化
        //Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(serializer);
        this.redisTemplate = redisTemplate;
    }


    @RequestMapping("/setRedisValue")
    public String setRedisValue() {
//        //获得redis操作字符串对象
//        ValueOperations vo = redisTemplate.opsForValue();
//        vo.set("uname","Jules");     //放值
//        System.out.println("uname==="+vo.get("uname")); //读取值: vo.get("key")

        //支持整型与浮点型使用increment
//        redisTemplate.opsForValue().increment("sex",1);
//        System.out.println(redisTemplate.opsForValue().get("sex"));

        //追加:
//        redisTemplate.opsForValue().set("name","tom");
//        redisTemplate.opsForValue().append("name"," hello");
//        System.out.println(redisTemplate.opsForValue().get("name"));

        //序列化:
        RedisSerializer rs = new StringRedisSerializer();
        redisTemplate.setStringSerializer(rs);   //设置redis支持序列化
        Provider pro = new Provider();
        pro.setId(1001);
        redisTemplate.opsForValue().set("provider",pro);
        Provider provider1 = (Provider)redisTemplate.opsForValue().get("provider");
        System.out.println("取对象"+provider1.getId());
        return "操作成功!!!";
    }
}

全部添加进入redis中
在这里插入图片描述


2.使用opsForList操作List
3.使用opsForSet操作set
4.使用opsForZSet操作有序set

【2,3,4,的具体示例:https://www.zybuluo.com/wangzhuanyun/note/15】


注意:zset的使用,在添加集合时,在加入的过程就进行了排序

通过分数返回有序集合指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列
使用:
System.out.println(redisTemplate.opsForZSet().add("zset1","zset-1",1.0));
System.out.println(redisTemplate.opsForZSet().add("zset1","zset-2",6.0));
System.out.println(redisTemplate.opsForZSet().add("zset1","zset-3",8.0));
System.out.println(redisTemplate.opsForZSet().add("zset1","zset-4",4.0));
System.out.println(redisTemplate.opsForZSet().add("zset1","zset-5",10.0));
System.out.println(redisTemplate.opsForZSet().add("zset1","zset-6",2.0));

如下图:

在这里插入图片描述

5.Redis 哈希(Hash)命令

https://www.cnblogs.com/ryanpan/p/16582749.html

StringRedisTemplate

StringRedisTemplate与RedisTemplate区别点:

  • 两者的关系是StringRedisTemplate继承RedisTemplate
    在这里插入图片描述
  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • (序列化类) RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。 StringRedisTemplate使用的是StringRedisSerializer

StringRedisTemplate常用操作:

@RestController
public class RedisController2 {
    @Autowired
    public StringRedisTemplate stringRedisTemplate;

    @RequestMapping("/StringRedisTemplateTest")
    public String StringRedisTemplateTest() {
    //向redis里存入数据和设置缓存时间
        stringRedisTemplate.opsForValue().set("test", "100",60*10, TimeUnit.SECONDS);
    //val做-1操作
        stringRedisTemplate.boundValueOps("test").increment(-1);
    //根据key获取缓存中的val
        stringRedisTemplate.opsForValue().get("test");
    //val +1
        stringRedisTemplate.boundValueOps("test").increment(1);
    //根据key获取过期时间
        stringRedisTemplate.getExpire("test");
    //根据key获取过期时间并换算成指定单位
        stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);
    //根据key删除缓存
        stringRedisTemplate.delete("test");
    //检查key是否存在,返回boolean值
        stringRedisTemplate.hasKey("546545");
    //向指定key中存放set集合
        stringRedisTemplate.opsForSet().add("red_123", "1","2","3");
    //设置过期时间
        stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);
    //根据key查看集合中是否存在指定数据
        stringRedisTemplate.opsForSet().isMember("red_123", "1");
    //根据key获取set集合
        stringRedisTemplate.opsForSet().members("red_123");

        return "操作成功!!!";
    }

使用时注意事项:

  • 当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
  • 但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

RedisTemplate使用时常见问题:
redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null


解决报错:

Redis序列化和反序列化失败:

2022-12-01 12:47:52.789 ERROR 19196 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; 
nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. 
Is the byte array a result of corresponding serialization for DefaultDeserializer?;
nested exception is java.io.EOFException] with root cause

java.io.EOFException: null
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2681) ~[na:1.8.0_202]
	…………………………

原因:
SpringBoot使用spring-data-redis,RedisTemplate默认的序列化方式是用org.springframework.data.redis.serializer.JdkSerializationRedisSerializer这个类来做序列化,而Redis有自己的序列化方式,所以冲突了 报出了上面的序列化异常的信息。

需要在controller中添加一段代码:

    //指定用redis的序列化方式进行序列化
    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String
        //不能反序列化
        //Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(serializer);
        this.redisTemplate = redisTemplate;
    }

//注意:Jackson2JsonRedisSerializer可以序列化成功,但是反序列化会失败,
//		所以建议用GenericJackson2JsonRedisSerializer即可序列化也可反序列化。

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

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

相关文章

智能使得宇宙趋向稳定吗?

——评《智能简史》 最近读完了加拿大工程院院士于非的新著《智能简史》&#xff0c;书中的主要观点是“智能的作用是推动宇宙趋向稳定”。从这个观点出发&#xff0c;万物都有智能&#xff0c;因为它们遵循的规律都具有这个作用。即使是人们认为“无智能”的物理对象&#xff…

vue纯手写思维导图,拒绝插件(cv即用)

vue纯手写思维导图&#xff0c;拒绝插件(cv即用) 已完成功能点&#xff1a;折叠、放大、缩小、移动 后续增加功能点&#xff1a;添加、删除 先看结果&#xff1a; 有这么个需求&#xff0c;按照层级关系&#xff0c;把表格放在思维导图上&#xff0c;我第一时间想到用插件&am…

Android开发JetPack-Databinding组件

DataBinding介绍Android开发JetPack-Databinding组件1. 什么是databinding&#xff08;1&#xff09;简介&#xff08;2&#xff09;意义2. databinding基本使用&#xff08;1&#xff09;启用databinding&#xff08;2&#xff09;定义一个布局&#xff08;3&#xff09;创建一…

Redis02:企业架构介绍以及redis介绍

企业架构介绍以及redis介绍NoSql概述单机Mysql的演进当今企业架构分析NoSql概述 单机Mysql的演进 1、单机Mysql的年代 90年代一个基本的网站访问量一般不会太大&#xff0c;单个数据库完全足够&#xff01;那个时候更多的去使用静态html&#xff0c;服务器没有太大的压力。这…

HCIP实验3-1:IBGP与EBGP

实验 3-1 IBGP与EBGP 学习目的 掌握区域内部BGP的配置方法掌握多区域BGP的配置方法观察BGP的邻居表和数据库掌握BGP更新源的配置方法掌握EBGP多跳的配置方法观察IBGP和EBGP中路由的下一跳的变化掌握IBGP中下一跳的配置掌握BGP的Network命令的配置方法 拓扑图 场景 你是公司…

open label file.(This can be normal only if you use MScoco)

E:\yolov4-rubish\darknet\our_data\ImagesAug 把标签的txt文件和Jpg文件放在同一个文件夹

Kafka 入门知识,看这一篇就够了(上)

目录01 初识 Kafka02 topic & partition03 Kafka 分布式最近在学习 Kafka&#xff08;别问&#xff0c;问就是公司在用 &#xff09;&#xff0c;将学习过程中的笔记整理出来分享给大家&#xff0c;就当是入入门 01 初识 Kafka Kafka 最早是由 LinkedIn 公司开发的&#x…

python中numpy数组形状和计算

1. numpy数组形状 数组可以理解为是矩阵&#xff0c;所以会涉及几行几列 import numpy as np import randomt1 np.array([[1,2,3],[4,5,6]]) print(t1) print(t1.shape)在这段逻辑里&#xff0c;t1是个数组&#xff0c;输出结果后 (2, 3)表示的就是这个数组是一个2行3列的矩…

计算机系统基础实验——数据的机器级表示(计算浮点数 f 的绝对值[f])

题目要求&#xff1a; 这个函数计算浮点数f的绝对值[f]。如果f是NaN&#xff0c;函数应该简单的返回f。 Unsigned float_abs (unsiged f) { /**************/ return/*******/; } 先分析题目&#xff0c;题目有两个要求&#xff1a; 1.判断f是否是NAN类型&#xff0c;如果是返…

文件管理,给文件名称插入纯数字详细步骤

在日常办公过程中&#xff0c;我们经常会需要对文件名称进行重命名&#xff0c;如何给文件插入纯数字呢&#xff1f;一两个文件还好可以自定义重命名&#xff0c;面对大量文件的时候&#xff0c;怎么在文件名称中插入纯数字呢&#xff1f;一起来看看吧&#xff01; 第一步&…

这 5 本数据分析书籍,都是经典中的经典

下面要推荐的 5 本数据分析书籍对于数据分析领域而言&#xff0c;经典、经典、还是经典。 强烈建议先收藏&#xff0c;再观看。 《深入浅出数据分析》 数据分析入门第一本。 本书构思跌宕起伏&#xff0c;行文妙趣横生&#xff0c;无论是职场老手&#xff0c;还是业界新人&…

S2SH小区物业管理理系统计算机毕业论文Java项目源码下载

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH小区物业系统_哔哩哔哩_bilibili计算机毕业设计java毕设之S2SH小区物业系统共计2条视频&#xff0c;包括&#xff1…

香农-范诺编码(Shannon–Fano Coding)

香农-范诺编码香农-范诺编码简介算法示例香农-范诺编码 简介 香农-范诺编码&#xff08;Shannon–Fano Coding&#xff09;是一种基于一组符号集及其出现的或然率&#xff08;估量或测量所得&#xff09;&#xff0c;从而构建前缀码的技术。 一般过程&#xff1a;符号从最大可…

太强了!GitHub上白嫖的SpringCloud微服务进阶宝典,啃完感觉能吊锤面试官!

自 2014 年起&#xff0c;微服务技术一直火热至今。随着越来越完善的微服务技术栈的发布&#xff0c;以及越来越多的微服务项目实际的落地和上线&#xff0c;使用 Java 技术栈的企业应该都在尝试或者已经落地了各自的微服务项目。同时&#xff0c;通过招聘网站的信息和每次面试…

正确理解线程WAITING状态

正确理解线程WAITING状态 今天来学习下&#xff0c;Java的线程状态&#xff0c;重点讨论下thread.state.WAITING。讨论下线程如何进入此状态&#xff0c;以及它们之间的区别。最后&#xff0c;我们进一步了解java.util.concurrent.locks.LockSupport&#xff0c;它提供了几种用…

【分布式能源的选址与定容】基于非支配排序多目标遗传优化算法求解分布式能源的选址与定容(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

AOP通知获取数据

之前说到了AOP可以对原始方法进行增强&#xff0c;那么AOP是否可以获取到原始方法的数据并对原始方法的数据利用增强方法进行处理呢&#xff1f;我们将从获取参数、获取返回值和获取异常三个方面来研究。 首先&#xff0c;我们可以知道&#xff0c;所有的通知类型都可以获取参数…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.6 容器命令练习

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.6 容器命令练习10.6.1 直接开干10 使用Docker 10.6 容器…

阿里“重推”的Spring+Boot+MVC+CloudAlibaba学习手册,开源下载

Spring框架自诞生以来一直备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新&#xff0c;很多研发人员把spring看作心目中最好的Java项目&#xff0c;没有之一。 可以毫不夸张的…

VS Code 扩展开发如何保持用户视觉体验一致

本文介绍如何在 VS Code 插件的 webview 中加载本地的资源文件&#xff0c;并如何使用 VS Code 自身的 UI 来实现用户视觉体验的一致。 背景 最近想做一个 VS Code 的插件用来简便我使用 VS Code 来编辑 Markdown 博客的体验&#xff0c;在设计插件的过程中&#xff0c;因为需…