- 博客(264)
- 资源 (2)
- 收藏
- 关注
原创 Wasm -WebAssembly简介
Java 的 JIT(Just-In-Time Compilation)是一种将字节码(Java 编译器生成的中间代码)字节码是一种中间表示形式,它不是直接由CPU执行的指令集,而是设计为可以在虚拟机(Virtual Machine, VM)中解释或进一步编译成机器码来执行。核心理念:动态优化,提升运行时性能。
2025-04-20 16:54:44
920
原创 截图与穿刺查询
本文将介绍一些基于树的几何数据结构,用于回答截窗和穿刺查询。此类查询在许多计算机图形算法中都很有用。穿刺查询(Stabbing Query)将报告被单个对象穿刺的所有对象。对于线段集 S,典型的穿刺查询将报告由单个查询线1穿刺的所有线段。另一方面,截窗查询(WindowingQuery)将报告位于窗口内的所有对象。对于点集S,典型的截窗查询将报告查询框(QueryBox)B内的S的所有点。
2025-01-14 09:33:41
807
原创 Web Worker
JavaScript 语言采用的是单线程的,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。Web Worker 是一种在浏览器中实现多线程处理的技术,允许在后台线程中执行脚本,从而避免长时间运行的脚本阻塞用户界面。Web Worker 使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可能。这样做的好处是可以在独立线程中执行费时的处理任务,使主线程(通常是 UI 线程)的运行不会被阻塞/放慢。
2025-01-04 14:38:06
786
原创 BIO/NIO/AIO
内核空间总是驻留在内存中,它是为操作系统的内核保留的。所以,应用程序中的IO操作,无论是对socket的IO操作,还是对文件的IO操作,都属于上层应用的开发,它们的在输入(input)和输出(output)维度上的执行流程,都是在内核缓冲区和进程缓冲区之间进行的数据交换。网卡同步数据到内核缓冲区,如果内核缓冲区中的数据未准备好,用户进程发起read操作,阻塞则会一直等待内存缓冲区数据完整后再解除阻塞,而非阻塞则会立即返回不会等待,注意,内核缓冲区与用户缓冲区之间的读写操作肯定是阻塞的。
2024-12-15 15:48:00
909
原创 npm script学习 -- 创建并运行npm script命令
知道如何运行 npm script 之后,接下来我们在 hello-npm-script 项目中添加有实际用途的 eslint 脚本,eslint 是社区中接受度比较高的 javascript 风格检查工具,有大把现成的规则集可供你选择,比如 google、 airbnb。
2024-11-17 17:22:40
1032
1
原创 物理像素与逻辑像素
传统的pc屏幕,1个物理像素就等于1个逻辑像素。当然,我们描述一个图片占的小格子数总不能一个个地数小格子吧,图片是矩形,因此常常描述一个图片尺寸时就说多少乘多少像素,像素就是小格子,比如一张图片的尺寸是 300 * 300 像素,也就是说该图片的长、宽都有300个小格子,该图片一共占 300 * 300 = 90000 个小格子。css像素适用于web编程,指的是我们在前端样式代码中使用到的逻辑像素,是逻辑像素的一种,默认情况下,web页面的缩放比为100%,那么,1css像素=1逻辑像素=1物理像素。
2024-11-17 16:56:31
1149
原创 Java Web中的拦截器、过滤器及监听器
一般情况下,HttpSessionActivationListener和HttpSessionBindingListener一起使用,这两个监听器比较特殊,实现这两个接口的类不需要在web.xml中进行注册,被钝化的JavaBean对象会被持久化到存储设备中,活化的JavaBean对象会被从存储设备中恢复,前提是该JavaBean对象实现Serializable接口。可以控制请求的控制器和方法,但控制不了请求方法里的参数(用于处理页面提交的请求响应并进行处理,如国际化,主题更换,过滤等)。
2024-10-11 00:21:34
1082
原创 TypeScript高级语法(Omit、Pick、Partial、Required、Readonly、Exclude 、Extract、ReturnType、NonNullable)
假如有一个联系人列表。
2024-10-08 23:47:17
823
原创 WebGL雾化与半透明效果
一、雾化WEBGL中的雾化是一种视觉效果,可以模拟远处物体出现“雾气”或“烟雾”等效果,使场景更加真实。雾化可以让场景中的物体看起来模糊或透明,从而创建出一种深度感和距离感,增强场景的立体感。WEBGL中的雾化通常使用线性或指数函数来计算出物体的深度,然后根据深度来进行颜色和透明度的调整,从而实现雾化效果。调整透明度的方式有多种,例如将物体的alpha值进行平滑过渡,或者使用特定的shader程序来自定义透明度的计算方式。在实际的WEBGL应用中,雾化可以被用于增强场景的真实感,同时也可以用于创建特定
2024-09-25 23:00:05
939
原创 WebGL中光源的使用
WebGL中的光与现实世界中的光类似,是一种物理光线模拟。WebGL使用光线追踪算法来模拟光在3D场景中的反射、折射和散射等现象,以实现逼真的光影效果。在WebGL中,光源是光的来源,可以模拟不同类型的光源,如平行光、点光源、聚光灯等。光线从光源发出,经过场景中的各个物体后,被摄像机捕捉,生成最终的渲染图像。通过调整光源的位置、颜色、强度等参数,可以在WebGL中实现不同的光影效果,如明暗对比、高光反射、镜面反射等。这些光影效果可以增强3D场景的真实感和表现力。
2024-09-24 23:38:37
744
原创 WebGL立方体的绘制
webGL坐标系统,x沿水平方向从左到右,y垂直向上,z指向屏幕向外这些都是正方向canvas坐标系统,z,x一样,但是y是向下的。浏览器坐标系,x,是向左、y是向下的。tip: 鼠标点击的是浏览器的坐标系统,要先转换为Canvas的坐标系统,也就是0点是不一致的。然后就是webGL的坐标要进行归一化。同时把原点切换到Canvas的中心。网格:就是有一个或多个多边形拼接而成的,网格只能确定形状不能确定色彩和明暗等多边形:多指三角形和四边形模型:也就是3D的网格的别名顶点:就是定义多边形位置的3D
2024-09-22 18:45:22
1303
原创 WebGL颜色与纹理
在WebGL中,varying变量是在顶点着色器和片元着色器之间传递数据的一种特殊类型的变量。它们被用于在顶点着色器和片元着色器之间传递信息,以便在渲染过程中进行插值。在顶点着色器中,varying变量的值被计算并传递到片元着色器中,然后在片元着色器中进行插值,然后被用来确定要绘制的像素的颜色。Varying变量通常被用于将光照和纹理坐标等信息从顶点着色器传递到片元着色器中。由于它们是在渲染过程中插值的,所以它们可以用来创建平滑的过渡,使得渲染出来的图像更加真实和细腻。
2024-09-22 15:33:00
1338
原创 WebGL缓冲区
缓冲区对象时WebGL系统中的一块内存区域,可以一次性地向缓冲区对象中填充大量的顶点数据,然后将这些数据保存其中,供顶点着色器使用。//为什么要用uniform-因为要对所有的顶点实现同样的变换。//要绘制的大小(着色器变量使用的是浮点型)//要绘制的大小(着色器变量使用的是浮点型)//要绘制的大小(着色器变量使用的是浮点型)//要绘制的大小(着色器变量使用的是浮点型)data表示需要写入到缓冲区的顶点数据,如程序中的points。//BYTES*3,BYTES*2 就是数据偏移量。
2024-09-21 17:15:43
999
原创 WebGL初识
WebGL,是一项用来在网页上绘制和渲染复杂三维图形,并允许用户与之进行交互的技术。WebGL通过JavaScript操作OpenGL接口的标准,把三维空间图像显示在二维的屏幕上。
2024-09-19 23:38:07
1346
原创 Canvas图像合成
在默认情况下,将一个图像绘制在另一个图像之上,那么浏览器会简单地把源物体的图像叠放到目标图像上面。然而可以通过修改Canvas绘图对象的globalCompositeOperation属性修改这种默认的叠放,该属性可以取表中所列的任意一个值。这些值叫做Porter-Duff操作符,它们被描述在一篇由LucasFilm Ltd的Thomas Porter与Tom Duff所写的文章中,该文章发表在1984年7月的《Computer Graphics》杂志上。原文链接。
2024-09-16 20:12:09
955
原创 Spring--三级缓存机制
/ 一级缓存Map 存放完整的Bean(流程跑完的)// 二级缓存Map 存放不完整的Bean(只实例化完,还没属性赋值、初始化)// 三级缓存Map 存放一个Bean的lambda表达式(也是刚实例化完)用来解决什么问题?这个大家应该熟知了,就是循环依赖什么是循环依赖?就像下面这样,AService 中注入了BService ,而BService 中又注入了AService ,这就是循环依赖@Service@Resource@Service@Resource。
2024-08-25 11:48:27
5600
原创 Java中的各种锁
为了提高性能, Java 提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率。锁粗化是一种优化技术: 如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作都是出现在循环体体之中,就算真的没有线程竞争,频繁地进行互斥同步操作将会导致不必要的性能损耗,所以就采取了一种方案:把加锁的范围扩展(粗化)到整个操作序列的外部,这样加锁解锁的频率就会大大降低,从而减少了性能损耗。如果被其他线程访问,则称为线程逃逸。
2024-08-13 00:01:57
984
原创 Redis实现缓存一致性
redis作为应用与数据库之间的缓存层,通常应用在操作数据库之前先操作redis,读操作时只有redis不存在,才会操作数据库,写操作时需要更新数据库和redis缓存。通过canal组件订对biglog日志进行订阅,模仿数据库的slave数据库的备份请求,使得redis缓存数据删除,保证redis与数据库数据一致性。根据以上4种流程分析,可以明确出两个问题,一个是缓存是更新还是删除,另外一个是先操作数据库还是先操作缓存呢。先操作数据库的流程,就是先对数据库进行修改,再将缓存中的数据进行删除。
2024-08-11 12:05:21
949
原创 Java的线程实现
我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位,不过如果日后Loom项目能成功为Java引入纤程(Fiber)的话,可能就会改变这一点。
2024-08-10 17:25:33
600
原创 JVM -- 类加载器
自定义类加载器,重写loadClass(),不再使用双亲委派机制,而使用自己实现的loadClass()。其中自定义类加载器的父加载器为:应用类加载器(getSystemClassLoader())问题:两个自定义类加载器加载相同限定名的类,是否会冲突?不会,只有同一个类加载器且加载相同限定名的才会被认定为同一个类。
2024-08-07 23:41:40
1071
原创 JVM的组成 -- 字节码文件
作用是在Java代码中获取类的信息以及存储的静态字段的数据(JDK8之后)(JAVA编写)验证字节码信息是否满足《Java虚拟机规范》,比如对头魔数的校验(ca fe ba be)、版本号等的校验、元信息的校验(必须有父类)、指令是否正确等。该阶段会执行方法中的clinit方法中的部分指令,clinit方法是与JAVA代码中的方法顺序执行一致。常量池中的数据都有一个编号,编号从1开始,在字段或字节码指令中通过编号可以快速的找到对应的数据。将常量池中的符号引用替换成指向内存的直接引用。
2024-08-04 13:21:50
1045
原创 Java - Optional类
Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。通过Optional提供的方法,如map、orElse等,可以更优雅地处理可能为空的对象,避免显式的null检查,使代码更简洁。文章介绍了Optional的创建、获取值的方法以及注意事项,如避免基础类型的Optional和合理使用orElse方法。方法描述empty。
2024-07-28 15:58:45
924
原创 Java - Stream流库
Stream是Java 8新增的接口,Stream可以认为是一个高级版本的 Iterator。名称含义无存储Stream是基于数据源的对象,它本身不存储数据元素,而是通过管道将数据源的元素传递给操作。函数式编程函数式编程:对Stream的任何修改都不会修改背后的数据源,比如对Stream执行filter操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新的Stream。延迟执行。
2024-07-27 18:51:35
339
原创 Java多线程
进程:每个进程拥有自己的一整套变量。一个进程可以包含多个线程。线程:线程属于进程,多个线程会存在共享数据的情况发生,也就是多个线程会共享同一块内存区域。一个例子:打开word是一个进程,打开qq音乐又是另外一个进程,两进程之间不会互相影响(都有自己的一块内存区域)。但比如在qq音乐里一遍听歌,一遍又浏览排行榜,那就是在qq音乐这个进程里又有两个线程,它们之间会存在共享内存的情况。并发。
2024-07-21 14:14:33
768
原创 Java泛型和反射
本文重点介绍反射的概念,以及反射之于泛型的应用,如果对泛型不清楚的同学可以查看我的Java泛型程序设计一文JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
2024-07-16 02:08:53
978
2
原创 Java泛型程序设计
描述:不可以定义Pair[] pairs = new Pair[10];原因:类型擦除以后变为Pair[] pars = new Pair[10];然后我们可以赋予pairs[0] = new Pair();没有编译错误,但存在运行时错误。解决方法:使用ArrayList,ArrayList pairs = new ArrayList();
2024-07-14 16:42:14
604
1
原创 Redis之分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心是实现多进程之间互斥,而满足这一点的方式有很多,常见的有三种:实现分布式锁时需要实现的两个基本方法:释放锁:手动释放超时释放:获取锁时添加一个超时时间需求:定义一个类,实现下面接口,利用Redis实现分布式锁功能。简单实现redis分布式锁:改造上一章中加synchronized锁的代码:使用Redis分布式锁三、Redis分布式锁误删问题1. 误删问题分析线程1先获取锁后,由于业务阻塞还没执行完
2024-07-13 22:05:19
1029
原创 事务的学习
事务 是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销请求,这些操作要么同时成功,要么同时失败一组操作集合,不可分割,一起向系统提交/撤销,要么同时成功,要么同时失败。例子:如果a向b转账100元,总共分为三个步骤(1)检查a的手机余额是否>=100元(1)a的手机账户钱扣掉100元(2)b的手机账户增加100元。
2024-07-13 14:41:24
904
1
原创 Redis常见命令总结
对于 Redis 中的列表数据,一般是以 l 开头,为了方便记忆,可以理解成是 List,或者是 Left 中的 L,为什么要提 Left 以及说一般是以 l 开头呢,因为有一些操作是 r 开头,这个表示是对列表的右边进行数据操作。其中,value 可以是字符串,也可以是数字,对于数字 Redis 会自动识别,且可以使用一些字符串没有的操作,比如增加、减少等。对于字符串类型的数据,可以存储字符串也可以存储整数,对于整数,有一些额外的操作,比如自增1,自减1,自增n,自减n。
2024-07-09 01:23:36
1428
3
原创 怎么实现Redis的高可用
我们在项目中使用Redis,肯定不会是单点部署Redis服务的。因为,单点部署一旦宕机,就不可用了。为了实现高可用,通常的做法是,将数据库复制多个副本以部署在不同的服务器上,其中一台挂了也可以继续提供服务。Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。
2024-07-07 19:34:42
870
6
原创 Redis的持久化机制
Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。
2024-07-07 16:33:09
1310
3
原创 什么是缓存击穿、缓存穿透、缓存雪崩?
什么是热Key呢?在Redis中,我们把访问频率高的key,称为热点key。如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。而热点Key是怎么产生的呢?用户消费的数据远大于生产的数据,如秒杀、热点新闻等读多写少的场景。请求分片集中,超过单Redi服务器的性能,比如固定名称key,Hash落入同一台服务器,瞬间访问量极大,超过机器瓶颈,产生热点Key问题。那么在日常开发中,如何识别到热点key呢?凭经验判断哪些是热Key;
2024-07-06 12:43:09
1189
原创 Redis为什么这么快?
虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。我们都知道内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。I/O :网络 I/O。
2024-07-03 01:28:14
677
原创 Redis快速入门
Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。键值(key-value)型,value支持多种不同的数据结构,功能丰富单线程,每个命令具备原子性低延迟,速度快(基于内存,IO多路复用,良好的编码)支持数据持久化支持主从集群,分片集群支持多语言客户端与MySQL数据库不同的是,Redis的数据是存在内存中的。
2024-07-02 01:11:39
639
5
原创 Maven基础入门
这里我们可以对接 profile 这个单词中『侧面』这个含义:项目的每一个运行环境,相当于是项目整体的一个侧面。开发环境:供不同开发工程师开发的各个模块之间互相调用、访问;内部使用测试环境:供测试工程师对项目的各个模块进行功能测试;内部使用生产环境:供最终用户访问——所以这是正式的运行环境,对外提供服务MySQLRedisRabbitMQFastDFSNginxTomcat……就拿其中的 MySQL 来说,不同环境下的访问参数肯定完全不同,可是代码只有一套。
2024-06-23 20:50:18
1144
4
原创 牛顿迭代法(求解整数的近似平方根)
假设有函数:𝑓(𝑥)=0,要想求出其根,则可以:1: 给出一个初始点,则在该点的切线为:2: 沿着切线方向,与横轴相交,也即令则求的:3:更新,令4:按照1-3步骤迭代下去,直到精度满足要求上述算法的第1、2步,其实也就是函数𝑓(𝑥)在处的泰勒展开取前两项:上述泰勒展开式,取前两项并使之等于0,则有:,可以得到步骤2中的迭代公式。容易得出,点的切线方程为,要求,即相当于求的解。
2024-06-22 14:51:34
1208
5
原创 Spring MVC详解(下)
Spring MVC默认情况下可以对基本类型进行类型转换,例如可以将String转换为Integer,Double,Float等。但是Spring MVC并不能转换日期类型(java.util.Date),如果希望把字符串参数转换为日期类型,必须自定义类型转换器。
2024-06-20 00:14:11
853
5
原创 Spring MVC详解(上)
Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能Java Web开发者必须要掌握的技术框架。
2024-06-16 13:06:32
1167
3
原创 Spring 中使用MyBatis
我这里仅定义了几个简单的增删改查。分别添加mysql-connector-java(用于连接mysql数据库)、mybatis(mybatis核心库)、mybatis-spring(在spring中使用mybatis的库)的maven依赖包。UserMapper.xml的作用是告诉mybatis您在UserMapper接口定义的方法具体使用什么样的SQL及其他约束。1、MyBatis(前身为iBatis)是一个开源的Java持久层框架,它主要用于与数据库交互,帮助开发者更轻松地进行数据库操作。
2024-06-12 01:14:49
1381
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人