自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redisson的红锁,分段锁,公平锁,联锁。。。。。。

这样的话,就需要10把锁来控制所有请求的并发,由原来的因为只有一把锁而导致的每个时刻只能处理一个请求,变为了现在有了10把锁,每个时刻可以同时处理10个请求,并发提高10倍。当有多个线程同时申请锁时,这些线程会进入到一个FIFO队列,只有队列首元素才能获取到锁,其他元素等待,只有当锁被释放后,才会再将锁分配给当前队列元素。:一个共享资源,在没有写锁的情况下,允许同时添加多个读锁,只要添加了写锁,任何读锁和写锁都不能再次添加,即读锁是共享锁,写锁为排他锁(和zookeeper的读写锁一致)

2025-04-13 22:56:05 546

原创 redis分布式锁

当有多个线程要访问某一共享资源(DBMS中的数据或Redis中的数据,或共享文件等)时,为了达到协调多个线程的同步访问,此时就需要使用分布式锁。为了达到同步访问的目的,规定让这些线程在访问共享资源之前先要获取到一个令牌token,只有具有令牌的线程才可访问共享资源,这个令牌就是通过各种技术实现的分布式锁,而这个分布式锁是一种“互斥资源”,即只有一个,只要有线程抢到了锁,那么其他线程只能等待,直到锁被释放或等待超时。功能,所以Redisson会为该锁生成一个计数器,记录线程重入锁的次数。

2025-04-13 21:20:33 136

原创 zk(Zookeeper)实现分布式锁

如果用上述的上锁方式,只要有节点发生变化,则会触发其他节点的监听事件,这样的话zk的压力非常大 ----------可以调整成。阻塞等待,zk的watch机制会当最小节点发生变化时通知当前节点,于是再执行第二步的流程。1, 创建一个临时序号节点,节点的数据时write,表示的是写锁。创建一个临时序号节点,节点的数据是read,表示的是读锁。读锁:大家都可以读,要想上读锁的前提:之前的锁没有写锁。不过不是,说明前面还有锁,则上锁失败,如果不是读锁的话,则上锁失败,2, 获取zk中所有的子节点。

2025-04-13 12:06:27 276

原创 Zookeeper的NIO与BIO的应用

2,客户端开启watch时,也使用NIO,等待Zookeeper服务器的回调。1,用于被客户端连接的2181端口,使用的是NIO模式与客户端建立连接。1,集群的选举时,多个节点之间的投票通信端口,使用BIO进行通信。

2025-04-12 18:44:14 78

原创 一个项目的架构演进

1,公共部分要部署多份,对公共部分的修改,部署,更新都需要重复的操作(例:用户管理模块每个服务都需要有相应的业务代码,而且对应增删改查后各模块都需要同步更新),带来比较大的成本,为了解决这一问题,接下来就进入分布式应用架构阶段。在这个阶段里,将服务内部公用的模块抽取出来,部署成独立的服务,那么需要解决服务之间高效的通信问题。3,服务治理:服务权重,负载均衡,服务熔断,限流等等一些服务治理方面的问题。1,服务的注册和发现:这么多服务如何注册,这么多服务如何被发现。1,服务越来越多,服务如何被发现。

2025-04-12 16:47:48 300

原创 线程池的主要种类及特点

线程池是Java并发编程中的核心组件,Java通过Executors类提供了几种常用的线程池实现,每种线程池适用于不同的场景。线程数量几乎无限制(最大为Integer.MAX_VALUE)使用无界工作队列(LinkedBlockingQueue)核心线程数固定,但非核心线程数无限制(闲置时立即回收)CPU密集型任务(线程数通常设置为CPU核心数+1)使用延迟工作队列(DelayedWorkQueue)不需要并发但需要异步执行的场景。需要限制并发线程数量的场景。需要任务顺序执行的场景。线程数随负载自动增减。

2025-04-10 00:07:57 410

原创 为什么要打破双亲委派,怎么打破?

数据库JDBC Driver,Tomcat打破了双亲委派机制。

2025-04-09 23:45:54 71

原创 Redisson的RedLock与联锁(MultiLock)的区别

