springboot中集成redis,二次封装成工具类

news2024/11/14 4:01:56

大家好,我是雄雄,欢迎关注微信公众号:** 雄雄的小课堂 **

现在是:2023年2月28日11:01:56

前言

redis大家应该都不陌生,我们在好多场景下都会使用,最近在面试别人的时候,也会问一些关于redis的问题,不多大家说的使用场景,基本都是在登录的时候,将用户信息放在缓存中,别的用的很少。表示一般在开发的时候,也不会进行二次封装redis的类,而是框架中本来就已经整合起来了,所以拿着用就行。

最近我在写一套开源的与社交软件交互的系统,后端采用的是springboot项目,有个地方需要用到缓存redis,所以就将原来的redis封装了下,现在分享出来。

springboot中集成redis

  1. 首先我们需要在pom文件中引入依赖,代码如下:
 <!-- 集成redis依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  1. 在需要使用redis的类中,加入自动注入redis的代码:
  @Autowired
    private RedisTemplate redisTemplate;

  1. 然后接下来我们就可以使用redis了,比如我们想给缓存中放存一个对象,那么我们可以这样写:
  redisTemplate.opsForValue().set("name", "穆雄雄");
  1. 此时我们已经将name放在缓存中,那我们在使用的时候如何从缓存中获取呢?可以如下:
  return key == null ? null : redisTemplate.opsForValue().get(key);
  1. 包括批量添加key:
    Map<String, String> keyAndValue = new HashMap<String.String>();
     keyAndValue.put("name","穆雄雄");
    keyAndValue.put("age","20");
    redisTemplate.opsForValue().multiSet(keyAndValue);

如果在我们项目中使用redis的话,这样操作不仅繁琐,而且写起来也复杂,我们如何让在别的地儿使用的时候更加方便顺手呢,这个时候我们就需要做个简单的封装,

封装redis工具类

下面是我做了个简单的封装,部分也是参考的别人的:

  1. 给一个指定的 key 值附加过期时间
   public boolean expire(String key, long time) {
        return redisTemplate.expire(key, time, TimeUnit.SECONDS);
    }
  1. 根据key 获取过期时间
 public long getTime(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
  1. 移除指定key 的过期时间
  public boolean persist(String key) {
        return redisTemplate.boundValueOps(key).persist();
    }
  1. 根据key获取值
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }
  1. 将值放入缓存
  public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

  1. 移除指定key 的过期时间
  public boolean persist(String key) {
        return redisTemplate.boundValueOps(key).persist();
    }
  1. 将值放入缓存并设置时间
  public void set(String key, String value, long time) {
        if (time > 0) {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
            redisTemplate.opsForValue().set(key, value);
        }
    }
  1. 批量添加 key (重复的键会覆盖)
  public void batchSet(Map<String, String> keyAndValue) {
        redisTemplate.opsForValue().multiSet(keyAndValue);
    }
  1. 批量添加 key-value 只有在键不存在时,才添加,map 中只要有一个key存在,则全部不添加
  public void batchSetIfAbsent(Map<String, String> keyAndValue) {
        redisTemplate.opsForValue().multiSetIfAbsent(keyAndValue);
    }
  1. 对一个 key-value 的值进行加减操作,如果该 key 不存在 将创建一个key 并赋值该 number,如果 key 存在,但 value 不是长整型 ,将报错
  public Long increment(String key, long number) {
        return redisTemplate.opsForValue().increment(key, number);
    }
  1. 对一个 key-value 的值进行加减操作,如果该 key 不存在 将创建一个key 并赋值该 number,如果 key 存在,但 value 不是 纯数字 ,将报错
  public Double increment(String key, double number) {
        return redisTemplate.opsForValue().increment(key, number);
    }
  1. 将数据放入set缓存
   public void sSet(String key, String value) {
        redisTemplate.opsForSet().add(key, value);
    }
  1. 获取变量中的值
 public Set<Object> members(String key) {
        return redisTemplate.opsForSet().members(key);
    }
  1. 随机获取变量中指定个数的元素
 public void randomMembers(String key, long count) {
        redisTemplate.opsForSet().randomMembers(key, count);
    }
  1. 随机获取变量中的元素
  public Object randomMember(String key) {
        return redisTemplate.opsForSet().randomMember(key);
    }
  1. 弹出变量中的元素
 public Object pop(String key) {
        return redisTemplate.opsForSet().pop("setValue");
    }
  1. 移除指定key 的过期时间
  public boolean persist(String key) {
        return redisTemplate.boundValueOps(key).persist();
    }
  1. 获取变量中值的长度
  public long size(String key) {
        return redisTemplate.opsForSet().size(key);
    }
  1. 根据value从一个set中查询,是否存在
 public boolean sHasKey(String key, Object value) {
        return redisTemplate.opsForSet().isMember(key, value);
    }

