自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于在M系列的Mac中使用SoftEtherClient软件

时至今日,我已经使用SSTP Connect这款软件替代SoftetherClient这款软件有一段时间了,整体上来说,这款软件好用,功能比原版还强大,推荐。大家如果在下载,或者使用过程中有什么问题的,欢迎评论区一起探讨。t=O83At=O83At=O83ASoftEther 下载中心http://softether.fishinfo.cn/cn.aspx。

2024-12-26 09:16:21 1931

原创 定时任务实现方式

实现定时任务的方法有很多。

2024-12-07 10:44:03 696

原创 Docker打包SpringBoot项目

以上只是一个简单的SpringBoot项目的docker容器部署的实例,实际使用时需要按照项目的实际环境进行配置,欢迎大家一起讨论。

2024-12-07 10:29:37 678

原创 自定义注解-接口幂等

*** 自定义防接口重复提交注解*/@Inherited/*** 间隔时间,小于此时间为重复提交*//*** 提示语*/String message() default "不允许重复提交,请稍后再试!/*** 防止接口重复提交*/@Aspect@Component@Autowired// 获取请求// 唯一值 (没有消息头则使用请求地址)// 这里可以对key进行加密// 唯一标识。

2024-09-03 20:21:37 344

原创 AQS 原理详解

AQS(Abstract Queued Synchronizer),抽象队列同步器,它是用来构建锁或其他同步器的基础框架。虽然大多数程序员可能永远不会使用到它,但是知道 AQS 的原理有助于理解一些锁或同步器的是如何运行的。那么有哪些同步器是基于 AQS 实现的呢?这里仅是简单介绍,详情后续会单独总结一篇文章。同步器说明递减的计数器,直至所有线程的任务都执行完毕,才继续执行后续任务。Semaphore信号量,控制同时访问某个资源的数量。递增的计数器,所有线程达到屏障时,才会继续执行后续任务。

2024-09-03 20:17:08 1131

原创 MongonDB-安全认证

默认情况下,MongoDB实例启动运行时是没有启用用户访问权限控制的,也就是说,在实例本机服务器上都可以随意连接到实例进行各种操作,MongoDB不会对连接客户端进行用户验证,这是非常危险的。mongodb官网上说,为了能保障mongodb的安全可以做以下几个步骤:1)使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全。2)设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用vpn等。3)开启安全认证。

2024-09-02 20:23:42 1798

原创 MongonDB-分片集群

对于 基于范围的分片 ,MongoDB按照片键的范围把数据分成不同部分.假设有一个数字的片键:想象一个从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点.MongoDB把这条直线划分为更短的不重叠的片段,并称之为 数据块 ,每个数据块包含了片键在一定范围内的数据.在使用片键做范围划分的系统中,拥有”相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中.虽说如此,这也是一种比较好的方案了。提示:如果添加分片失败,需要先手动移除分片,检查添加分片的信息的正确性后,再次添加分片。

2024-09-02 20:22:18 1197

原创 MongoDB-副本集-Replica Sets

MongoDB中的副本集(Replica Set)是一组维护相同数据集的mongod服务。副本集可提供冗余和高可用性,是所有生产部署的基础。也可以说,副本集类似于有自动故障恢复功能的主从集群。通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。(1)冗余和数据可用性复制提供冗余并提高数据可用性。

2024-09-01 08:32:55 2245

原创 MongoDB-案例

org.springframework.data.mongodb.core.index.CompoundIndex.class,复合索引的声明,建复合索引可以有效地提高多字段的查询效率。org.springframework.data.mongodb.core.index.Indexed.class,声明该字段需要索引,建索引可以大大的提高查询效率。说明:索引可以大大提升查询效率,一般在查询字段上添加索引,索引的添加可以通过Mongo的命令来添加,也可以在Java的实体类中通过注解添加。

2024-09-01 08:30:24 1007

原创 MongonDB-索引

索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。

2024-08-31 15:14:02 972

原创 MongonDB-基本常用命令

提示:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类型。所有存储在集合中的数据都是 BSON 格式。

2024-08-31 15:12:46 1649

原创 MongonDB-部署

