自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 Git 删除已经 Push 到远程多余的文件

例如要删除 data/log 文件在当前项目下打开终端查看有哪些文件夹dir预览将要删除的文件(如果不清楚该目录下是否存在不应该删除的文件)git rm -r -n --cached 文件/文件夹名称加上 -n 这个参数,执行命令时,是不会删除任何文件,只是展示此命令要删除的文件列表预览确定无误后删除文件(不会删除本地的文件或文件夹)git rm -r --cached 文件/文件夹名称提交到本地并推送到远程服务器git commit -m "提交说明"git pu

2024-01-26 23:08:13 839

原创 EMQX 单机及集群搭建

通过 Yum 源安装(CentOS7 单机安装),集群搭建

2024-01-26 23:02:20 1377 1

原创 数据结构哈希表(散列)Hash,手写实现(图文推导)

哈希表,也被称为散列表,是一种重要的数据结构。它通过将关键字映射到一个表中的位置来直接访问记录,以此加快查找速度。这种映射函数被称为散列函数。哈希表的历史可以追溯到上个世纪 50 年代,由美国计算机科学家拉宾·珀尔(Rabin Pearl)和罗伯特·韦伯(Robert Weiss)发明。自那时以来,哈希表已经成为了计算机科学和编程中不可或缺的一部分,广泛应用于各种领域。

2023-11-13 23:25:55 910

原创 记录一个错误

通过@Resource注解,将接口的实现类注入进来注解默认按照名称进行装配,这里抛出异常是因为和都被 Spring 容器管理,在进行 bean 注入时,SpringBoot 不知道注入哪一个 bean。

2023-11-13 23:16:18 209

原创 消息队列 RocketMQ 消息重复消费问题(原因及解决)

Consumer 消费完消息并不是实时同步到 Broker 的,而是将 offset 先保存在本地map中,通过定时任务持久化上去。这就导致消息被消费了,但是此时消费者宕机了导致 offset 没提交,下次没提交 offset 的这部分消息会被再次消费即使 offset 被提交到了 Broker,在还没来得及持久化的时候 Broker 宕机了,当重启的时候 Broker 会读取consumerOffset.json 中保存的 offset 信息,这就会导致没持久化 offset 的这部分消息会被再次消费

2023-10-22 15:42:47 7831 1

原创 每日一练Day12

解析:byte 的取值范围 -128 ~ 127,++a 是先加再传值,127+1 会导致越界,127 的二进制为 0111 1111,加 1 后为 1000 0000,是一个负数,计算机用补码表示负数,则对应的十进制就是 -128;add(b),值传递,传递的是 b 的副本,不会改变真实 b 的值。给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。

2023-10-22 15:23:32 159

原创 数据结构数组 Array 手写实现,扩容原理

在 Java 的源码中,数组是一个非常常用的数据结构,很多其他数据结构也都有数组的影子。维数组是最常用的数组,其他很多数据结构的变种也都是从一维数组来的。ArrayList 的重点离不开对 System.arraycopy 的使用,它是一个本地方法,可以让你从原数组的特定位置,迁移到新数组的指定位置和迁移数量。数组是一个固定的、连续的、线性的数据结构,那么想把它作为一个自动扩展容量的数组列表,则需要做一些扩展。二维以及多维数组,在开发场景中使用到的到是不多,不过在一些算法逻辑,数学计算中到是可以使用。

2023-10-21 21:38:00 608

原创 每日一练Day11

解析:输出 str 和 ch,此时 str 还是指向 "good" 的,ch 还是指向之前的数组,但是数组内容已经被改变, str 是按值传递的,而 ch 是按地址传递的。方法 1: Java 直接用位运算符 &,用当前数字和 1 做“&”操作,如果结果是1,说明此时的二进制第一位为1,然后右移一位,直至数字为0。求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。调用的是第三个构造函数,直接初始化为大小为20的list,没有扩容,所以选择A。

2023-10-21 10:15:36 235

原创 数据结构链表看这一篇就够了 Link List 手写实现(图文解释,附常见面试题)

链表的数据结构通过链的连接方式,提供了可以不需要扩容空间就更高效的插入和删除元素的操作,在适合的场景下它是一种非常方便的数据结构。在“双向链表”中,除了下一个节点链接之外,每个节点还包含指向序列中“前一个”节点的第二个链接字段。在计算机科学中,链表是数据元素的线性集合,元素的线性顺序不是由它们在内存中的物理地址给出的。在最简单的链表结构下,每个节点由数据和指针(存放指向下一个节点的指针)两部分组成,这种数据结构允许在迭代时有效地从序列中的任何位置插入或删除元素。可以对单链表执行的操作包括插入、删除和遍历。

2023-10-21 10:04:41 1228

