自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络 (TCP/IP 四层协议中常见网络协议)

对于 server 来说, 我已经收到 1~1000 的数据, 不管 1001的ACK有没有被 client 接收到, 当我接收到 1001 ~ 2000 的数据时, 就可以直接返回 ACK = 2001。接收到数据时, 如果接收数据的主机立刻返回 ACK, 则返回的窗口会较小 (返回过程和新数据的传输过程是需要耗时的, 接收数据的主机已经处理了很多数据). 因此我们可以慢一些再返回数据。ACK 的含义是, 确认序号之前数据都已收到, 即对于 2001 的 ACK 来说, 1~2000 的数据都已收到。

2024-04-21 14:36:42 945 1

原创 SpringBoot 操作 Redis

对 Redis 中的每个类型进行了封装, 使用对应类型的对应方法要先选择操作类型。SpringBoot 是通过。对 Redis 进行操作。

2024-04-21 14:36:22 413

原创 基于 Socket 的网络编程

Socket 套接字, 是由系统提供的, 用于网络通信的技术, 是基于 TCP/IP 协议的, 网络通信的基本操作单元.长连接: 不关闭连接, 一直保持连接状态, 双方不停的收发数据. (长连接可以多次收发数据)短连接: 每次接收到数据并返回响应后, 都会关闭连接. (短连接只能一次收发数据)长连接有两种实现方式, 基于 BIO 的长连接和基于 NIO 的长连接。(同一台主机的不同进程间, 基于网路的通信也可以称为网络编程)指网络上的主机, 通过不同的进程, 以编程的方式实现。一般根据字段的特点进行设计。

2024-04-20 13:14:09 861

原创 网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)