如果是下载安装版,则按照步骤安装;如果是下载加压缩版,直接解压,执行里面的MongoDBCompassCommunity.exe 文件即可。为了方便我们每次启动,可以将安装目录的bin目录设置到环境变量的path中, bin 目录下是一些常用命令,比如 mongod 启动服务用的,mongo 客户端连接服务用的。我们在启动信息中可以看到,mongoDB的默认端口是27017,如果我们想改变默认的启动端口,可以通过--port来指定端口。1)配置文件中如果使用双引号,比如路径地址,自动会将双引号的内容转义。

2024-08-29 20:14:18 1019

原创 MongonDB-相关概念

MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。

2024-08-29 20:12:24 1182

原创 合并两个有序链表

什么时候无法比较当前节点的值,这个比较好找,就是当 listNode1 的为 null,或者 listNode2 为 null 时,无法进行比较了,可直接返回对应有值的节点,代码如下。原因是我们在不断的遍历中,指针会不断的下移,当我们合并完成所有的节点时,此时的指针是在最后,这时我们在获取合并后的链表就比较麻烦了。这里我们还需要一个哨兵节点,为什么需要哨兵节点呢,我们在遍历链表的过程中是不断的调整它的 next 指针,当我们遍历到最后时,哨兵节点更容易返回合并后的链表,过程如下图。

2024-08-28 19:51:43 769

原创 算法-反转链表

还有一个情况时当前节点的后继节点为 null 时,由于我们递归函数的入参就是当前节点的后继节点,故也没必要再次递归,直接返回当前节点即可。指针如果改变,后续的值还需要使用时,需要用一个 temp 节点暂存后继节点的值。如图,针对最后两个节点,变化的量只有 cur 指针,代表着层层遍历的节点。因为这里的链表是单向的,也就是无法获取节点对应的前驱节点。我们想将链表的节点反转,也就是说要将每个节点的指向反转过来,所以这里的子问题就是,调整每个节点的指向。输入:head = [1,2,3,4,5]

2024-08-28 19:50:40 702

原创 算法-分隔链表

原因是我们在不断的遍历中,指针会不断的下移,当我们合并完成所有的节点时,此时的指针是在最后,这时我们在获取合并后的链表就比较麻烦了。给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。通过图解,可以了解迭代的大致流程,但是我们在 Java 代码实现时,还需要维护两个对应的指针,用来调整它的 next 指针。这涉及到引用问题,这里直接引用拷贝的是堆中的内存地址,也就是说指针和对应节点就是一个对象,详情见我的另一篇文章。

2024-08-24 05:23:31 549

原创 数据库E-R 图

可以唯一标识实体集内的实体。椭圆,属性名用下划线标记。

2024-08-22 20:07:25 1267

原创 数据库范式

确保每列保证。

2024-08-22 20:05:47 647

原创 Java对数器

【概述】用于验证所写算法是否正确,用需要测试的算法与相同功能的已知准确的算法方法进行结果比较,一致则正确,反之有问题。【实现流程】准备好需要测试的算法A;再准备一个与算法A相同功能的算法B(须准确,效率无所谓);实现一个随即样本的生成器;把算法A和算法B跑相同的随机样本,看结果是否一致;一致则算法正确,反之进行调试;通过大批量的样本数据测试,可以确定算法A正确。

2024-08-21 19:44:37 296

原创 浮点数计算

这里不建议使用BigDecimal的构造方法来创建BigDecimal对象,因为在使用其构造方法创建对象时候,如果将double类型的数据转换为BigDecimal将会出现精度损失,推荐使用BigDecimal的valueOf()方法来创建BigDecimal对象。由于这个表示的误差,再加上double的有限精度,计算结果可能不是期望的值,可能会出现误差,进而引发一些令人困惑的输出。和我们想要的值计算出来的结果不一致,这是因为在Java中,浮点数计算可能会出现精度问题。

2024-08-21 19:42:58 335

原创 复杂度分析

如对于递归算法来说,一般都比较简短,算法本身所占用的存储空间较少,但运行时需要一个附加堆栈,从而占用较多的临时工作单元。若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。具体来说,就是要先对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。评价算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。在表达式中,只要高阶项,不要低阶项,也不要高阶项系数,

2024-08-20 19:57:36 983

