- 博客(249)
- 收藏
- 关注
原创 JVM篇4-JMM(java的内存模型)
java内存模型与java内存结构不同,java内存模型是Java Memory Model(JMM),JMM定义了一套在多线程读写共享数据(成员变量、数组)时,对数据的可见性、有序性和原子性的规则和保障。一个例子来体会原子性。两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次,结果为0吗?结果是不一定,可能是正数、负数和0。原因是java中对静态变量的自增、自减并不是原子操作,CPU会进行交错的执行。可以看到静态变量的自增是iadd加一个常量1,就是一个加法(与局部变量不同
2026-03-12 14:06:46
248
原创 JVM篇3-类文件结构、字节码指令及执行流程、编译期处理、类加载
java源代码文件(java source)编译为字节码文件(java class)做了优化处理。字节码文件通过类加载器(ClassLoader)加载到JVM中,就可以执行其中的字节码指令,执行时需要由执行引擎中的解释器(Interpreter)来进行解释执行,解释过程中会对热点代码进行运行期的编译处理。
2026-03-03 09:13:15
565
原创 算法8-中级提升班3(实战篇)
根据pre数组的第一个元素a和in数组中a元素的位置得到二叉树a的左右两部分,将a填到pos最后位置,再递归左右两部分(注意,pre,in,pos的左右两部分的位置不同,所以需要六个下标prei,prej,ini,inj,posi,posj,左右两部分的长度在in数组中可以确认)假设arr[i]=a,求上一次出现a的位置,若是在i-1-arr[i-1]的前面,则arr[i]=arr[i-1]+1,否则,arr[i]=i-上一次出现a的位置。(3)当前位置i为“.”,i+1位置为“.”,i+1位置安置灯。
2026-02-05 16:38:40
494
原创 算法7-中级提升班2(实战篇)
左右两侧肯定没水,一开始左边的点的左边最大值已知,右边的点的右边最大值已知,最大值小的一边往中间移动。注意,在将一个字符串整数转为整数时,需要先保留这个数的正负,将每一位乘以10的倍数的负数加起来,再变换正负性,因为最小的那个负数,若是先求后面的整数再在前面加一个符号会导致溢出(整数的负数范围比正数范围大1)。(1)若是一个值与上方、左方和左上方的值有关,则要在直接覆盖第一行的数据的某个位置的值时,需要用一个变量保存这个值用于下一个位置的计算,再去保留下一个位置覆盖的值。否则a的盛水量为0。
2026-02-04 09:04:36
434
原创 算法6-中级提升班1(实战篇)
(2)若位置为i的字符为“)”,若dp[i-1]=a,若dp[i-a-1] = = ‘(’,则dp[i]至少a+2,需要再看dp[i-a-2]的值,大于0需加上;(因为当使用n个8类型剩余了k个,使用n-1~n-6个8类型都不能时剩余正好放入6类型袋子,即k+8,k+16,k+24都不能完全放入6类型袋子,后续也不可能了,比如k+24放不下,那k+32与k+32-24=k+8的情况相同)。例如,对于数组[3,2,5,7,0,0],差值为2的去重数组对为(0,2)、(5,7)、(3,5)。
2026-01-30 11:06:36
490
原创 算法4-并查集、KMP、Manacher算法、滑动窗口、单调栈、树形dp、二叉树morris遍历
初始时每个元素单独为一个集合。查询操作:查询两个元素是否属于一个集合。合并操作:将a所在集合和b所在集合合并。注意:若是使用哈希表则查询操作为O(1),但是合并操作较慢,若是使用了链表,则查询操作较慢,合并操作为O(1)。同一个集合的元素指向同一个根节点即代表元素(一直往上查找)。//元素简单包了一层//元素对应元素包装//元素包装对应代表元素的包装//集合的代表元素(集合所有元素指向的根节点)大小//给每个元素包装//初始时每个元素指向自己。
2026-01-23 11:29:53
497
原创 JVM篇2-StringTable、直接内存、垃圾回收
intern()方法是主动将串池中还没有的字符串对象放入串池。JDK1.6的intern()是深拷贝,复制一个字符串对象放入到串池中,串池中的字符串和堆中的字符串地址不相同。JDK1.7+的intern()是浅拷贝,将堆中new String()对象的引用地址拷贝到串池中,且后面的字符串都指向该引用地址。
2026-01-21 16:02:12
482
原创 算法2-哈希表和有序表、链表、二叉树、图
java中的哈希表为HashSet和HashMap。哈希表中增删改查的操作都是常数级别(O(1)),但是常数比较大。注意:HashSet中存的是基本数据类型则存的是值,若是引用类型则存储的是内存地址(只占8字节)。HashMap的key值拷贝存储,value和HashSet的存储原理相同。
2026-01-13 15:25:12
469
原创 JVM篇1--JVM内存结构
Java Virtual Machine Stacks(Java虚拟机栈),是线程运行需要的内存空间。每个栈可以看成由多个栈帧(Frame)组成,一个栈帧对应一个方法运行时需要的内存,包括参数、局部变量,返回地址等信息。每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。若是一个方法a调用另一个方法b,则方法a的栈帧先入栈,后方法b的栈帧入栈,方法b执行完后方法b的栈帧出栈,方法a执行完方法a的栈帧出栈。
2026-01-07 15:44:55
451
原创 算法1-排序算法,位运算,查找(二分查找,查找局部最值),递归,快排
通过相邻元素的比较和交换,将较大的元素逐渐“浮”到列表的末尾(就像气泡从水底升到水面一样,因此得名“冒泡排序”)。
2026-01-07 14:56:52
454
原创 springcloud篇10-多级缓存
缓存的作用是减轻数据库的压力,缩短服务响应的时间,从而提高整个服务的并发能力。之前学习过的单阶能力已经很高了,但是依然有自己的上限,对于像淘宝、京东这种并发量达到上的场景,仅靠redis缓存不够,需要使用。传统缓存:上图中的缓存策略存在一些问题(1)用户请求需要经过tomcat,由tomcat去查询redis缓存,tomcat本身的并发能力不如redis,即tomcat的性能成为整个系统的瓶颈。(2)redis缓存失效时,会对数据库造成压力。
2025-12-26 14:14:45
761
原创 Springcloud篇9-Elasticsearch-3(数据聚合、自动补全、数据同步、集群)
聚合可以实现对文档数据的统计、分析、运算(MySQL中的聚合函数有avg,max,min,sum,一般还要结合group by 分组使用)。常见的有三类:(1):用来对文档做分组。TermAggregation:按文档字段值(该字段不能分词,不能是text)分组Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组(2):用以计算一些值,比如最大值、最小值、平均值Avg:求平均值Max:求最大值Min:求最小值。
2025-12-16 11:34:12
863
原创 Springcloud篇8-Elasticsearch-2(DSL查询进阶、RestClient使用及黑马旅游案例)
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:(1):查出所有数据。例如match_all。(2):利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如,match_query,multi_match_query。(3):根据精确词条值查询数据,一般是查找keyword、数值、日期、boolean等类型字段。例如,ids,range,term。(4):根据经纬度查询。
2025-12-10 18:24:38
881
原创 springcloud篇7-Elasticsearch-1(安装ES与Kibana、IK分词器、索引库操作、文档操作、RestClient)
elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。
2025-12-03 15:27:06
844
原创 springcloud篇6-分布式事务(seata)
导入学习资料里的项目代码:执行学习资料里的.sql文件:启动nacos和seata-demo项目中所有的微服务。下面看一下业务逻辑:使用postman进行测试:调用成功后:再下购买10个商品的单:说明,这些微服务的状态不一样。库存服务出错,账户服务并不知道,账户服务执行完扣款操作后提交事务。:在分布式系统下,一个业务跨多个服务或数据源,每个服务都是一个分支事务,要保证所有分支事务最终状态一致。
2025-09-02 17:45:08
959
原创 springcloud篇5-微服务保护(Sentinel)
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口。(一)添加继承BlockExceptionHandler的类@Component@OverrideString msg = "未知异常";msg = "请求被限流了";msg = "请求被热点参数限流";msg = "请求被降级了";msg = "没有权限访问";
2025-08-26 16:49:18
901
原创 redis实战-达人探店,好友关注,附近商铺(GEO数据结构),用户签到(BITMAP),UV统计(HyperLogLog))
TableField(exist = false)说明该字段不在表中。
2025-07-15 18:08:14
237
原创 字节跳动平台的智能体搭建
智能体=AI代调教:用来补齐用户不会表达的部分;:用来让智能体有更多能力;:用来让智能体的工作流程更严谨;:用来让我们的智能体知道更多知识(比如公司内部的信息)。
2025-01-04 15:28:53
927
原创 springcloud篇2-feign、gateway
说明:(1)日志级别NONE-没有日志BASIC-记录请求的开始和结束时间HEADERS-记录请求的开始和结束时、请求头和响应头FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体但该方式不推荐,会导致紧耦合。之前的微服务允许任何的访问,不安全,需要添加一个网关(功能包括身份认证和权限校验、服务路由、负载均衡、请求限流)。
2024-12-27 11:38:01
1464
原创 springcloud篇1(微服务技术栈、服务拆分与远程调用、Eureka、Nacos)
另外,为了监控,还有“分布式日志服务”和“系统监控链路追踪”:最后,利用Jenkins技术对微服务进行自动化编译,再利用docker进行打包形成镜像,再基于k8s或者rancher去实现自动化的部署,这一套机制称为持续集成。微服务技术栈包括微服务技术和持续集成。
2024-12-26 10:01:14
2225
原创 Redis实战-优惠券秒杀(Redisson、Redis消息队列)
Redisson是封装好的实现Redis分布式锁的依赖,可以直接使用(意思是前面实现锁的代码其实都不用自己写)。使用方法如下。
2024-12-02 22:36:38
784
原创 redis实战-商户查询缓存
缓存存在数据一致性问题,如数据库里的数据改变,缓存中的数据未及时更新。这需要在代码中解决该问题。对于低一致性需求的数据可以选择“内存淘汰”和“超时剔除”策略,对于高一致性需求的数据可以选择“主动更新”策略,并以“超时剔除”为兜底方案。主动更新策略又可以有以下三种实现方式:企业中使用的最多的是01Cache Aside Pattern。
2024-11-30 13:26:54
884
原创 Java的LinkedList、HashSet与TreeSet
LinkedList是Java集合框架中的一个重要类,它实现了List接口。与ArrayList不同,(1)LinkedList是基于双向链表的数据结构,因此它在进行插入、删除操作时通常比ArrayList更快,但在随机访问元素时可能会比较慢。(2)LinkedList 不是线程安全的。如果需要在多线程环境中使用,可以使用 Collections.synchronizedList 方法来创建一个同步的列表。add(E e): 在链表末尾添加元素。
2024-11-29 19:04:09
1385
原创 redis实战:短信登录(redis替代共享session应用)
以用户登录为例。用户登录时的信息保存在tomcat内存的session中(session都有一个sessionId,用户发送请求时的cookie携带sessionId帮助找到对应的session)。但是,这不适用于集群模式,会存在session共享问题。:多台tomcat并不共享session存储空间,当请求切换到不同tomcat服务器时会导致数据丢失的问题。需要找到一个替代session的东西,session的替代方案应该满足:(1)数据共享;(2)内存存储;(3)key、value结构。
2024-11-29 10:55:24
621
原创 Redis(配置文件属性解析)
tcp-backlog是一个TCP连接的队列,主要用于解决高并发场景下客户端慢连接问题。配置文件中的“511”就是队列的长度,对联与TCP的三次握手有关,不同的linux内核,backlog队列中存放的元素(客户端连接)类型是不同的。linux内核2.2版本之前:队列中存放的是已完成第一次握手的所有客户端连接。linux内核2.2版本之后:TCP系统中维护了两个队列。一个存放未完成三次握手的队列,一个存放已完成三次握手的队列。
2024-11-28 18:08:39
1571
原创 Redis(概念、IO模型、多路选择算法、安装和启停)
关系型数据库是典型的行存储数据库,存在的问题是,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。Redis在生产中使用的最多的是用作数据缓存。服务器先在缓存中查询数据,查到则返回,查不到则到DB中查找。
2024-11-27 21:36:21
1194
原创 Docker与Kubernetes
Docker是一个用于构建运行传送应用程序的平台,即把一个个运用程序打包成集装箱并传输到任何需要的地方。有了Docker,就可以把运用程序与它运行时需要的各种依赖包和第三方软件库、应用程序与环境变量、配置文件和启动命令打包在一起,以便在任何环境种都可以正确的运行。
2024-11-05 18:29:20
2128
1
原创 Go语言基础语法
因此,这里的索引是指字节在字符串中的位置,而不是字符在字符串中的位置(对于多字节字符,后者可能更有用,但 Go 的 range 在字符串上不提供这种索引)。在 Go 语言中,chan 关键字用于创建通道(channel),通道是一种用于在 goroutine 之间进行通信的类型化管道。关闭通道后,无法再向通道发送数据,但可以继续从通道接收数据,直到通道为空。在上面的例子中,index 是元素的索引,而 value 是对应索引的元素值。在这个例子中,key 是映射的键,而 value 是与键关联的值。
2024-11-03 14:30:09
1284
原创 微服务架构(Dubbo+Zookeeper)
而且,对于服务提供方和服务消费者来说,还有可能兼具这两种角色,即需要提供服务,又需要消费服务,通过统一管理起来,可以有效地优化内部应用对服务发布/使用的流程的管理,服务注册中心可以通过特定协议来完成服务对外的统一。RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。对于服务消费方,最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
2024-04-17 17:07:26
1754
原创 java的volatile
并且当一个线程读取一个volatile变量时,它会从主内存中读取,而不是从自己的工作内存中读取(当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。在Java中,线程之间对内存写入操作的可见性是一个重要的问题,因为每个线程都有自己的工作内存,并且线程之间共享主内存。此外,synchronized还确保了内存可见性,即当一个线程释放锁时,它会将修改后的共享变量的值刷新到主内存中,使得其他线程在获取锁并读取共享变量时,能够看到最新的值。但是,volatile并。
2024-04-16 16:50:54
579
原创 java的时间日期类(Date类、DateFormat类、SimpleDateFormat、Calendar类)
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat,这个类需要一个模式(格式)来指定格式化或解析的标准。答案是使用Calendar类。java.text.DateFormat是日期/时间格式化子类的抽象类,可以通过这个类来完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。(4)public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
2023-12-06 18:33:22
284
原创 java中的可变长度参数Object ...
使用可变参数可以方便地处理不确定数量的参数,而不需要事先定义参数的个数。在方法调用时,可以传递任意数量的参数,甚至可以不传递参数。在main方法中,我们分别调用了printValues方法三次。第一次传递了三个参数,第二次传递了两个参数,第三次没有传递任何参数。在上面的示例中,printValues方法接受任意数量的Object类型参数。在方法体中,使用for-each循环遍历参数数组并打印每个值。形参表示可变参数,也称为varargs。它允许方法接受任意数量的参数,并将它们作为一个数组传递给方法。
2023-11-20 17:56:44
1
原创 vue一些知识补充(标签的ref属性、computed和watch的区别、vuex、css中的transform属性、Javascript的setInterval())
vuex是一个专门为vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态。scale(x,y):定义2D缩放,x表示水平缩放的倍数,y表示垂直缩放的倍数 ,y是一个可选参数,如果没有设置y值,则表示x,y两个方向上的缩放倍数是一样的,并以x为准。
2023-09-26 17:24:57
487
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