物理层: 数据在设备之间通过光信号(电缆) 传输, 而在设备上以电信号(高低电平 =>01信号) 存储, 物理层负责光/电信号的转换。网络协议用来规定通信过程中, 使用什么类型的数据, 用什么方式请求, 用什么类型响应 等等。首部信息中包含一些类似于: 首部长度, 载荷长度, 数据类型, 上层使用协议 等等的信息。挺抽象的, 了解就好, 重点是学习我们正在用的 TCP/IP 五层模型。(节点: 网络通信中所有的设备, 主机, 路由, 交换机 …又称内网, 局域网和局域网之间在没有连接的情况下, 无法通信。

2024-04-20 13:13:05 807

原创 Spring AOP

为其他对象提供一种代理, 以控制对这个对象的访问. 它的作用是通过一个代理类, 让我们在调用目标方法的时候, 不再是直接调用目标方法 (有可能参数不适配, 返回值不准确 …) , 而是通过调用代理类, 代理类里面再调用目标方法的方式,像拦截器作用维度是 url(一次请求和响应), @ControllerAdvice 的应用场景主要是全局异常处理, 数据绑定, 数据预处理.Spring AOP 的作用维度则可以更加细致 (包, 类, 方法, 参数 …JDK 动态代理, 只能代理接口, 不能代理普通类。

2024-04-19 09:19:58 1145

原创 Spring 事务 (编程式 & 声明式, Spring 事务传播机制)

事务会把所有的操作作为一个整体, 一起向数据库提交或是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败。如果方法执行过程中, 出现异常, 且未被捕获, 就进行事务回滚.如果当前存在事务, 则创建一个事务作为当前事务的。一个新事务, 如果当前存在事务, 就将当前事务。的方式运行, 如果当前存在事务, 就将当前事务。以非事务的方式运行, 如果当前存在事务, 就。该事务, 如果当前不存在事务, 则。该事务, 如果当前不存在事务,就以。强制性, 如果当前存在事务, 就。该事务, 如果当前不存在事务, 就。

2024-04-19 09:19:36 473

原创 Spring Boot统一功能处理(拦截器, 统一数据返回格式, 统一异常处理)

实现。

2024-04-18 09:24:02 681

原创 MyBatis

数据库连接池负责分配, 管理, 和释放数据库连接. 它允许应用程序重复使用一个现有的数据库连接, 而不是每次使用都要重新简历, 使用完毕就释放销毁.简单的说 : Mabatis 是更简单完成程序和数据库交互的框架, 也就是更简单的操作和读取数据库的工具。< include > 标签 : 通过 refid 属性, 绑定要包含的代码片段。< where > 标签能够自动去除子句开头的。< set > 标签能够自动删除 额外的逗号。< sql > 标签 : 定义可重用代码片段。Mybaits 是一个优秀的。

2024-04-18 09:23:16 697

原创 Spring Boot 配置文件

当应该程序启动时, Spring Boot 会自动从 classpath 路径找到并加载 application.properties / application.yml / application.yaml。配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息放在一个集中 的地方. 当程序启动时, 应用程序会自动从配置文件中读取数据, 并加载运行.\n 的本意是换行, 如果使用单引号将含 \n 的代码包裹或者对其不做处理, 那么 \n 将不再表示换行的含义。

2024-04-17 12:52:46 423

原创 Spring (IoC & DI)

一种说法是 Spring 家族, 包括 Spring Framework, Spring Boot, Spring MVC, Spring Security …另一种是指 Spring Framework 框架, 下面内容所指 Spring , 均为 Spring Framework 框架Spring 是包含众多工具方法的 IoC 容器 (所以有时也称 Spring 为 Spring 容器)Spring 的两个核心特性:IoC & AOP。

2024-04-17 12:52:37 1088

原创 Spring MVC

MVC 是一种思想, 是一种软件架构设计模式, 他把软件系统分为模型, 视图, 控制器三部分处理程序中数据逻辑部分 (真正干活的)界面显示, 人机交互控制管理, 选择处理模型简单来说: Spring MVC 是一个实现了 MVC 思想的 Web 框架Spring MVC 是 MVC 思想的一种实现, 是基于 Servlet API 构建一个 Web 框架, 它一开始就包含在 Spring Framwork 中。

2024-04-16 11:58:43 1240

原创 Maven (简单理解)

Maven 是一个项目管理工具, 通过 pom.xml 文件的配置, 来获取 jar 包(而不用手动下载, 添加 jar 包)官方一点的说法: Maven 是一个项目管理工具, 基于 POM (Project Object Medel 项目对象模型) 的概念, Maven 可以通过一小段描述信息来管理项目的创建, 报告, 文档.

2024-04-16 11:58:36 313

原创 Websocket (帧格式, 握手过程, Spring 中使用 WebScoket 协议)

客户端 A 和客户端 B 的消息传播需要借助服务器的中转 (原因是内网不能给另一个局域网的内网直接联通, 需要借助服务器的外网做 “中介”) (NAT 地址转换)Http 协议不支持实时通讯(或者说不支持服务器主动推送数据给客户端)TCP 本身是具有服务器推送数据这样的功能的, 但是 Http 把它搞丢了 (发明 Http 的大佬们当年所处的时候, 网页就是用来看看新闻, 也没想到后辈能把网页玩出花来)于是有了WebSocket 协议.(基于传输层的TCP实现) (和 Http 一样, 都是。

2024-04-15 15:18:11 1018

原创 MySQL (索引 & 事务)

或者说读到的数据是有问题的 (用户A正在对数据进行修改, 用户B就开始读数据, 等B读取完毕之后, A才修改完毕, 那么此时B使用的就是个错误的数据)MySQL 中的普通索引类型, 没有什么限制, 允许在定义索引的列中插入重复值和 NULL 值, 一个表允许创建多个普通索引。指多个字段上创建的索引, 只有在查询条件中使用了创建索引时的第一个字段, 索引才会被使用 (组合索引遵循最左前缀原则)常用于 BLOG, TEXT, 或者很长的 VARCHAR, 可限制索引列的长度 (全文索引的简化版)

2024-04-15 15:17:55 816

原创 redis(缓存)

访问的 key 在 Redis 和 数据库中都不存在, 这样的 key 并不会被用户获取到, 也不会被更新到Redis 中, 后续若是仍有此请求, 仍会访问数据库 (会导致数据库压力变大)当 Redis 作为 MySQL 缓存, 刚刚启动的时候, 会有大批 热点数据 生成到 Redis 中, 此时会造成 MySQL 的压力很大。的容量是有限的, 对于热点数据的不断插入, 需要把一些 “不是那么热门” 的数据删除, 对此。– 记录每个 key 的访问次数, 每次淘汰访问次数最少的 key。

2024-04-14 15:34:33 582 2

原创 Redis (分布式锁)

分布式系统下, 会涉及到多个进程同时访问同一个公共资源的情况, 此时就需要通过锁来做互斥操作, 这个锁就被称为分布式锁分布式锁的本质: 使用一个或一组服务器来记录 加锁状态把 Redis 中存储的一个键值对, 当作锁当其他进程使用公共资源前, 都需要尝试往 Redis 中存储该键值对, 视为加锁操作, 如果该键值对已存在, 则加锁失败, 不能使用公共资源当占用公共资源的进程结束使用后, 由该进程把 Redis 中的 “锁” 删除掉, 视为解锁操作Redis 可用作分布式锁的原因。

2024-04-14 15:34:26 733

原创 Redis(哨兵模式)

问题: redis 主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工进行主从切换, 同时大量客户端需要被通知切换到新的主节点上, 对于有一定规模的应用来说, 对于人力的资源消耗会很大.解决: 通过哨兵对主从结构进行监控, 一旦出现主节点挂了的情况, 自动的选举新主节点, 搭建新主从结构, 并主动通知客户端进行主节点切换.

2024-04-13 15:17:10 898

原创 Redis(主从模式)

在若干个 Redis 节点中, 其中一个是主节点, 其余是从节点从节点上的数据随主节点变化, 从节点与主节点保持一致主节点数据允许修改和读取, 从节点数据只允许读取不允许修改tips: 由于数据的同步,主节点只能同时存在一个, 不然会出现 谁跟谁同步, 谁与谁保持一致等问题 (这就是集群的内容了)

2024-04-13 14:39:54 921

原创 Redis(事务)

本篇博客中 Redis 事务是和 MySQL 事务对比来说的(要不我也不会了 …)

2024-04-10 22:19:53 438

原创 Redis(持久化 -- RDB & AOF)

redis 是一个内存数据库, 也就是说本身是不持久的(但是快[效率高]), 于是 Redis 提供了持久化机制 — RDB 和 AOF。, 都记录到一个文件中, 当 Redis 重启的时候, 会读取这个 AOF 文件的内容(一堆操作), 来恢复数据 .缓冲区: AOF 机制会将用户操作/命令, 先写入到缓冲区, 积累一些后,再统一写入硬盘 AOF 文件末尾。以独立日志的方式记录每次写命令, 重启时重新执行 AOF 文件中的命令以达到恢复数据的目的 .二者都是对 Redis 数据的硬件备份, 区别在于。

2024-04-10 22:17:28 1307

原创 多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)

包, 存放了并发编程相关的组件, 目的是更好的支持高并发任务 (多线程只是实现并发编程的一种具体方式 …, 就会出现阻塞等待清空 (资源为零, 无法继续消耗了), 直到有线程让信号量大于零, 才会唤醒该阻塞的线程。可重入互斥锁, 和 synchronized 定位类似, 用来实现互斥效果, 保证线程安全.锁 可可以视为计数器为 1 的信号量, 二元信号量。原子类内部用的是 CAS 实现, 更高效的解决了。: 申请一个可用资源, 计数器 - 1。: 释放一个可用资源, 计数器 + 1。

2024-03-21 21:16:56 982

原创 多线程(CAS, ABA问题, Runnable & Callable)

假设存在两个线程 t1 和 t2, 存在共享变量为 num, 初始值为 A.接下来,线程 t1想使用 CAS 把num值改成Z, 那么就需要先读取num的值, 记录到oldNum变量中使用 CAS 判定num的值是否等于oldNum, 如果相等, 那么将Z写入num那么如果在这两个步骤之间,t2线程对num进行了操作, 把num的值从A改成了B, 又从B改成了A对于线程 t1来说,A->B->A的变换不可见, 但是仍会进行第二步操作, 即, 这就是ABA问题: CAS 的误判。

2024-03-21 17:42:35 443

原创 多线程(锁升级, 锁消除, 锁粗化)

StringBuffer.append() 涉及加锁解锁操作, 但是如果在单线程环境下运行此代码, 那么这些加锁解锁操作就会浪费不必要的资源, 就会被自动消除掉(编译阶段。锁粗化就是: 一段逻辑中多次出现加锁解锁操作, 编译器 + JVM 就会自动将这些操作合并为一个加锁解锁操作 (加锁和解锁操作涉及资源的消耗)JVM 将 synchronized 锁分为四个状态: 无锁, 偏向锁, 轻量级锁, 重量级锁.如果后续有其他线程来竞争锁, 就会根据标记, 取消 偏向锁状态, 进入轻量级锁状态。

2024-03-21 17:00:55 341

原创 文件IO(代码案例: 文件复制, 指定目录查找文件, 指定目录查找内容)

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)使用操作字节流的对象操作文件。

2024-03-20 22:22:36 351

原创 文件IO (File对象, 文件读写)

二进制文件: 保存的是按照标准格式保存的非被字符集编码过的文件(存的是二进制数据, 不一定是字符串, 可以存任何类型数据 [图片, 音频 …尽可能多的将数据读取到 b 数组里, 返回值为读取到字节的数量, 当读取完毕后再读取, 返回值为。无参版本, 一次读一个字节, 返回值为读到的字节, 当读不到内容时(EOF) , 返回值为。绝对路径: 以盘符**(c: d: e:)**开头的路径。Java 标准库的流对象, 分为两个大类。文本文件: 存的是被字符集编码过的文本。广义的文件: 泛指计算机中的很多。

2024-03-20 21:26:54 1052

原创 多线程(锁策略, synchronized 对应的锁策略)

预测锁的竞争不会很激烈, 因此会少做一些工作 (假设数据一般不会出现并发冲突, 因此当数据进行提交的时候, 才会对数据进行检测, 如果判断出现了并发冲突, 就返回信息给用户, 让用户决定如何去做)当一个线程结束对某个资源的占有, 由下一个线程来获取该资源, 而下一个线程所在的就绪队列, 是有序的, 先来先到, 依次获取锁。在产生冲突时, 挂起等待锁不会主动去竞争锁, 而是等锁资源被释放, 被动通知你可以来进行锁竞争。加锁解锁 的开销比较大, 效率低 (多数情况下, 悲观锁也是一个重量级锁)

2024-03-14 21:37:52 417

原创 多线程(线程池)

ThreadPoolExecutor.CallerRunsPolicy: 多出来的任务, 谁添加的, 谁负责执行。即事先把需要使用的线程创建好, 放到 “池” 中, 需要的时候从 “池” 里取, 用完再放回 池里取。ThreadPoolExecutor 提供了更多的可选参数, 可进一步细化线程池行为的设定。, 说明线程池中线程拿到任务后,依旧是抢占式执行, 随机调度。循环结束后,进程并未结束, 说明线程池中的线程, 都是。池的概念意味着可以复用, 减少创建, 销毁线程的消耗。

2024-03-14 20:45:49 371

原创 多线程(死锁)

先介绍独占性的资源 : 即再同一时刻某种资源只能由一个进程使用, 比如打印机, 同一时刻一台打印机不能有两个输出结果那么两个进程独占性的访问某个资源, 从而等待另一个资源的执行结果, 会导致两个进程都阻塞, 并且两个进程都不会释放各自的资源, 这种情况就是 “死锁”

2024-03-14 18:54:44 270

原创 多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)

这样小菜鸡们可以根据这些方案(ACM里面叫板子, 象棋五子棋里叫棋谱, 咱这里叫 设计模式), 略加修改, 这样代码再差也差不到哪里去 …单例模式就是巧用 Java 的语法规则, 达成了某个类只能被创建出一个实例 (单线程多线程下都只能创建出一个实例)饿汉模式就是直接创建对象, 需要用的时候可以直接用, 不用再等待实例的创建等过程。在有些场景中, 有些特定的类, 只允许创建出一个实例, 不应该创建出多个实例。懒汉模式就是不直接创建对象(实例), 什么时候用到, 才创建对象(实例)让一个任务在指定时间运行。

2024-03-14 16:57:34 1063

原创 多线程(volatile)

, 就是如果你连续10000次读取值的时候, 如果发现主内存和工作内存中的值没有任何变化, 那么在第10001次读取值的时候, 编译器就不把主内存的数据同步给工作内存了 (同步也是需要消耗资源的…给变量手动加上 volatile 关键字, 就是告诉编译器, 这个变量是 “易变” 的, 每次使用的时候都要重新读取这个变量的内存内容, 不要随随便便进行优化了。t2 线程进行修改的值, 先修改自己工作内存中的值, 然后把工作内存的值同步到主内存。运行结果, t1 线程感知到 t2 线程中变量的修改。

2024-03-14 14:17:59 906 1

原创 多线程(线程安全)

Java 标准库中的线程安全类

2024-03-14 12:47:46 683 1

原创 多线程(创建多线程的五种方式,线程状态, 线程中断)

创建多线程有多种形式, 此处介绍五种。

2024-03-14 09:35:45 177

原创 JVM(垃圾回收机制 --- GC)

如果内存中垃圾很多, 此时触发一次 GC 操作, 开销可能非常大, 还可能会触发一些锁操作, 因此会导致业务代码无法正常执行。关键是看这个有没有引用 “指向” 它, 没有引用指向的对象, 自然不可能被用到, 就是垃圾了。把内存空间均分成两份, 每次将不是垃圾的对象复制到另外一边, 然后把整个含垃圾的区域清理掉。缺点: 需要消耗额外资源, 有额外性能开销 , 此外, 易触发。引入概念: 年龄 ---- 熬过 GC 的轮次 (没被清理)好处: 省心, 写代码简单, 不易出错。Full GC : 老年代 GC。

2024-03-05 13:51:30 745

原创 JVM(类加载机制)

此时 BootstrapClassLoader 会加载该类, 即搜索自己负责的标准库目录里的相关类, 如果找到, 就加载, 找不到,则由子类加载器进行加载。现在 BootstrapClassLoader 就要去加载了, 在此之前, BootstrapClassLoader 也会先委派给自己的父亲,ExtensionClassLoader : 负责加载 JVM 拓展类 中的类, 规范之外, JVM 厂商 / 组织提供的额外的功能。即用到了, 才加载, 加载过后, 后续使用不必重复加载。

2024-03-04 21:14:02 1240 1

原创 JVM(内存区域划分)

JVM - Java虚拟机我们编写的 Java 程序, 是不能够被 OS 直接识别的JVM 充当翻译官的角色, 负责把我们写的的 Java 程序 ,翻译给 OS “听”, 让 OS 能够识别我们所写的 Java 代码。

2024-03-04 20:26:01 368

原创 多线程 (下) - 学习笔记

CAS (Compare and swap) : “比较与交换”, 是一种实现并发算法时常用到的技术相当于通过一个原子的操作, 同时完成 “读取内存, 比较是否相等, 修改内存” 这三个步骤. 本质上需要 CPU 指令的支撑有三个操作数 : 内存中的原数据 (V) , 旧的预期值 (A), 修改后的值 (B)比较 A 与 V 是否相等如果 A == V , 那么将 B 写入 V返回替换操作, 是否成功 (true or false)伪代码如下 (真实的 CAS 是一个原子操作)

2023-12-15 14:40:57 920

原创 redis-学习笔记(Jedis zset 简单命令)

zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员。zrangeWithScore 返回 key 对应的 对应区间内的。删除 zset 中指定的元素 ,返回的是 删除成功的元素个数。zrange 返回 key 对应的 对应区间内的。返回 key 对应的 zset 的长度。返回 zset 中选定元素的 排名。获取 zset 中成员的 得分。内部依据 score 排序。查找不到元素返回 null。

2023-12-13 20:09:08 572

原创 redis-学习笔记(Jedis hash简单命令)

hmget 的返回值是一个一个 List 列表 (参数仍是变长参数)注意, hmset 里面插入的是一个 Map。往 hash 里面塞数据和获取数据。批量插入数据, 获取数据。hkeys 获取所有的。hvals 获取所有的。

2023-12-13 19:46:11 505

原创 redis-学习笔记(Jedis set 简单命令)

sinterstore 将交集存储到某一个 set 中去, 返回的是交集的个数。sadd 往 set 中添加数据, 第二个参数仍是变长参数。smembers 查看 set 中的元素。判断在 set 中该值存不存在。随机删除一个 set 中的值。查看 set 中元素的数量。sinter 返回交集的值。求多个 set 的交集。

2023-12-13 18:53:15 468

原创 redis-学习笔记(Jedis list简单命令)

lpush 头插, 第二个参数为变长参数, 即可以一次往里面添加 N 个值lrange 获取列表某一下标区间的内容, 注意返回值类型代码演示。

2023-12-13 17:32:23 568

空空如也

空空如也

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

TA关注的人

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