原创 每日一练Day10

D:方法的非可访问控制符可以是 abstract、static、final,但是 abstract 不可以和 static 以及 final 连用,毕竟abstract是虚拟的动态的,但是 static 和 final 都是静态的,不过 static 和 final 可以连用,毕竟两个都是静态的。A:属性的可访问控制符可以是 public、protected、private、默认(如果不写的话,被认为是 friendly,但是写上 friendly 会报错),没有 default 修饰符,所以 A 错误。

2023-10-19 17:59:23 154

原创 每日一练Day9

解析:==需看情况而论, 若是比较的是基本数据类型,直接看值,若是值在【-128,127】且相等,则比较相等,上面的会涉及拆箱操作,且值在范围类,返回 true;请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到 右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。2. 在 java 中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为()

2023-10-19 17:18:12 59

原创 分享一个笔试常考的算法题,链表翻转(图文推导,快速理解)

输入一个链表,反转链表后,输出新链表表头把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表。输入一个链表,反转链表后,输出新链表表头。链表操作,思维缜密程度。

2023-10-15 16:40:03 464

原创 Redis 简单字符串SDS相比C字符串的优势

C 字符串使用 Len+1 长度的字符数组来表示实际长度为 Len 的字符串,字符数组最后以空字符 '\0' 结尾,表示字符串结束。这种结构简单,但不能满足 Redis 对字符串功能性、安全性及高效性等的要求。

2023-10-15 16:06:07 196

原创 Redis 简单动态字符串 SDS

无论是 Redis 的 Key 还是 Value,其基础数据类型都是字符串。例如,Hash 型 Value 的 field 与 value 的类型、List 型、Set 型、ZSet 型 Value 的元素的类型等都是字符串。虽然 Redis 是使用标准 C 语言开发的,但并没有直接使用 C 语言中传统的字符串表示,而是自定义了一种字符串。这种字符串本身的结构比较简单,但功能却非常强大,称为简单动态字符串(Simple Dynamic String),简称 SDS。

2023-10-15 15:51:57 37

原创 每日一练Day8

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。C 当try区段的程序发生异常且被catch捕捉到时,才会执行catch区段的程序。(默认是按元素的第一个字母从小到大排序) 再与原来的没有排序的集合进行。1. 以下选项中,对Java关于内存回收的说法正确的是()如果两种方式都符合输出"both",否则输出"none"

2023-10-13 23:04:41 61

原创 每日一练Day7

因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。:静态成员是所有实例共用的变量,一般编码的时候不推荐使用实例方式访问,最好以类方式访问题目里面x最开始被设置初始值为100,自加了3次,自减了1次,结果为102。

2023-10-11 23:28:20 34

原创 每日一练Day6