Redisson提供了两种分布式锁机制:RedLock(红锁)和MultiLock(联锁),它们在实现分布式锁时有重要区别。如果您的系统对分布式锁的可靠性要求极高,且有多个独立的Redis主节点,选择RedLock。只有在大多数节点(N/2+1)上获取锁成功,并且总耗时小于锁的有效时间,才认为获取成功。如果您只需要在Redis集群环境下锁定多个相关资源,选择MultiLock。在大多数业务场景中,MultiLock已经足够使用。性能开销较大(需要与多个节点通信)适用于需要同时锁定多个资源的场景。

2025-04-09 23:09:47 442

原创 Redis与Mysql双写一致性如何保证?

之所以将最终一致性单独提出来,是因为他是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致性,但会尽可能地保证到某个级别(比如毫秒级别)后,数据能够达到一致状态。这种一致性级别是最符合用户直觉的,他要求系统写入什么,读出来的也会是什么,用户体验好,但是实现起来往往对系统的性能影响大。所谓的一致性就是数据的一致性,在分布式系统中,可以理解为多个节点中数据的值是一致的。

2025-04-09 22:46:00 429

原创 JVM组成

JVM与硬件无关,JVM运行在操作系统之上。类加载器+(堆+虚拟机栈+方法区+程序计数器+本地方法栈)+执行引擎+本地库接口(其他语言写好的接口)jvm调优调的是(堆(主要是堆)+方法区)类加载器(虚拟机自带类加载器,启动类加载器,扩展类加载器,用户自定义类加载器,应用程序类加载器)(把字节码文件加载到运行时数据区)双亲委派机制(防止恶意代码对源代码的修改,有问题往上走到bootstrap查找自带的源代码)沙箱安全机制()...

2025-04-05 13:16:10 167 1

原创 强引用,弱引用,软引用,虚引用,自旋锁,读写锁

强引用:强引用GC不会回收软引用:内存够的话不回收,内存不够的话回收弱引用:不管内存够不够,只要有GC就回收虚引用:点get是null,但是GC后他会把引用放到引用队列里边自旋锁:是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。public class SpinLockDemo { //原子引用线程 AtomicReference<Thread> atomicReference=new At

2025-04-05 13:15:18 353

原创 mvcc的解释说明

mvcc多版本并发控制,主要是为了提高数据库的并发性能,提高数据库的读写性能,让数据库读写的时候不用去加锁。mvcc主要是处理读请求的,这个读是指快照读而不是当前读,快照读是指普通的select读,当前读其实是一种悲观锁,需要去加锁,加锁的方式是当前读,比如说update的时候会加锁,mvcc保证数据库读写的时候不会有锁竞争,也就是读写的时候不加锁 , trx_id事务ID(自增) roll_pointer回滚指针(回滚到上一个版本用的)。ReadView快照,其作用是让你知道你选择版本链的哪条记录

2025-04-05 13:14:56 164

原创 AQS细节

使用Object中的wait()方法让线程等待,使用Object的notify()方法唤醒线程使用JUC的Condition的await()方法让线程等待,使用signal()方法唤醒线程LockSupport类可以阻塞(park)当前线程以及唤醒(unpark)指定被阻塞线程synchronized,wait,notify(wait,notify必须要在synchronized内部执行,先wait后notify)lock,await,signal()LockSupport是一个线程阻塞工具类,所

2025-04-05 13:13:12 190

原创 java面试

核心是:使用aop中的环绕通知+切面表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类,方法,注解等),获取这些参数,保存到数据库。一个节点可以存多个索引,一个节点下有多个分支,非叶子节点存索引,叶子节点存索引和数据(叶子节点通过双向链表连接数据,避免范围查询的回旋查找)通过业务的唯一表示,发消息前先通过唯一标识去数据库查询,如果没有,说明消息消费了,如果有说明消息没消费。线程私有的,每一个线程一份,内部保存的字节码行号,用于记录正在执行字节码指令的地址。

2025-04-05 13:12:32 808

原创 JVM常见面试题

