自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 OSS(对象存储)

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。您可以使用阿里云提供的API、SDK包或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。

2026-02-12 10:36:24 777

原创 golang项目CRUD示例

import (})

2025-11-10 14:49:05 229

原创 【Redis】缓存和分布式锁

分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。

2025-08-22 20:15:00 1291

原创 【Redis】哨兵模式和集群模式

【2】Redis-Cluster 出现网络分区时,当一个客户端与至少包含一个主节点在内的少数节点被孤立,可能导致在节点超时时间(node timeout)内,另一个网络分区内的大部分节点重新选举被孤立主节点的从节点为新的主节点。并且会把其余的从变为新主的从。由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

2025-08-22 15:06:11 1363

原创 【Redis】主从复制

在分布式系统中为了解决单点问题(某个服务器程序只有一个节点(只搞一个物理服务器来部署这个服务器程序)。可用性不高:如果这个机器挂了意味着服务就中断了;性能 / 支持的并发量比较有限)。通常会把数据复制多个副本部署到其他服务器,满足故障恢复和负载均衡等需求。在分布式系统中,往往希望有多个服务器来部署 Redis 服务,从而构成一个 Redis 集群,此时就可以让这个集群给整个分布式系统中的其他服务提供更稳定、更高效的数据存储功能。在若干个 Redis 节点中,有的是 “主” 节点,有的是 “从” 节点。

2025-08-18 10:42:12 724

原创 Vue3精通速成

2020.9 vue.js 发布3版本。耗时2年多开发完毕。由尤雨溪团队打造。

2025-08-04 13:44:39 1102

原创 Redis事务

Redis事务可以理解为一种将多个Redis命令打包,然后一次性、有序地执行的机制。它确保这些命令作为一个整体进行执行,要么全部成功执行,要么全部不执行,从而保持数据的一致性。定义:Redis事务是一个单独的隔离操作,事务中的所有命令都会序列化,然后按照顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。特点:原子性:在事务块中,所有命令要么全部成功执行,要么全部不执行。这意味着在事务中出现错误时,所有已暂存的命令都会被回滚,确保数据状态保持一致。

2025-07-29 14:15:00 731

原创 git命令

git rebase --abort: 中止 rebase 操作并恢复到 rebase 开始前的状态。git merge-base --is-ancestor: 检查一个提交是否是另一个提交的祖先。git pull [remote] [branch]: 拉取远程分支并合并到本地分支。git fetch --prune: 获取远程仓库的最新变更并清理无效的远程分支。git pull --rebase: 拉取远程分支并执行 rebase 操作。

2025-07-29 09:47:42 869

原创 Redis持久化(三种)

因为Redis数据是在内存中的,重启时,内存中的数据就会丢失,所以有了数据机制。一共有三种持久化方式,来保证数据不丢失。:每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里;:将某一时刻的内存数据,以二进制的方式写入磁盘;:Redis 4.0 新增的方式,集成了 AOF 和 RDB 的优点;

2025-07-28 17:37:14 1071

原创 Docker的使用

docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。为了能保存数据,容器中引用了数据卷的概念。Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明, 每条指令构建一层,,通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建。

2025-07-10 09:31:26 7673

原创 Redis常见数据结构

Redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样​。

2025-07-09 14:46:27 964

原创 Spring IOC 和 Spring AOP

控制反转即主动变成被动;IOC控制反转,即 主动new对象变成由于 外部(IOC容器)去提供对象,被IOC容器所管理的对象也被称为 bean;

2025-06-04 20:00:00 755

原创 MyBatis-Plus

顾名思义,MyBatisPlus在MyBatis的后面添加了plus,从词义上来看应该是MyBatis的升级版;事实也如此,MyBatisPlus框架完全支持MyBatis框架的用法(我们在引入了MyBatisPlus框架的依赖之后就不需要再引入MyBatis框架的依赖了)。那是不是意味着MyBatisPlus将要取代MyBatis了?

2025-06-04 14:51:29 595

原创 实习面经(JAVA)

三次握手四次挥手反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

2025-05-27 13:41:23 801

原创 MyBatis