最终类中可以不包含最终方法,包含最终方法的类可以是最终类也可以是非最终类。,如果子类的构造函数没有显示的调用父类的构造函数,编译器回自动的在子类的构造函数的第一排调用父类的无参构造函数,如果父类没有无参构造函数,子类必须显示调用父类的其他构造函数,否则将报错。二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。2. 已知表达式int m[]={0,1,2,3,4,5,6};( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根。

2023-10-11 23:23:55 53

原创 每日一练Day5

解析:在 change 方法中,对 str 进行了重新赋值,但是由于 java 中的字符串是不可变的,所有实际上并没有改变原来的字符串。Java 的值传递,当一个变量被传递给一个方法时,实际上传递的是该变量的一个副本,而不是变量本身。动态规划 (dp 问题), sum 表示 前 n-1 个数的和与 n 比较 ,取大的,如果前 n-1 个数的和为负数,则舍弃前 n-1 个数,从 n 开始重新计数。3. 在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()

2023-10-10 22:37:06 264

原创 每日一练Day4

解析: 接口中所有的方法默认是 public 修饰 ,接口中使用 private 修饰方法会出现编译错误(被 private 修饰的方法不能被重写,接口的方法就是用来重写的)输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。如果不存在这样的整数A,B,C,则输出No。输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.

2023-10-10 22:34:41 55 1

原创 每日一练Day3

8. 程序读入用户输入的一个值,要求创建一个自定义的异常,如果输入值大于 10 ,使用 throw 语句显式地引发异常,异常输出信息为 ”something’swrong!父类private修饰的成员变量,根据权限修饰符的访问控制范围,只有在类内部才能被访问,就算是他的子类,也不能访问。C 面向对象开发中,引用传递意味着传递的并不是实际的对象,而是对象的引用,因此,外部对引用对象所做的改变不会反映到所引用的对象上。给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

2023-10-09 20:57:48 67 1

原创 秒懂百万级流量,高并发秒杀项目架构设计(附图文)

什么是秒杀?秒杀:生活中很多场景,例如抢优惠卷、大促活动、商品秒杀、抢话费卷等,都是秒杀的具体实现,秒杀通俗的说就是很短时间内,处理大量的请求。

2023-10-09 20:50:57 700 1

原创 RocketMQ架构与RocketMQ 的刷盘机制(附官方图文,同步刷盘与异步刷盘)

消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。Index文件的存储位置是:$HOME \store\index\${fileName},文件名fileName是以创建时的时间戳命名的,固定的单个IndexFile文件大小约为400M,一个IndexFile可以保存 2000W个索引,IndexFile的底层存储设计为在文件系统中实现HashMap结构,故rocketmq的索引文件其底层实现为hash索引。1.1 消息存储整体架构。

2023-10-04 23:03:43 486 1

原创 SpringBoot+Vue博客前后端分离项目 八 文章详情-线程池(springboot + mybatisplus+redis+mysql+jwt+缓存)

利用线程池实现,将更新操作放入到线程池中执行,那么它就和主线程没有关系,也就不会互相影响速度了(这样前端看到的就是更新之前的阅读数量),阻塞其他的操作,那么整体查看文章的性能就会比较低,它必须等待新增加观看数量完成后才给前端返回文章详情。睡眠 ThredService中的方法 5秒,不会影响主线程的使用,即文章详情会很快的显示出来,不受影响。查看文章的时候,我们要将文章的阅读数量+1,这个时候进行了一次更新操作,更新的时候会加。接口url:/articles/view/{id}文章id(路径参数)

2023-10-04 14:00:54 98 1

原创 RocketMQ发送各种消息(同步,异步,单项,延迟,批量,顺序,事务,带标签,带key)

我们往一个主题里面发送消息的时候,根据业务逻辑,可能需要区分,比如带有tagA标签的被A消费,带有tagB标签的被B消费,还有在事务监听的类里面,只要是事务消息都要走同一个监听,我们也需要通过过滤才区别对待。发送同步消息,发送过后会有一个返回值,也就是mq服务器接收到消息后返回的一个确认,这种方式非常安全(发送消息存在消息丢失的风险),但是性能上并没有这么高。对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,后发布的消息后消费。延时消息约束

2023-09-27 22:47:38 1718 2

原创 SpringBoot+Vue博客前后端分离项目 七 统一缓存 后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

响应速度提升:相比直接调用底层高流量的基础服务,调用缓存服务接口的系统响应时间大大减少(内存的访问速度远远大于磁盘的访问速度 ,1000倍起)统一缓存,降低接入成本:一部分业务场景下可以直接标识统一缓存服务注释,便可以快速开启之前在文章列表读取,最新文章等接口的时候我们加了缓存,但是加了缓存会有一些问题,当我们修改或者用户浏览了文章,那么最新的修改和文章的浏览数量无法及时的更新,那么应该怎么做呢?这里采用了RocketMQ来解决这个问题。下面的-v对应的就上面创建的地址。创建broker.conf文件。

2023-09-27 22:16:42 115 1

原创 [ERROR]Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxie

这个错误通常是由于在Spring应用程序中,尝试注入一个接口而不是具体的实现类。当使用@Resource注解或Autowired注解时,Spring默认会将所注入的bean转换为其具体实现类的实例。但是,如果存在多个实现类,则可能会出现注入错误。在application.properties 配置信息里面加入。在配置文件上加上 以下两个注解。可以通过以下方式解决这个问题。本人使用方式2得到解决。

2023-09-22 17:51:10 500

原创 SpringBoot+Vue博客前后端分离项目 六 图片上传(七牛云)+分类 后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

用户访问图片资源时,图片一般占用的带宽比较大,如果很多人同时访问图片资源,就可能会造成应用服务器网络拥堵,解决办法是使用专门的图片云服务器(我们这里采用免费的七牛云) ,用户去图片服务器访问图片资源,降低应用服务器的带宽压力。分类文章列表 标签文章列表 归档文章列表

2023-09-20 23:19:02 270 1

原创 SpringBoot+Vue博客前后端分离项目 五 写文章+AOP日志 后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

文章分类 文章标签 发布文章还是走的publish方法。接口url:/categorys。接口url:/tags。文章id(编辑有值) 编辑按钮

2023-09-16 23:18:16 58 1

原创 SpringBoot+Vue博客前后端分离项目 四评论 后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

之前Article中的commentCounts,viewCounts,weight 字段为int,会造成更新阅读次数的时候,将其余两个字段设为初始值0,MyBatisPlus会修改updateArticle中不为null的值。接口url:/comments/create/change。接口url:/comments/article/{id}测试 有个小问题 二级评论的显示。文章id(路径参数)

2023-09-16 23:07:13 207 1

原创 SpringBoot+Vue博客前后端分离项目 三注册 后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

的ThreadLocal实例,被垃圾回收器回收了,线程还存在,而key指向的value并没有被回收,那么map的key没了,value还在,没有key去找到这个value,那么value就永远存在内存中了,如果有大量这个行为,那么就会造成内存泄漏。每次访问需要登录的资源的时候,都需要在代码中进行判断,一旦登录的逻辑有所改变,代码都得进行变动,非常不合适。可以,使用拦截器,进行登录拦截,如果遇到需要登录才能访问的接口,如果未登录,拦截器直接返回,并跳转登录页面。此时没有登录,就没有Token,被。

2023-09-16 22:47:06 149 1

原创 SpringBoot+Vue博客前后端分离项目 二登录 后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

使用postman测试,因为登录后,需要跳转页面,进行token认证,有接口未写,前端会出现问题。jwt 可以生成 一个加密的token,做为用户登录的令牌,当用户登录成功之后,发放给客户端。B:playload,存放信息,比如,用户id,过期时间等等,可以被解密,不能存放敏感信息。请求需要登录的资源或者接口的时候,将token携带,后端验证token是否合法。A:Header,{"type":"JWT","alg":"HS256"} 固定。jwt 有三部分组成:A,B,C。C: 签证,A和B加上。

2023-09-16 22:44:11 181 1

原创 SpringBoot+Vue博客前后端分离项目 一工程搭建+首页后端(springboot + mybatisplus+redis+mysql+jwt+缓存)

提供前端工程,只需要实现后端接口即可。

2023-09-16 22:37:56 259 1

原创 值传递、String不可变和值传递的联系和区别

值传递值传递是指将实参的值复制一份传递给形参,在函数内部对形参的修改不会影响到实参的值String是不可变的,这意味着一旦一个String对象被创建,它的值就不能被修改。这一点与Java中的值传递是一致的,因为值传递也是将实参的值复制一份传递给形参,在函数内部对形参的修改不会影响到实参的值2.引用传递Java中的引用传递是指将实参的引用(即内存地址)传递给形参,在函数内部对形参所指向的对象进行修改会影响到实参所指向的对象。

2023-09-11 21:34:05 56 1

原创 ThreadLocal实际运用以及内存泄漏的原因和解决(ThreadLocal保存用户信息,登录拦截器)

ThreadLocal实际运用以及内存泄漏的原因和解决应用环境博客项目,例如发布文章,修改文章等功能都需要获取当前用户信息,为什么使用ThreadLocal实际运用当前ThreadLocal是配合登录拦截器使用,登录成功后将用户信息传入UserThreadLocal强引用弱引用,弱引用,JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。 内存泄漏的原因一个线程属于一个强引用

2023-08-22 12:25:31 1449 1

原创 SpringBoot自定义内容返回 (增加yaml返回支持)

多端内容适配 默认规则 SpringBoot 多端内容适配。增加yaml返回支持

2023-08-22 10:42:28 345

原创 Spring-IOC(3.5w字总结,IOC思想及实现,基于XML和注解管理bean)

IOC思想 反转控制方式获取资源 DI 依赖注入IOC容器在Spring中的实现 ApplicationContext的主要实现类基于XML管理bean及底层原理依赖注入之setter注入依赖注入之构造器注入特殊值处理为类类型属性赋值引用外部已声明的bean 为数组类型属性赋值为集合类型属性赋值p命名空间、引入外部属性文件bean的作用域bean的生命周期基于xml的自动装配基于注解管理bean基于注解的自动装配

2023-07-07 20:32:08 146 1

原创 MAVEN下载和环境配置(配置失败及解决)

配置失败及解决 2.配置环境变量点击上方连接进入 Apache Maven官网点击左方Download选择自己所需要的版本注意:tar.gz :Linux系统bin.zip:Windows系统(src.zip:需要看源码可以下载这个)小编下载的是JDK 1.8 下面这个版本。

2023-06-07 15:57:35 1695 1

原创 XML(超详细笔记DTD XSD DOM SAX XML解析)

XMl语法XMl格式xml实例XMl解析DOM/SAX解析介绍及其优缺点,通过DOM/SAX解析XMl到实体对象xml是可扩展的标记性语言DTD文档类型定义DTD:文档约束,类似于集合中的泛型 作用就是限制保存到xml中标签约束XML文件中可以包含哪些元素,哪些属性,及元素个DTD是较简单的语法检查机制,整体语法较简单,功能较单一当需要对xml文件结构跟新时,需要修改整个DTD文件,不灵活XSD:XML模式定义DTD的升级版,解决了DTD使用时的不宜扩展问题,并且提供更强大的功能新建xxx.xsd文件--

2023-06-05 20:12:10 1150 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除