1,引用计数法:一个对象被引用了一次,在当前的对象头上递增一次引用计数,如果这个对象的引用次数为0,代表这个对象可回收(会有循环引用问题,会引发内存泄漏)2,标记整理算法:对存活的对象进行整理,向一端移动,清理死亡的对象,减少了内存碎片,很多老年代的垃圾回收器会使用标记整理算法。2,当Eden区内存不足的时候,标记Eden区和from区存活的对象,将存活的对象采用复制算法复制到to中清除垃圾。3,经过一段时间Eden区内存不足,标记Eden区和to区存活的对象,将其复制到from区,清除垃圾。

2025-03-30 21:40:31 226

原创 mq专题(Rocketmq)

1。

2024-09-24 16:55:09 115

原创 面试总结(2024-9-22)

java面试

2024-09-22 23:57:06 621

原创 自定义缓存注解

【代码】自定义缓存注解。

2024-07-10 11:06:57 100

原创 Redis+Lua脚本+AOP+反射+自定义注解实现限流注解

Lua脚本(rateLimiter.lua)

2024-07-09 18:33:33 205

原创 Java面经

的vVS的VS VS的VS VS的

2023-02-20 23:06:48 9

原创 mysql主从复制配置

主机[mysqld]## 设置server_id,同一局域网中需要唯一server_id=101 ## 指定不需要同步的数据库名称binlog-ignore-db=mysql ## 开启二进制日志功能log-bin=mall-mysql-bin ## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed ## 二进制日志过期清理时间。默认值为0

2022-02-12 14:56:21 8

原创 Spring Cloud Alibaba操作手册

创建父工程Spring Cloud Alibaba 的环境在父工程中创建,微服务的各个组件作为子工程,继承父工程的环境。Spring Boot —》Spring Cloud —》Spring Cloud Alibabapom.xml 中添加。<dependencyManagement> <dependencies> <!-- Spring Cloud Hoxton --> <dependency>

2021-12-30 15:51:46 15

原创 redis(周阳老师)