MyBatis(官网:https://mybatis.org/mybatis-3/zh/index.html )是一款优秀的 持久层 框架,用于简化JDBC的开发。是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

2025-04-20 16:17:08 683

原创 SpringBoot日志文件

我们SpringBoot内置了SLF4J和logback,我们用户不是直接操作具体的日志对象,而是首先会来到门面日志SLF4J,然后SLF4J然后再去操作具体的日志对象SpringBoot日志打印:1.得到日志对象2.使用日志对象去打印日志信息1.获取日志对象2.打印日志logger.info("我打印日志--logger");//打印日志logger.debug("我是debug级别的日志");logger.error("我是error级别的日志");

2025-04-13 18:53:22 742

原创 Spring MVC

MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。View(视图):用于展示模型中的数据的,一般为jsp或html文件。Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。

2025-04-07 21:11:21 1509

原创 SpringBoot创建与运行

2.选择SpringBoot项目,选择合适的jdk版本,设置项目源(默认为Spring官网:start.spring.io,如果网络实在不好,也可以使用阿里的)如果我们说Spring的诞生是为了简化Java程序开发的,那么SpringBoot的诞生是为了简化Spring程序开发的。如果在new project时出现这个标识,证明我们的插件安装成功,现在就让我们来创建一个SpringBoot项目吧。5.支持更多的监控指标:可以更加容易且直观的观察到项目的运行情况。1.通过idea创建(主流创建方式)

2025-03-18 11:38:10 530

原创 JVM内存模型

JVM是Java Virtual Machine的简称,Java虚拟机,虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统,常见的虚拟机有:JVM、VMwave、Virtual Box,目前最主流使用的JVM是HotSpot VM。

2025-03-09 03:30:00 1022

原创 HTTPS解决安全性问题

HTTPS(HyperText Transfer Protocol Secure)是一种安全的通信协议,用于在计算机网络上安全地传输超文本(如网页、图像、视频等)和其他数据。它是 HTTP 协议的安全版本,通过使用加密技术来保护通信的安全性和隐私性。HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。

2025-03-07 15:24:31 1390

原创 【网络原理】HTTP协议

HTTP,全称为超文本传输协议(Hypertxt Transfer Protocol),是一种应用广泛的应用层协议,用于在网络中传输超文本(如HTML等)。是基于传输层的TCP/IP协议栈实现的,定义了客户端(如浏览器)与Web服务器之间请求和响应的格式。简单来说就是客户端发送请求到服务器,服务器再接收到请求后处理,返回响应给客户端。通常使用端口80进行通信。超文本:就是传输的内容不仅仅有文本(如HTML、css),还可以是一些其他的资源(如图片、视频、音频等二进制的数据)

2025-03-03 18:50:31 752

原创 TCP协议

而区分地址是本地还是非本地是简单的,如果目的IP地址的网络号与子网号和我们的相同,则是本地的;如果目的IP地址的网络号与我们的相同而子网号与我们的不同,则可能是本地的,也可能是非本地的。将这称为字节流服务。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发送方每次发送了多少字节。当TCP发送一个SYN时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将MSS值设置为外出接口上的MTU长度减去固定的 IP 首部和 TCP 首部长度。

2025-02-21 14:21:54 1826

原创 网络编程套接字之TCP

我们这里的Socket既是客户端的Socket,也可能是服务器接收到客户端连接后,返回的服务器Socket,不论是那个Socket,都是双方建立连接后,保存对方信息,进行收发数据的。当我们客户端连接上这个服务器的时候,就执行到processConnection方法的while循环中,只要该方法不结束,我们的accpet就无法获取到第二个客户端socket对象。顾名思义,我们的TCP的长短连接,就表示我们TCP建立连接后,什么时候关闭连接就决定了是长连接还是短链接。在每次接收到数据并返回响应后,关闭连接。

2025-02-18 10:42:25 485

原创 网络编程套接字之UDP

我们的服务器做的工作:收到请求,根据请求计算响应,返回响应,最重要的环节就是计算响应这一部分,我们的echo server省略了这一部分,接收到什么就返回什么。我们的receive方法参数传入的是一个空的对象,receive方法内部会对这个对象进行填充,从而构造出结果数据,我们称这样的参数为输出型参数。我们网络编程的核心: Socket API,操作系统为我们应用程序提供的API,我们的Socket是和传输层密切相关的。发送不管对方是否准备好,接收方收到也不确认,所以是不可靠的。

2025-02-17 13:24:20 1144

原创 IO流操作

unicode(统一码,万国码)是计算机科学领域里的一项业界字符编码标准,容纳世界上大多数国家的所有常见的文字和符号。我们的计算机底层是不可以直接存储字符的,计算机中底层只能存储二进制(0、1),同时二进制是可以转换成十进制的。ASCll使用1个字节存储一个字符,一个字节是8位,一共可以表示128个字符信息,对于英文,数字是够用的。字符输入流:我们刚才所介绍的字节流,对于操作中文数据不太友好,我们现在来介绍一个非常针对中文操作的流对象|注意:GBK是中国的码表,一个中文以两个字节的形式存储。

2025-02-01 14:43:59 1177

原创 文件操作(File类)

我们的每个文件,在我们的硬盘上都有一个具体的"路径",比如我们这里的D:\IDEA,我们这里可以用/来分割不同的目录级别。广义的文件: 泛指我们计算机当中的很多软硬件资源,操作系统把许多软硬件资源抽象成了文件,按照文件的方式来进行统一管理。我们这个文件(File),在计算机中有很多不同的意义。我们这些数据是在内存中存储的,是不能够长久保存的。狭义的文件: 就是我们硬盘上的文件和目录(文件夹)磁盘中的数据形式就是文件,文件是数据的载体。我们目前是如何存储数据的?我们这里讨论的是侠义的文件。

2024-12-22 18:06:23 681

原创 JUC(java.util.concurrent)的常见类

我们的停车场的大牌子上就写着,当前剩余车位xx个,当有车进去,就相当于进行了一次P操作,计数器-1,当有车从停车场出来,就相当于进行了一次V操作,计数器+1,当我们的停车场的剩余车位为0时,也就是计数器为0时,如果有车想停车,要么在这里等,要么就去其他停车场。2. 我们Synchronized尝试加锁,如果锁已经被占有,就进行阻塞等待(死等),ReentrantLock提供了更灵活的获取锁的方式: trylock()我们的锁(可以认为是一个计数器为1的信号量),锁是信号量的特殊情况,信号量是锁的一般表达。

2024-12-19 15:04:53 914

原创 Synchronized锁原理及ConcurrentHashMap

如果其他的线程很快的释放锁,那么我们的自旋锁是非常合适的,因为并没有阻塞等待,而且一直尝试获取锁,但是如果其他线程长时间占用锁,那么我们自旋是十分的浪费CPU资源的,大概率我们Synchronized在自旋过程中,内部有一个计数器来记录我们自旋了多少次,自旋达到一次的次数我们就会升级为重量级锁。我们过年在房间吃花生,会剥皮,但是垃圾桶在客厅,我们现在有两种方案,第一种,剥一个花生,就去客厅扔一下皮,第二种,我们先把皮放在卫生纸上,等积攒一部分再去客厅扔,我们扔皮这个操作就相当于加锁。

2024-12-17 17:13:40 732

原创 常见的锁策略

按照我们之前对于锁的设定,当我们第二次加锁的时候,就会阻塞等待,直到第一次的锁被释放,才能获取到第一把锁,但是我们的第一个锁的释放也是由该线程完成,但是该线程正在尝试加锁,也就无法进行解锁操作,就会产生死锁。2. 你认为你朋友是比较闲的,大概率是在家的,所以你会直接去你朋友家(没有加锁,直接访问资源),如果确实在家,目的就达成了,如果不在家,下次再来(尽管没加锁,但能识别数据访问冲突),这是乐观锁。:在线程抢锁失败后,不是阻塞等待,而是快速的再循环一次,一旦锁被其他线程释放,就能第一时间获取到锁。

2024-12-16 16:56:18 824

原创 线程池(ThreadPoolExecutor)

/定义阻塞队列来报关任务throw new IllegalArgumentException("线程数量必须大于0");//创建线程i++) {try {});//提交方法throw new IllegalArgumentException("任务不能为空");

2024-12-13 17:34:24 614

原创 定时器(Timer)

我们自己实现一个定时器的前提是我们需要弄清楚定时器都有什么:1.一个扫描线程,负责来判断任务是否到时间需要执行2.需要有一个数据结构来保存我们定时器中提交的任务创建一个扫描线程相对比较简单,我们需要确定一个数据结构来保存我们提交的任务,我们提交过来的任务,是由任务和时间组成的,我们需要构建一个Task对象,数据结构我们这里使用优先级队列,因为我们的任务是有时间顺序的,具有一个优先级,并且要保证在多线程下是安全的,所以我们这里使用:PriorityBlockingQueue比较合适。

2024-12-01 09:15:00 1006

原创 阻塞式队列

/定义一个数组来存放数据//定义头尾下标//定义数组中元素的个数//构造throw new RuntimeException("队列容量必须大于等于0");//插入数据的方法//判断队列是否已满//阻塞队列在队列满的时候应该阻塞等待//阻塞等待//插入元素的个数//在队列尾部插入元素tail++;tail = 0;size++;//获取数据的方法//判断队列是否为空//获取出队的元素//移动head下标head++;//处理下标head=0;

2024-11-30 21:51:11 636

原创 单例设计模式

在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。

2024-11-22 10:15:00 2025

原创 volatile,wait,notify关键字

我们在循环的时候,代码稍加改写,加入sleep,让循环执行慢一点,也达到了预期的效果,但这也存在不确定性,最稳妥的做法就是对这些可能存在内存不可见问题的变量加上volatile关键字,volatile保证数据准确的同时,执行速度也会有所下降。我们t1线程在t2线程修改flg值之前,load的结果都是一样的,而且load 的 速度与cmp操作相比,速度慢了很多,于是我们JVM就会大胆的认为没人改flg值了,于是不再重复load了。我们可以发现,当我们加上volatile关键字之后,程序达到了我们预期的效果。

2024-11-21 20:51:48 799

原创 synchronized 关键字

2.假设有 A B C 三个线程, 线程 A 先获取到锁, 然后 B 尝试获取锁, 然后 C 再尝试获取锁, 此时 B 和 C 都在阻塞队列中排队等待. 但是当 A 释放锁之后, 虽然 B 比 C 先来的, 但是 B 不一定就能获取到锁, 而是和 C 重新竞争, 并不遵守先来后到的规则.因为在加锁的同时,会带来额外的时间开销,有些情况下,不使用多线程,不会面临线程安全问题,所以我们的一些集合并没有加锁,因此,我们在多线程情况下使用这些集合时,可以手动加锁。之前我们一直是单线程操作线程,所以也不用太注重。

2024-11-16 23:00:00 571

原创 线程安全问题

我们把一段代码想象成一个房间,每个线程就是要进入这个房间的人。如果没有任何机制保证,A进入房间之后,还没有出来;B 是不是也可以进入房间,打断 A 在房间里的隐私。这个就是不具备原子性的。那我们应该如何解决这个问题呢?是不是只要给房间加一把锁,A 进去就把门锁上,其他人是不是就进不来了。这样就保证了这段代码的原子性了。

2024-11-16 08:15:00 537

原创 线程的状态

TERMINATED状态实际是没什么意义的,因为一旦内核里的线程PCB销毁了,代码里的Thread对象t也没什么实际意义了,只是为了把t对象标识为" 无效状态 ",因为一个线程,只能start一次。我们只是启动了t1,t2线程,并没有等到t1,t2执行结束(好比运动会裁判在运动员刚起跑就停止秒表是类似的,我们要想记录真正的时间,就得等运动员冲线)线程执行结束才可以。状态是针对当前线程调度情况所描述的,又因为线程是调度的基本单位,所以我们所谈到的状态都是线程的属性。我们可以发现: 线程的状态是一个。

2024-11-15 10:00:00 983

原创 Thread类及常见方法

我们这个代码之所以能够起到修改flg就使线程结束,完全取决于线程内部的代码书写,我们只能起到一个通知作用,至于是否结束,还是取决于线程内部,即使我们sleep正在休眠,我们的标志位也可以唤醒sleep。(也叫后台线程), 简单的理解一下,我们手动创建的线程都是前台线程,JVM自带的线程都是后台线程,我们也可以通过setDaemon()方法将前台线程设置为后台线程。因为我们线程是随即调度的过程,线程的执行顺便我们无法把控,但在一些场景下我们需要有明确的线程程序顺序,等待线程,就是可以控制两个线程的结束顺序。

2024-11-14 21:35:31 845

原创 【MySQL】JDBC的连接

JDBC(Java DataBase Connectivity)java 数据库连接,是 JavaEE 平台下的技术规范,其定义了在 Java 语言中连接数据,执行 SQL 语句的标准,可以为多种关系数据库提供统一访问。

2024-10-28 19:52:16 3789

原创 【MySQL】索引与事务

当我们看一本书时可以通过目录快速的定位到我们想要的章节 ,在数据库中查询数据也需要遍历表,而且数据库是把数据存储在硬盘上的,所以读取数据十分的慢,因此就可以给数据库引入索引,提高查询速度。B+树是一种自平衡的树形数据结构,它通常用于实现关系数据库中的索引。B+树的名称中的"B"代表"平衡",而"+"意味着它的所有叶子节点都被链接在一起,形成一个有序的链表。所有数据都存储在叶子节点上,而非叶子节点只包含索引信息。所有叶子节点之间通过指针连接形成一个有序链表,便于范围查询。

2024-10-27 18:44:22 667

空空如也

空空如也

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

TA关注的人

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