原创 迭代与递归

递归(recursion)是一种算法策略,通过直接或者间接地调用自身来解决问题,将大问题分解成更多的子问题,主要解决同一大类问题。从数据结构角度看,递归天然适合处理链表、树和图的相关问题,因为它们非常适合用分治思想进行分析。主要包含两个阶段:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。递归的三个重要要素(须记住):用于决定什么时候由“递”转“归”。对应“递”,函数调用自身。

2024-08-20 19:56:01 917

原创 JVM 内存区域

【概述】JVM是Java虚拟机(Java Virtual Machine)的简称,是一种用于计算设备的规范,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。我们学习使用的基本都是HotSpot虚拟机。【优点】优点说明实现跨平台运行让底层代码和运行环境分离开,编写好一份代码后,不用再次修改内容,只用通过安装不同的JVM环境自动进行转换即可运行,在各种系统中无缝连接。自动内存管理专门设计了垃圾回收机制,来自动进行内存的管理,极大的优化了操作。数组下标越界检查。

2024-08-19 19:52:58 1642

原创 JVM 类加载机制

分类说明启动类加载器负责加载目录中的核心类库,如等;负责加载被参数所指定的路径中的,并且是虚拟机识别的类库;这个加载器是C++编写的,随着JVM启动。扩展类加载器负责加载目录中的类库;也可以加载用系统变量来指定路径目录中的类库。系统类加载器负责加载用户类路径classpath上所有的jar包和.class文件。自定义类加载器可以支持一些个性化的扩展功能。

2024-08-19 19:51:22 1577

原创 Java反射机制

【概述】Java是静态类型语言,因为有了反射机制,才是准动态语言。同时反射还是框架设计的灵魂。表示一种在运行时可以改变结构的语言,如新的函数对象,甚至代码可以被引进,已有的代码可以被删除或增加。相对于动态语言表示在运行时期不可以改变自身结构。java,C,C++【前提条件】必须先得到相关的字节码文件,就是.class文件。【优缺点】可实现动态类加载(运行时加载,编译时加载为静态),提高代码灵活性。性能比直接的Java代码运行要慢。【创建对象方式】引入包名→通过new实例化对象→取得实例化对象。

2024-08-18 08:17:21 603

原创 线程池详解

根据池化思想,在一个系统中,为了避免线程频繁的创建和销毁,让线程可以复用,引入了线程池的概念。线程池中,总有那么几个活跃线程。当你需要使用线程时,可以从池子中随便拿一个空闲线程,当完成工作时,并不急着关闭线程,而是将这个线程退回到池子,方便其他人使用。简单说就是,在使用线程池后,创建线程变成了从线程池中获得空闲线程,关闭线程编程了向池子里归还线程。

2024-08-18 08:14:30 979

原创 ArrayList详解

【概述】List的主要实现类,底层使用Object[]存储,适用于频繁的查找工作,线程不安全。【特点】每次删除元素,都需要更改数组长度、拷贝以及移动元素位置;由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。【数据结构】ArrayList底层是数组队列,相当于动态数组。添加元素的时候会判断是不是空参构造时创建的空数组;是则将最小容量设为 10,否则为 size + 1;判断当前最小容量是否大于数组长度;大于则进行扩容,扩容为当前的数组长度的 1.5 倍。

2024-08-17 07:35:15 835

原创 AQS 原理详解

AQS(Abstract Queued Synchronizer),抽象队列同步器,它是用来构建锁或其他同步器的基础框架。虽然大多数程序员可能永远不会使用到它,但是知道 AQS 的原理有助于理解一些锁或同步器的是如何运行的。那么有哪些同步器是基于 AQS 实现的呢?这里仅是简单介绍,详情后续会单独总结一篇文章。同步器说明递减的计数器,直至所有线程的任务都执行完毕,才继续执行后续任务。Semaphore信号量,控制同时访问某个资源的数量。递增的计数器,所有线程达到屏障时,才会继续执行后续任务。

2024-08-17 07:32:05 746

原创 分布式 ID

