- 博客(31)
- 收藏
- 关注
原创 深入学习零拷贝
DMA(Direct Memory Access)是直接内存访问技术。在进行I/O设备和内存数据传输的过程中,数据搬运的过程全部交给DMA控制器,而CPU不参与任何与数据搬运的事情。这样说可能不太明白。CPU发出对应的指令给磁盘控制器,然后返回磁盘控制器收到命令后,将所需的数据从磁盘搬运到磁盘缓冲区中,之后发出中断CPU收到中断以后放下当前的事务优先处理中断请求(中断请求未完成不会处理其他事情),接着讲磁盘缓冲区的数据一次一个字节地读进自己的寄存器中,然后再把寄存器中的数据写入到内存。
2024-08-14 17:28:10
677
原创 深入学习Redis数据结构
redis是基于内存的数据库,对数据的读写操作都是在内存中完成的,操作速度快。常用于缓存,消息队列,分布式锁等场景数据结构:常见数据类型:String,Hash,list,set,Zset新支持:BitMap,HyperLogLog,GEO,Stream。
2024-08-12 19:46:24
493
原创 数据库连接池的深入学习
正常操作数据库需要对其进行连接,访问数据库,执行sql语句,断开连接。创建数据库连接是一个昂贵的过程,在高并发的情况下,频繁的创建数据库的连接可能会导致数据库宕机。有了连接池那么启动就创建多个连接对象,并保存起来,当需要的时候取出来执行sql语句,用完放回,那么极大的减少了连接的建立与摧毁的开销。池化技术从根本上就是将连接的对象保存起来,并不对其进行摧毁,那么在高并发的场景下不需要频繁的对连接进行创建与销毁,减少创建资源的开销。增加响应速度。(线程池也如此)
2024-08-08 20:35:41
300
原创 遇到缓存问题
value为缓存的名字。相当于开辟了一块空间,根据不同的请求参数,空间内会缓存多个结果,会根据请求参数生产一个key,需要对请求参数生产hashcode和equals方法,用于生产key。(如果缓存直接失效:比如缓存机器换了,热点key突然没有了)使用分布式锁,只让一个请求拿到锁并查询数据库,其他请求都失败,告诉其他用户稍后等待。当一个类需要保存起来,下次再还原成类是就需要序列化,或者需要远程传输,比如放到redis里,也需要序列化。当不加事务的时候执行sql,执行完之后会话就会结束,一级缓存就会消失。
2024-07-30 16:34:06
554
原创 Nacos的使用
作用:健康检查:比如有3个节点,其中一个已经挂了可能都不知道,另外两个还在提供服务。有控制中心可以从控制台上看见每个节点的状态,还可以主动的让某一节点下线,常用于发布前下线路由转发:在gateway中是按IP进行路由转发,生产情况下,不止一台,并且一个应用节点随时会扩容/缩减。高峰期扩容,低峰期衰减。为了控制成本,会对机械做动态扩容,此时的IP就不固定了。远程调用。
2024-07-28 17:34:38
370
原创 Web后端开发的学习
Aspect Oriented Programming (面向切面编程,面向方面编程) :面向特定方法编程。标签 :根据里面条件判断是否自动生产where子句 自动去除第一个条件多余的and /or。创建类,加上注解:@Component @Aspect//AOP类。优势:代码无侵入 减少重复代码 提高开发效率 维护方便。场景:记录操作日志 权限管理 事务管理。分页插件:PageHelper。
2024-06-14 17:17:18
1009
原创 网络通讯聊天工具的实现v2
在原有基础上加入文件的传输功能。从客户端传送到服务器后,服务器接受文件,再转发给其他客户端,客户端接受后服务器删除文件。涉及文件的读取与关闭。
2024-05-29 20:31:12
470
原创 生产消费者线程池的可视化实现V1
实现一个可视化界面,能够监控以及调整生产者,消费者线程池的参数系统1.生产者:-用户输入参数:线程:任务数量,每个任务生产的时间-可视化数据:已经生产的任务总量,任务生产消耗的时间2.消费者:(初步设为三个步骤)-线程池A/B/C:-用户输入参数:核心线程数量,最大线程数,非核心线程的存活时间,阻塞队列(工作队列)容量,每个任务消耗的时间。-可视化数据:每个线程池已经完成的任务量,工作队列的剩余任务数量,当前激活线程数量。-总体可视化数据:系统的运行时间,已完成的任务总量,预计完成时间。
2024-05-07 15:58:23
652
原创 阻塞队列的实现
添加方法:判断此时队列元素是否已满,满了的话就调用wait()的办法让他停下来,别继续添加了。当队列满了的时候叫生产者停止生产,装不下了,同时提醒消费者进行消费。添加和移除方法大部分就完成了,但是任会有一个问题就是可能会有多个线程同时调用,那么就需要给方法上锁。那么有人会想到如果将两个方法的判断换一下会不会依旧如此,可以试一下会发现生产者生产完了消费者才开始消费,就是一个逻辑问题,不能保证中间过程的进行。为了解决普通创建队列的线程安全问题,创建的普通队列在多个线程的查找与输入中导致数据的丢失。
2024-04-29 19:50:31
344
1
原创 线程池的简易使用方法
默认工厂创建的线程的特点:属于相同的线程组,具有同为Thread.NORM_PRIORITY的优先级,以及名为“pool-XXX-thread-”的线程名。5.没有空闲线程,阻塞队列已满,池中线程数等于maxmumpoolsize,就会采用handler中指定的策略来拒绝新的任务。核心线程就是启动后不会关闭的线程,为主要核心。3.如果没有,并且当前线程数等于核心线程数,则会将任务存入阻塞队列中,等待核心线程完成后再执行。2.如果没有,并且当前运行的线程少于核心线程数,此时会再开启一个线程来执行。
2024-04-28 16:44:06
444
原创 多线程的简单认识
进程是操作系统中进行资源分配和调度的一个独立单位,是应用程序运行的实例,拥有独立的内存空间。如:qq,微信等软件。每个进程至少有一个线程,即主线程。线程是进程中的一个实体,是cpu调度和执行的单位,是比进程更小的能独立运行的基本单位。比如:将qq视为一个进程,那么qq里面的功能,处理用户的交互,聊天记录的存储等可视为一个个的线程。用户使用的qq可以视为一个线程集合,运行在qq进程中。
2024-04-20 20:03:59
904
原创 HashMap的简易原理及实现
采用数组/链表的方式,时间复杂度为0(n)但当需要我们查找的数据量过大时,所需时间较多。当我们需要查找的时间复杂度比较小时可以采用哈希表。
2024-04-13 08:56:02
462
1
原创 算法刷题1
将两个升序链表合并为一个新的链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。想到递归的方法每次返回各链表最小的元素并指向下一个。调用自己直到list1 == null || list2 == null;
2024-04-08 18:46:17
268
原创 递归实现多重随机中点坐标的谢尔宾斯基三角形
本章使用动态数组的方式来实现,将每一个点存入数组中并且找到是否计算过相同两点的中点坐标来避免重复计算。中点中标有一个随机浮动的范围。
2024-04-08 10:32:02
572
原创 窗体的重绘
在之前所制造的画板窗体中实现了画出各种图形,但可以发现当我们缩放窗体时此时并未保留我们所画出的图形。应为窗体实现了改变大小是重新渲染绘制的方法,但我们所绘制的图形,并非是窗体的一部分,因此我们要实现窗体刷新时将保存的图形再绘制一遍。此时就需要重写窗体中重新绘制的方法。
2024-04-03 10:50:02
650
1
原创 界面中事件监听
在上篇创建简单的窗体口点击按钮并未反应,因为按钮的作者并未知道开发者使用按钮创建对象用于干什么,但他知道了你是否点击了按钮。因此设计了一套底层运行的调用逻辑,点击按钮时会调到一个接口中的方法。但这个方法没有具体的内容,为抽象方法。因此需要开发者自己编写。动作监听器接口:ActionListener 在java.awt.event中。
2024-03-30 15:13:40
318
1
原创 界面开发初级的学习
在界面开发中主要运用的就是创建对象与对象名调用的方法。创建对象:类名 对象名 = new 类名();对象名调用:对象变量名.方法名();
2024-03-28 19:54:01
236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人