NOSQL非关系型数据库(CAP:强一致性,高可用性,分区容错性)mysql(关系型数据库)(acid:原子性,一致性,隔离性,持久性)mysql索引(底层是 B+Tree)mysql存储引擎(INNODB,MYISAM)mysql(行锁,表锁)mysql(主存复制,读写分离)NOSQL:mongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。是一个基于分布式文件存储的数据库。CAP三进二(C强一致性,A高可用性,P分区容错性(分布式

2021-10-19 17:23:23 7

原创 mysql高级周阳

sql的执行顺序:select…from…where…group by…order by…fromwheregroup byselectorder by分组函数sum() min() max() count() avg()没有分组的话默认同一张表为一组

2021-10-18 22:17:53 6

原创 mybatis的多表关联查询的xml的配置

一对多<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.kl.repository.StudentRepository"><!-- <select id="ge

2021-10-13 23:09:16 5

原创 java代码执行顺序

静态代码块,代码块,构造器,普通方法。类加载器+运行时数据区(栈(虚拟机栈),堆,方法区)+执行引擎+本地库接口方法区(类信息+静态区+常量区)堆里放new的对象本地方法栈:jdk内部方法的调用接口可以继承接口并且可以继承多个接口类单一继承类RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); Object attribute1 = requestAttrib

2021-10-12 22:22:11 6

原创 springboot中使用拦截器拦截请求

@Component@WebFilter(urlPatterns = {"/index.html","/account/redirect/index","/order.html","/account/redirect/order"},filterName = "userFilter")public class UserFilter implements Filter { @Override public void init(FilterConfig filterConfig) thro

2021-10-09 19:30:30 4

原创 mybatis关联查询

<resultMap id="menuMap" type="Menu"> <id property="id" column="mid"/> <result property="name" column="mname"/> <result property="author" column="author"/> <result property="price" column="price"/> <result property

2021-10-08 12:56:47 5

原创 过滤器的使用

解决跨域问题@Configurationpublic class CrosConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/*") .allowedOrigins("*") .allowCredentials(tru

2021-10-02 19:48:17 10 1

原创 拦截器的使用

@Componentpublic class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user = (User)request.getSession().

2021-10-02 19:45:11 2

原创 java线程池

线程池的优点:1,提高线程的利用率2,提高程序的响应速度3,便于统一管理线程对象4,可以控制最大并发数public class Test { public static void main(String[] args) { ExecutorService executorService = new ThreadPoolExecutor(3, 5, 1l, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),

2021-08-19 19:17:13 4

原创 SSM整合

SSM框架整合详解 (哔哩哔哩搜索: 楠哥教你学java)ssm(Spring+SpringMvc+Mybatis)Spring MVC负责实现MVC设计模式,Mybatis负责数据持久层,Spring负责管理Spring MVC和Mybatis相关对象的创建和依赖注入。1,创建Maven工程<dependencies> <!-- SpringMVC --> <dependency> <groupI

2021-07-08 12:06:38 130 1

原创 TCP/IP

《TCP/IP协议族》一书的面试知识概念总结!!!HTTP(超文本传输协议)(端口号为80):信息是明文传输,不安全。HTTPS是安全的,SSL加密传输协议(端口号为443)。域名系统(DNS):DNS的作用就是把应用层的主机名映射为网络层的IP地址。UDP(用户数据报协议)是一种无连接,不可靠的运输协议。TCP(传输控制协议)是一种面向连接的可靠的运输协议。TCP/IP协议族的五层模型:应用层(第五层)运输层(第四层)网络层(第三层)数据链路层(第二层)物理层(第一层)HTTP请求

2021-06-09 17:36:26 122 2

原创 运行时数据区

运行时数据区组成1,程序计数器2,Java虚拟机栈3,本地方法栈4,Java堆5,方法区1,程序计数器程序计数器是一块较小的内存空间,字节码解析器的工作就是通过这个计数器的值来选取下一条需要执行的字节码指令。2,java虚拟机栈java虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个线帧存储方法的信息,每个方法在执行到执行结束,都对应着一个线帧在虚拟机栈中入栈出栈的过程。3,本地方法栈本地方法栈的作用与java虚拟机栈的作用是一样的,只不过虚拟机栈是服务ja

2021-05-24 16:38:29 92

原创 二叉树,二叉查找树,平衡二叉树,红黑树,B树,B+树 的数据结构

二叉树单说二叉树的话顾名思义二叉嘛,根节点开始分俩个枝,而每个枝上也会有节点,每个节点最多只能有两个,左右分支数字任意。二叉排序树(二叉查找树,二叉搜索树):二叉排序树的话对上边的数是有要求的(二叉排序树也是一颗二叉树),根节点开始根节点左边的分支上的所有数都小于根节点的数,根节点右边的分支上的所有数都大于根节点上的数,这就是一颗二叉排序树。平衡二叉树(AVL树)平衡二叉树满足二叉排序树的所有条件,但也有其自己的条件如下:1,任意节点的子树的高度差都小于等于1。红黑树红黑树是满足如下

2021-05-24 15:47:48 173 1

原创 水仙花数

水仙花数水仙花数就是指一个三位数,个位,十位,百位数上的数字的三次方的和等于这个三位数。比如153,个位3,十位5 ,百位 1, 3的三次方加上5的三次方加上1的三次方和为153,所以这就是水仙花数,水仙花数仅限于三位数(100----999)所以接下来我们就撸代码:public class Test01 { public static void main(String[] args) { t(153); } public static

2021-05-22 17:50:40 793

原创 try{}finally{}的执行顺序

try{}finally{}花括号里有return的代码的执行顺序:try中有return,finally中也有returnpublic class Test02 { public static void main(String[] args) { int y=sexy(); System.out.println(y); } public static int sexy(){ int x; try{

2021-05-22 16:44:07 420

原创 JVM的组成

精讲JVM的组成一,JVM整体组成可分为四个部分类加载器运行时数据区执行引擎本地库接口各个组成部分的用途:程序在执行之前先要把java代码转换成字节码文件(class文件),JVM首先通过类加载器把字节码文件加载到运行时数据区,(字节码是JVM的一套指令集规范),字节码不能直接交给底层操作系统去执行,因此需要指令解析器执行引擎将字节码解析为底层系统能够识别的指令(底层系统指令)再交由cpu去执行,而这个过程需要其他语言的接口本地库接口来实现整个程序的功能。...

2021-05-22 16:00:16 26 3

空空如也

空空如也

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

TA关注的人

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