本文对分布式 ID 以及其场景的生成方案做了介绍,还针对一下大厂的中间件进行简单分析,中间件的接入代码本文并没有做详细介绍,但是官方文档的链接都帖子了每个子标题下,其中都有详细介绍。文中还针对每个生成方案的优缺点作出了说明,具体的使用可针对优缺点加上业务需求来进行选型。[1] 腾讯技术工程. 分布式唯一 ID 生成方案浅谈.[2] 孟斯特. UUID 介绍.[3] 文丑颜不良啊. 雪花算法(SnowFlake).

2024-08-16 20:31:37 875

原创 ThreadLocal 源码

ThreadLocal 是 JDK 包提供的,它提供了线程本地变量,也就是说,如果你创建了一个 ThreadLocal 变量,那么访问这个变量的每一个线程,都创建这个变量的一个本地副本。这样可以解决什么问题呢?当多个线程操作这个变量时,实际操作的是自己线程本地内存里的数据,从而避免线程安全问题。如下图,线程表中的每个线程,都有自己 ThreadLocal 变量,线程操作这个变量只是在自己的本地内存在,跟其他线程是隔离的。

2024-08-16 20:29:55 1012

原创 Seata

对于已经空回滚的业务,之前被阻塞的try操作恢复,继续执行try,就永远不可能confirm或cancel ,事务一直处于中间状态,这就是业务悬挂。执行try操作时,应当判断cancel是否已经执行过了,如果已经执行,应当阻止空回滚后的try操作,避免悬挂。XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

2024-08-15 20:17:11 704

原创 Redisson

Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid)。充分的利用了 Redis 键值数据库提供的一系列优势,基于 Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。

2024-08-15 20:14:06 1522

原创 响应状态码

—处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它。——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等。——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。请求方式有误,比如应该用GET请求方式的资源,用了POST。——表示请求已经被成功接收,处理已完成。

2024-08-14 20:40:51 283

原创 常见的正则表达式

18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

2024-08-14 20:40:07 700

原创 BIO、NIO、AIO区别与联系

4.BIO是单向的,要么是输入流要么是输出流,NIO是双向的,可以从channel往buffer读写数据,同时buffer也可以向channel读写数据。同步并阻塞,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。同步非阻塞,服务实现模式是一个线程可以处理多个连接,即客户端发送的连接都会注册到多路复用器上,然后进行轮询连接,有I/O请求就处理。异步非阻塞,引入了异步通道,采用的是proactor模式,特点是:有效的请求才启动线程,先由操作系统完成再通知服务端。

2024-08-13 20:10:30 194

原创 请求转发与重定向

设想这样一种情况,在我们登录某个网站时,登录页面会要求我们输入账号密码以及其他信息,当我们点击登录按钮时,浏览器会将我们的信息以及请求的一些信息发送到服务器端,在服务器端,我们可以从request中拿到这些信息,接下来需要对这些信息进行处理,我们会用到不同的web组件处理他们,比如我会在一个web组件1中将你的信息和数据库中的信息进行比对,而在另一个web组件2中判断你是管理员账号还是普通用户账号,这个时候,我们需要将信息送到两个不同的组件中,那么怎么做呢?

2024-08-13 20:09:10 526

原创 三次握手\四次挥手

2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)

2024-08-12 20:52:17 1170

原创 浅拷贝、深拷贝

对于数据类型是引用数据类型的成员变量,比如说该成员变量是某个数组或某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(即内存地址)复制一份给新的对象,也就说这两个不同对象的该成员变量都指向了同一个地址,此时在一个对象中修改该成员变量就会影响到另一个对象所拷贝得到的数据。有两个对象,分别为对象A和对象B,同时这两个对象都属于XX类,并且对象A和对象B都具有属性a和b,那么将对象A拷贝给对象B的操作过程就是:B.a = A.a;B.b = A.b;

2024-08-12 20:51:21 294

原创 AES加密

AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。

2024-08-11 08:38:26 328

原创 RSA加密

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,RSA就是他们三人姓氏开头字母拼在一起组成的。使用公钥加密的数据,利用私钥进行解密使用私钥加密的数据,利用公钥进行解密RSA是一对密钥。分别是公钥和私钥,这个公钥和私钥其实就是一组数字!

2024-08-11 08:37:11 793

空空如也

空空如也

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

TA关注的人

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