完整的工具类RedisUtil

package com.hookapi.common;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author: muxiongxiong
 * @date: 2023年02月22日 下午 5:48
 * 公众号:雄雄的小课堂
 * 博客:https://blog.csdn.net/qq_34137397
 * 个人站:http://www.穆雄雄.com
 * 个人站:http://www.muxiongxiong.cn
 * @Description: 类的描述
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 给一个指定的 key 值附加过期时间
     *
     * @param key
     * @param time
     * @return
     */
    public boolean expire(String key, long time) {
        return redisTemplate.expire(key, time, TimeUnit.SECONDS);
    }
    /**
     * 根据key 获取过期时间
     *
     * @param key
     * @return
     */
    public long getTime(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
    /**
     * 根据key 获取过期时间
     *
     * @param key
     * @return
     */
    public boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }
    /**
     * 移除指定key 的过期时间
     *
     * @param key
     * @return
     */
    public boolean persist(String key) {
        return redisTemplate.boundValueOps(key).persist();
    }

    //- - - - - - - - - - - - - - - - - - - - -  String类型 - - - - - - - - - - - - - - - - - - - -

    /**
     * 根据key获取值
     *
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 将值放入缓存
     *
     * @param key   键
     * @param value 值
     * @return true成功 false 失败
     */
    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 将值放入缓存并设置时间
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒) -1为无期限
     * @return true成功 false 失败
     */
    public void set(String key, String value, long time) {
        if (time > 0) {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
            redisTemplate.opsForValue().set(key, value);
        }
    }

    /**
     * 批量添加 key (重复的键会覆盖)
     *
     * @param keyAndValue
     */
    public void batchSet(Map<String, String> keyAndValue) {
        redisTemplate.opsForValue().multiSet(keyAndValue);
    }

    /**
     * 批量添加 key-value 只有在键不存在时,才添加
     * map 中只要有一个key存在,则全部不添加
     *
     * @param keyAndValue
     */
    public void batchSetIfAbsent(Map<String, String> keyAndValue) {
        redisTemplate.opsForValue().multiSetIfAbsent(keyAndValue);
    }

    /**
     * 对一个 key-value 的值进行加减操作,
     * 如果该 key 不存在 将创建一个key 并赋值该 number
     * 如果 key 存在,但 value 不是长整型 ,将报错
     *
     * @param key
     * @param number
     */
    public Long increment(String key, long number) {
        return redisTemplate.opsForValue().increment(key, number);
    }

    /**
     * 对一个 key-value 的值进行加减操作,
     * 如果该 key 不存在 将创建一个key 并赋值该 number
     * 如果 key 存在,但 value 不是 纯数字 ,将报错
     *
     * @param key
     * @param number
     */
    public Double increment(String key, double number) {
        return redisTemplate.opsForValue().increment(key, number);
    }

    //- - - - - - - - - - - - - - - - - - - - -  set类型 - - - - - - - - - - - - - - - - - - - -

    /**
     * 将数据放入set缓存
     *
     * @param key 键
     * @return
     */
    public void sSet(String key, String value) {
        redisTemplate.opsForSet().add(key, value);
    }

    /**
     * 获取变量中的值
     *
     * @param key 键
     * @return
     */
    public Set<Object> members(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 随机获取变量中指定个数的元素
     *
     * @param key   键
     * @param count 值
     * @return
     */
    public void randomMembers(String key, long count) {
        redisTemplate.opsForSet().randomMembers(key, count);
    }

    /**
     * 随机获取变量中的元素
     *
     * @param key 键
     * @return
     */
    public Object randomMember(String key) {
        return redisTemplate.opsForSet().randomMember(key);
    }

    /**
     * 弹出变量中的元素
     *
     * @param key 键
     * @return
     */
    public Object pop(String key) {
        return redisTemplate.opsForSet().pop("setValue");
    }

    /**
     * 获取变量中值的长度
     *
     * @param key 键
     * @return
     */
    public long size(String key) {
        return redisTemplate.opsForSet().size(key);
    }

    /**
     * 根据value从一个set中查询,是否存在
     *
     * @param key   键
     * @param value 值
     * @return true 存在 false不存在
     */
    public boolean sHasKey(String key, Object value) {
        return redisTemplate.opsForSet().isMember(key, value);
    }

    /**
     * 检查给定的元素是否在变量中。
     *
     * @param key 键
     * @param obj 元素对象
     * @return
     */
    public boolean isMember(String key, Object obj) {
        return redisTemplate.opsForSet().isMember(key, obj);
    }

    /**
     * 转移变量的元素值到目的变量。
     *
     * @param key     键
     * @param value   元素对象
     * @param destKey 元素对象
     * @return
     */
    public boolean move(String key, String value, String destKey) {
        return redisTemplate.opsForSet().move(key, value, destKey);
    }

    /**
     * 批量移除set缓存中元素
     *
     * @param key    键
     * @param values 值
     * @return
     */
    public void remove(String key, Object... values) {
        redisTemplate.opsForSet().remove(key, values);
    }

    /**
     * 通过给定的key求2个set变量的差值
     *
     * @param key     键
     * @param destKey 键
     * @return
     */
    public Set<Set> difference(String key, String destKey) {
        return redisTemplate.opsForSet().difference(key, destKey);
    }


    //- - - - - - - - - - - - - - - - - - - - -  hash类型 - - - - - - - - - - - - - - - - - - - -

    /**
     * 加入缓存
     *
     * @param key 键
     * @param map 键
     * @return
     */
    public void add(String key, Map<String, String> map) {
        redisTemplate.opsForHash().putAll(key, map);
    }

    /**
     * 获取 key 下的 所有  hashkey 和 value
     *
     * @param key 键
     * @return
     */
    public Map<Object, Object> getHashEntries(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 验证指定 key 下 有没有指定的 hashkey
     *
     * @param key
     * @param hashKey
     * @return
     */
    public boolean hashKey(String key, String hashKey) {
        return redisTemplate.opsForHash().hasKey(key, hashKey);
    }

    /**
     * 获取指定key的值string
     *
     * @param key  键
     * @param key2 键
     * @return
     */
    public String getMapString(String key, String key2) {
        return redisTemplate.opsForHash().get("map1", "key1").toString();
    }

    /**
     * 获取指定的值Int
     *
     * @param key  键
     * @param key2 键
     * @return
     */
    public Integer getMapInt(String key, String key2) {
        return (Integer) redisTemplate.opsForHash().get("map1", "key1");
    }

    /**
     * 弹出元素并删除
     *
     * @param key 键
     * @return
     */
    public String popValue(String key) {
        return redisTemplate.opsForSet().pop(key).toString();
    }

    /**
     * 删除指定 hash 的 HashKey
     *
     * @param key
     * @param hashKeys
     * @return 删除成功的 数量
     */
    public Long delete(String key, String... hashKeys) {
        return redisTemplate.opsForHash().delete(key, hashKeys);
    }

    /**
     * 给指定 hash 的 hashkey 做增减操作
     *
     * @param key
     * @param hashKey
     * @param number
     * @return
     */
    public Long increment(String key, String hashKey, long number) {
        return redisTemplate.opsForHash().increment(key, hashKey, number);
    }

    /**
     * 给指定 hash 的 hashkey 做增减操作
     *
     * @param key
     * @param hashKey
     * @param number
     * @return
     */
    public Double increment(String key, String hashKey, Double number) {
        return redisTemplate.opsForHash().increment(key, hashKey, number);
    }

    /**
     * 获取 key 下的 所有 hashkey 字段
     *
     * @param key
     * @return
     */
    public Set<Object> hashKeys(String key) {
        return redisTemplate.opsForHash().keys(key);
    }

    /**
     * 获取指定 hash 下面的 键值对 数量
     *
     * @param key
     * @return
     */
    public Long hashSize(String key) {
        return redisTemplate.opsForHash().size(key);
    }

    //- - - - - - - - - - - - - - - - - - - - -  list类型 - - - - - - - - - - - - - - - - - - - -

    /**
     * 在变量左边添加元素值
     *
     * @param key
     * @param value
     * @return
     */
    public void leftPush(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 获取集合指定位置的值。
     *
     * @param key
     * @param index
     * @return
     */
    public Object index(String key, long index) {
        return redisTemplate.opsForList().index("list", 1);
    }

    /**
     * 获取指定区间的值。
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<Object> range(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

    /**
     * 把最后一个参数值放到指定集合的第一个出现中间参数的前面,
     * 如果中间参数值存在的话。
     *
     * @param key
     * @param pivot
     * @param value
     * @return
     */
    public void leftPush(String key, String pivot, String value) {
        redisTemplate.opsForList().leftPush(key, pivot, value);
    }

    /**
     * 向左边批量添加参数元素。
     *
     * @param key
     * @param values
     * @return
     */
    public void leftPushAll(String key, String... values) {
//        redisTemplate.opsForList().leftPushAll(key,"w","x","y");
        redisTemplate.opsForList().leftPushAll(key, values);
    }

    /**
     * 向集合最右边添加元素。
     *
     * @param key
     * @param value
     * @return
     */
    public void leftPushAll(String key, String value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 向左边批量添加参数元素。
     *
     * @param key
     * @param values
     * @return
     */
    public void rightPushAll(String key, String... values) {
        //redisTemplate.opsForList().leftPushAll(key,"w","x","y");
        redisTemplate.opsForList().rightPushAll(key, values);
    }

    /**
     * 向已存在的集合中添加元素。
     *
     * @param key
     * @param value
     * @return
     */
    public void rightPushIfPresent(String key, Object value) {
        redisTemplate.opsForList().rightPushIfPresent(key, value);
    }

    /**
     * 向已存在的集合中添加元素。
     *
     * @param key
     * @return
     */
    public long listLength(String key) {
        return redisTemplate.opsForList().size(key);
    }

    /**
     * 移除集合中的左边第一个元素。
     *
     * @param key
     * @return
     */
    public void leftPop(String key) {
        redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
     *
     * @param key
     * @return
     */
    public void leftPop(String key, long timeout, TimeUnit unit) {
        redisTemplate.opsForList().leftPop(key, timeout, unit);
    }

    /**
     * 移除集合中右边的元素。
     *
     * @param key
     * @return
     */
    public void rightPop(String key) {
        redisTemplate.opsForList().rightPop(key);
    }

    /**
     * 移除集合中右边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
     *
     * @param key
     * @return
     */
    public void rightPop(String key, long timeout, TimeUnit unit) {
        redisTemplate.opsForList().rightPop(key, timeout, unit);
    }
}

然后我们可以看看如何在控制器中调用:

同样还是需要先注入:

 @Autowired
    private RedisUtil redisUtil;

然后就可以使用了,比如我们给缓存中存放一个值:

 redisUtil.set(user,topicName);

至此,就完成啦。

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

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

相关文章

华为OD机试题,用 Java 解【求符合要求的结对方式】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

博客系统--自动化测试

项目体验地址&#xff08;账号&#xff1a;123&#xff0c;密码&#xff1a;123&#xff09;http://120.53.20.213:8080/blog_system/login.html项目后端说明&#xff1a;http://t.csdn.cn/32Nnv项目码云Gitee地址&#xff1a;https://gitee.com/GoodManSS/project/tree/master…

【极狐 GitLab】在 web 端合并分支

一、概述 极狐GitLab是GitLab DevOps平台的中国发行版&#xff0c;一套完备的一站式DevOps平台&#xff0c;从根本上改变了开发、安全和运维团队协作和软件构建方式。极狐GitLab从构思到生产发布&#xff0c;帮助团队提高生产效率&#xff0c;将迭代周期从数周缩短至几分钟&am…

【Spring事物三千问】Spring的事务管理与MyBatis事物管理结合的原理

Spring的事务管理与MyBatis事物管理结合的原理前言正文原生的 MyBatis 的事务处理SqlSessionTransactionMyBatis 事务管理 与 Spring 事务管理的融合SpringManagedTransactionSqlSessionTemplateSqlSessionInterceptormybatis-spring 融合的原理连接获取 & 开启事务连接的关…

【Linux】理解进程地址空间

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 ​我们在学习C语言的时候&#xff0c;都学过内存区域的划分如栈、堆、代码区、数据区这些。但我们其实并不真正理解内存 — 我们之前一直说的内存是物理上的内存吗&#xff1f; 前言 我们…

18- TensorFlow实现CIFAR10分类 (tensorflow系列) (项目十八)

项目要点 导入cifar图片集: (train_image, train_label), (test_image, test_label) cifar.load_data() # cifar keras.datasets.cifar10图片归一化处理: train_image train_image / 255定义模型: model keras.Sequential() 输入层: model.add(layers.Conv2D(64, (3, 3…

HTML基础语法

一 前端简介构成语言说明结构HTML页面元素和内容表现CSS网页元素的外观和位置等页面样式&#xff08;美化&#xff09;行为JavaScript网页模型的定义和页面交互二 HTML1.简介HTML&#xff08;Hyper Text Markup Language&#xff09;&#xff1a;超文本标记语言。网页结构整体&…

Kubernetes05: Pod

Kubernetes05: Pod 1、概述 1&#xff09;最小部署的单元 2&#xff09;K8s不会处理容器&#xff0c;而是Pod&#xff0c;Pod里边包含多个容器&#xff08;一组容器的集合&#xff09; 3&#xff09;一个Pod中的容器共享一个网络命名空间 4) Pod是短暂存在的东西&#xff08;重…

使用shiroshiro整合其他组件

什么是shiro&#xff1f; 一款apache公司出品的Java安全框架&#xff0c;主要用于设计针对应用程序的保护&#xff0c;使用shiro可以完成认证、授权、加密、会话管理等。保证系统稳定性、数据安全性 优势&#xff1a;易于使用、易于理解、兼容性强&#xff08;可以与其他框架集…

SE-SSD论文阅读

摘要 本文提出了一种基于自集成单级目标检测器(SE-SSD)的室外点云三维目标检测方法。我们的重点是利用我们的公式约束开发软目标和硬目标来联合优化模型&#xff0c;而不引入额外的计算在推理中。具体来说&#xff0c;SE-SSD包含一对teacher 和student ssd&#xff0c;在其中我…

Mac 安装 Java 反编译工具 JD-GUI

Mac 安装 Java 反编译工具 JD-GUI JD-GUI 是一款 Java 反编译工具&#xff0c;可以方便的将编译好的 .class 文件反编译为 .java 源码文件&#xff0c;用于开发调试、源码学习等。 官网地址&#xff1a;http://java-decompiler.github.io Git 地址&#xff1a;https://github…

直播美颜sdk是什么?它是怎么让用户”变美“的?

如今&#xff0c;直播美颜sdk、手机摄影、短视频以及社交软件的盛行&#xff0c;让“拍照”成为人们日常生活中不可或缺的一部分。随着直播美颜sdk技术的不断升级&#xff0c;手机摄影的质量也越来越高。有统计数据显示&#xff0c;2018年中国智能手机用户已经达到了7亿人&…

美国最新调查显示 50% 企业已在用 ChatGPT,其中 48% 已让其代替员工,你怎么看?

美国企业开始使用ChatGPT&#xff0c;我认为这不是什么新闻。 如果美国的企业现在还不使用ChatGPT&#xff0c;那才是个大新闻。 据新闻源显示&#xff0c;已经使用chatGPT的企业中&#xff0c;48%已经让其代替员工工作。 ChatGPT的具体职责包括&#xff1a;客服、代码编写、招…

HTB-remote

HTB-remote信息搜集开机提权信息搜集 nmap 较为感兴趣的端口&#xff1a; 2180nfs 首先尝试21端口&#xff0c;可以看到并没有文件在ftp服务器里面&#xff0c;而且也无法上传文件。 80端口。 在contact里面找到了能够登录的网站。 经过简单的测试发现可能不存在sql注…

逆向、安全、工具集

0、安卓逆向环境 r0env 原味镜像介绍文章&#xff1a;https://mp.weixin.qq.com/s/gBdcaAx8EInRXPUGeJ5ljQ 原味镜像介绍视频&#xff1a;https://www.bilibili.com/video/BV1qQ4y1R7wW/ 百度盘&#xff1a;链接:https://pan.baidu.com/s/1anvG0Ol_qICt8u7q5_eQJw 提取码:3x2a …

【Spring源码】Spring AOP的核心概念

废话版什么是AOP关于什么是AOP&#xff0c;这里还是要简单介绍下AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;通过预编译和运行期间提供动态代理的方式实现程序功能的统一维护&#xff0c;使用AOP可以降低各个部分的耦合度&#xff0c;提高…

openfeign负载均衡策略 | Spring Cloud 5

一、Spring Cloud LoadBalancer介绍 Spring Cloud LoadBalancer是Spring Cloud官网提供的一个客户端负载均衡器&#xff0c;功能类似于Ribbon。在Spring Cloud Nacos 2021移除了中Ribbon组件&#xff0c;Spring Cloud在Spring Cloud Commons项目中&#xff0c;添加了Spring Cl…

华为OD机试题,用 Java 解【N 进制减法】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

Linux | 分布式版本控制工具Git【版本管理 + 远程仓库克隆】

文章目录一、前言二、有关git的相关历史介绍三、Git版本管理1、感性理解 —— 大学生实验报告2、程序员与产品经理3、张三的CEO之路 —— 版本管理工具的诞生四、如何在Linux上使用Git1、创建仓库2、将仓库克隆到本地3、git三板斧① git add② git commit③ git push4、有关git…

yarn run serve报错Error: Cannot find module ‘@vue/cli-plugin-babel‘ 的解决办法

问题概述 关于这个问题&#xff0c;是在构建前端工程的时候遇到的&#xff0c;项目构建完成后&#xff0c;“yarn run serve”启动项目时&#xff0c;出现的问题&#xff1a;“ Error: Cannot find module ‘vue/cli-plugin-babel‘ ” 如下图&#xff1a; 具体信息如下&…