程序员
文章平均质量分 89
加班不秃顶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
认真聊聊并发编程的10个坑!
对于从事后端开发的同学来说,并发编程肯定再熟悉不过了。说实话,在java中并发编程是一大难点,至少我是这么认为的。不光理解起来比较费劲,使用起来更容易踩坑。不信,让继续往下面看。今天重点跟大家一起聊聊并发编程的10个坑,希望对你有帮助。原创 2025-11-19 21:42:29 · 526 阅读 · 0 评论 -
京东一面:MySQL 主备延迟有哪些坑?主备切换策略
高可用性(high availability,缩写 HA),指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用性通常通过提高系统的容错能力来实现。MySQL 的高可用是如何实现的呢?首先,我们来看张图过程:开始时,处理流程主要是场景一客户端读、写,访问的是主库主库通过某种机制,将数据实时同步给备库当主库突然发生故障(如:磁盘损坏等),无法正常响应客户端的请求。此时会自动主备切换,进入场景二客户端读写,访问的是备库(此时备库升级为新主库)看似天衣无缝,那是不是可以高枕无忧了呢???原创 2025-11-19 21:41:12 · 773 阅读 · 0 评论 -
深入浅出Nacos!
Nacos 是阿里巴巴开源的一款优秀的中间件,在分布式微服务场景下用的非常多。英文全称,其中 Na 是 naming 的缩写,注册中心;co为 configuration 的缩写, 配置中心;不管是配置中心还是注册中心本质都是围着。Nacos 分为服务端和客户端,这一点不要含糊。Nacos Server 使用 Java 语言编写,提供了服务注册发现和服务配置功能;对外提供了 SDK 接入以及HTTP RESTful 开放接口,SDK 接入和 RESTful 接口的功能是一致的。原创 2025-11-19 21:39:38 · 566 阅读 · 0 评论 -
面试高频:一致性hash算法!
简单的阐述了下一致性hash,如果有不对的地方大家可以留言指正,任何技术都不会十全十美,一致性Hash算法也是有一些潜在隐患的,如果Hash环上的节点数量非常庞大或者更新频繁时,检索性能会比较低下,而且整个分布式缓存需要一个路由服务来做负载均衡,一旦路由服务挂了,整个缓存也就不可用了,还要考虑做高可用。不过话说回来,只要是能解决问题的都是好技术,有点副作用还是可以忍受的。原创 2025-11-19 21:37:00 · 862 阅读 · 0 评论 -
几行代码搞定RPC服务注册和发现!
在日常的工作或者学习编码过程中,我们一定要习惯面向接口编程,这样做有助于增强代码可扩展性。服务注册register/*** 注册服务信息* @param serviceInfo 待注册的服务* @throws Exception 异常*/服务向注册中心注册,注册的内容定义一个类来封装。/*** 服务名称*//*** ip 地址*//*** 端口号*//*** class 对象*/> clazz;/*** bean 对象*/原创 2025-11-18 22:09:35 · 667 阅读 · 0 评论 -
高并发场景:红包雨背后的设计与实现!
我们通常称 Redis 为内存数据库 , 不同于传统的关系数据库,为了提供了更高的性能,更快的写入速度,在设计和实现层面做了一些平衡,并不能完全支持事务的 ACID。Redis 的事务具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。原创 2025-11-18 21:49:42 · 397 阅读 · 0 评论 -
一次线上事故,我顿悟了异步的精髓!
学习需要一层一层递进的思考。第一层:什么场景下需要异步大量写操作占用了过多的资源,影响了系统的正常运行;写操作异步后,不影响主流程,允许适当延迟;第二层:异步的外功心法本文提到了四种异步方式:线程池模式本地内存 + 定时任务MQ 模式Agent 服务 + MQ 模式它们的共同特点是:将写操作命令存储在一个池子后,立刻响应给前端,减少写动作的耗时。任务服务异步从池子里获取任务后执行。第三层:异步的本质在笔者看来,异步是更细粒度的使用系统资源的一种方式。原创 2025-11-18 21:48:22 · 232 阅读 · 0 评论 -
服务端注册,开始进入深水区了!
在日常的工作或者学习编码过程中,我们一定要习惯面向接口编程,这样做有助于增强代码可扩展性。服务注册register/*** 注册服务信息* @param serviceInterfaceInfo 待注册的服务(接口)信息* @throws Exception 异常*/服务向注册中心注册,注册的内容定义一个类来封装。@Data/*** 服务名(接口全限定名)*//*** 实例 id,每个服务实例不一样*//*** 服务实例 ip 地址,每个实例不一样*//**原创 2025-11-18 21:47:20 · 345 阅读 · 0 评论 -
面试官问:“在项目中用过多线程吗?”你就把这个案例讲给他听!
要说线程,必先说进程。进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。原创 2025-07-04 13:19:32 · 617 阅读 · 0 评论 -
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
首先看看幂等性的概念:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。比如下面这些情况,如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱;订单接口,同一个订单可能会多次创建。原创 2025-07-04 12:55:34 · 605 阅读 · 0 评论 -
Java Review (二十八、集合----- Queue 集合)
之所以说它是比较标准的队列实现 , 而不是绝对标准的队列实现 , 是因为 PriorityQueue 保存队列元的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。Deque 接口提供了 一个典型的实现类: ArrayDeque ,从该名称就可以看出 , 它是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数 , 该参数用于指定 Object[]数组的长度 :如果不指定 numElements 参数, Deque 底层数组的长度为 16。原创 2025-07-03 21:43:01 · 965 阅读 · 0 评论 -
Java Review (二十七、集合----- List 集合)
执行①行代码时 ,程序试图删除一个 A 对象 , List 将会调用该A对象的equals()方法依次与集合元素进行比较,如果该 equalsO方法 以某个集合元素作为参数时返回 true , List将会删除该元素——A 类重写了 equalsO方法 , 该方法总是返回 true。ArrayList 和 Vector 在用法上几乎完全相同 ,Vector十分古老,那时候 Java 还没有提供系统的集合框架,所以 Vector 里提供了 一 些方法名很长的方法。,无须程序保证该集合的同步性。原创 2025-07-03 21:41:32 · 591 阅读 · 0 评论 -
Java Review (八、面向对象----成员变量和局部变量)
从图一中可以看出,当Person 类初始化完成后,系统将在堆内存中为Person类分配一块内存区(当 Person类初始化完成后,系统会为 Person类创建一个类对象),在这块内存区里包含了保存eyeNum类变量的内存,并设 置eyeNum的默认初始值:0。类变量的作用域比实例变量的作用域更大:实例变量随实例的 存在而存在,而类变量则随类的存在而存在。也就是说如果通过一个实例修改了类变量的值,由于这个类变并不属于它,而是属于它对应的类,因此,修改的依然是类的类变量,与通过该类来修改类变量的结果完全相同。原创 2025-06-28 12:00:00 · 798 阅读 · 0 评论 -
Java Review (七、面向对象----方法深入)
方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分, 但从功能上来看,方法完 全类似于传统结构化程序设计里的函数 值得指出的是, Java里的方法不能独立存在 ,所有的方法都必须定义在类里 ,方法在逻辑上要么属于类,要么属于对象。前面己经介绍了 Java 里的方法是不能独立存在的,调用方法也必须使用类或对象作为主调者果声明方法时包含了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时实际传给形参的参数值也被称为实参。swap()方法里的a和b只是main()方法里变量a和b的复制品。原创 2025-06-28 11:00:00 · 1791 阅读 · 0 评论 -
Java Review (五、数组)
在上面的语法格式中,前面的type就是数组元素的数据类型,此处的type必须与定义数组变量时 所使用的type相同,也可以是定义数组时所指定的type的子类,并使用花括号把所有的数组元素括起 来,多个数组元素之间以英文逗号(,)隔开,定义初始化值的花括号紧跟[]之后。Java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存。对于基本类型数组而言,数组元素的值直接存储在对应的数组元素中,因此,初始化数组时,先为 该数组分配内存空间,然后直接将数组元素的值存入对应数组元素中。原创 2025-06-28 09:00:00 · 544 阅读 · 0 评论 -
Java Review (四、流程控制)
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。如果main方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代 码先执行,排在后面的代码后执行。当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直 执行下去,形成死循环。当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。原创 2025-06-28 08:00:00 · 842 阅读 · 0 评论 -
Java Review (二、Java基本数据类型)
类型限制了一个变量能被赋的值,限制了一个表达式可以产生的值,限制了在这 些值上可以进行的操作,并确定了这些操作的含义。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段。至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。Java所有的数值型变量可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型 的变量,则这种方式被称为自动类型转换。原创 2025-06-27 20:24:22 · 751 阅读 · 0 评论 -
设计模式—— 十七:装饰器模式
● 使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接 的方式有所不同,而不是它们的类或者属性值有所不同,大量小对象的产生势必会占用更多 的系统资源,在一定程序上影响程序的性能。每 一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。有一个咖啡店,销售各种各样的咖啡,拿铁,卡布奇洛,蓝山咖啡等,在冲泡前,会询问顾客是否要加糖,加奶,加薄荷等。设计出一个抽象装饰类,它也继承自coffee,具体的装饰类,继承抽象装饰类。原创 2025-06-27 17:30:58 · 832 阅读 · 0 评论 -
设计模式—— 十六 :责任链模式
二是对请求做出回应。对女儿提出的请示,应该在父亲类中做出决定,父亲有责任、有义务处理女儿的请示, 因此Father类应该是知道女儿的请求自己处理,而不是在Client类中进行组装出来,也就是说原本应该是父亲这个类做的事情抛给了其他类进行处理。在实际应用中,一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模 块的调用,减少模块间的耦合,提高系统的灵活性。OK,业务已经实现了,但是明显这个业务实现是存在问题的。原创 2025-06-27 17:30:25 · 703 阅读 · 0 评论 -
设计模式—— 十五 :命令模式
命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。甲方对乙方做一些要求的时候,要找到对应的组,但是不能希望甲方是非常专业的,可能提需求提到了开发组头上,要求页面变更提到了需求组头上。命令模式的核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送 者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法。场景类中客户找到了需求组,向需求组提出了增加需求和需求变更的要求。原创 2025-06-27 17:29:40 · 614 阅读 · 0 评论 -
设计模式—— 十四 :中介者模式
每个同事类的行为分为两种:一种是同事本身的行为,比如改变对象本身的 状态,处理自己的行为等,这种行为叫做自发行为(Self-Method),与其他的同事类或中介 者没有任何的依赖;迪米特法则认为“每个类只 和朋友类交流”,这个朋友类并非越多越好,朋友类越多,耦合性越大,要想修改一个就得 修改一片,这不是面向对象设计所期望的,况且这还是仅三个模块的情况,属于比较简单的 一个小项目。库房是有容积限制的,不可能无限大,所 以就有了清仓处理,那就要求采购部门停止采购,同时销售部门进行打折销售。原创 2025-06-27 17:29:04 · 863 阅读 · 0 评论 -
设计模式—— 十三 :原型模式
如果原型对象的 成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆 对象的成员变量指向相同的内存地址。原型模式的核心是一个clone方法,通过该方法进行对象的拷贝,Java 提供了一个Cloneable接口来标示这个对象是可拷贝的,Cloneable接口的作用是标记,在JVM中具有这个标记的对象才有可能被拷贝。在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象, 深克隆将原型对象的所有引用对象也复制一份给克隆对象。那么线程安全的问题又来了。原创 2025-06-27 17:27:51 · 601 阅读 · 0 评论 -
设计模式—— 十二 :代理模式
在代理中,调用者只知代理而不用知道真实的角色是谁,屏蔽了真实角色的变更对高层模块的影响,真实的主题角色想怎么修改就怎么修改,对高层次的模块没有任何的影响,只要实现了接口所对应的方法,该模式非常适合对扩展性要求较高的场合。在类图中增加了一个InvocationHandler接口和GamePlayIH类,作用就是产生一个对象的代理对象,其中InvocationHandler是JDK提供的动态代理接口,对被代理类的方法进行代理。强制代理的概念就是要从真实角色查找到代理角色,不允 许直接访问真实角色。原创 2025-06-27 17:27:11 · 581 阅读 · 0 评论 -
设计模式—— 十 一:建造者模式
● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽 象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,完成复杂对象的建造。● 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异 性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的 限制。● 便于控制细节风险 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任 何影响。原创 2025-06-27 17:26:21 · 308 阅读 · 0 评论 -
使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
使用Java Stream操作集合非常便利,但还是容易踩一些坑,比如文中提到的异常和异常,所以使用时要多多注意,能不踩坑就不踩坑,就算踩坑,也别多次踩同一个坑。原创 2025-06-20 17:00:30 · 900 阅读 · 0 评论 -
Redis深入浅出【八】发布与订阅
Redis的事务提供了一种将多个命令打包,然后一次性、有序地执行的机制,它的原理是多个命令会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行,并且事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。原创 2025-06-19 21:37:02 · 1021 阅读 · 0 评论 -
深入浅出Redis【七】发布与订阅
SUBSCRIBEPSUBSCRIBE这7个命令的核心都是基于存储在服务器状态的字典和链表实现的。原创 2025-06-19 21:36:00 · 1035 阅读 · 0 评论 -
深入浅出Redis【六】设置/移除键的过期时间
是Time To Live的缩写,用来查看某个key的剩余生存时间,单位为秒。类似,也是用来查看某个key的剩余生存时间,但单位为毫秒。类似,也是用来给指定的key设置过期时间,但单位为毫秒。命令用来给指定的key设置过期时间,但指定的是某个时间点。如果key不存在或者key没有设置过期时间,返回0。类似,用来给指定的key设置过期时间,但指定的是点。命令用来给指定的key设置过期时间,单位为秒。如果key没有设置过期时间,返回-1。如果key没有设置过期时间,返回-1。命令用来移除指定key的过期时间。原创 2025-06-19 21:34:29 · 416 阅读 · 0 评论 -
深入浅出Redis【五】Redis的过期键删除策略?
对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢?原创 2025-06-18 21:12:04 · 1019 阅读 · 0 评论 -
深入浅出Redis【四】Redis的复制机制(主从复制)
还有个原因就是,虽然Redis的性能很好,但单台毕竟还是有瓶颈的,使用主从复制可以实现读写分离,提高Redis的高可用性,即主服务器用来执行写命令,多个从服务器用来执行读命令,类似于数据库的读写分离。,当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。举个具体的例子,从服务器B一直在复制着主服务器A,刚开始都是正常的,主服务器A执行的写命令也都通过命令。原创 2025-06-18 21:11:02 · 931 阅读 · 0 评论 -
深入浅出Redis【三】Redis的持久化机制(RDB、AOF)
为了解决AO文件体积越来越大的问题,Redis提供了AOF文件重写功能,即Redis服务器会创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库数据相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小很多。由上述实现方式可知,RDB持久化记录的是结果,AOF持久化记录的是过程,所以AOF持久化生成的AOF文件会有体积越来越大的问题,Redis提供了AOF重写功能来减小AOF文件体积。原创 2025-06-18 21:09:58 · 849 阅读 · 0 评论 -
深入浅出Redis【二】Redis的5种数据结构及其常用命令
注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种。原创 2025-06-18 21:08:39 · 1038 阅读 · 0 评论 -
深入浅出Redis【一】Redis简介及环境安装
什么是Redis呢?Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。它支持诸如字符串、散列、列表、集合、有序集合等数据结构。--Redis官网Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的高性能的key-value数据库。-- 百度百科Redis是一款依据BSD开源协议发行的高性能key-value存储系统,通常被称为数据结构服务器。-- 其它网友。原创 2025-06-18 21:07:41 · 1021 阅读 · 0 评论 -
为什么不推荐用JWT保护你的Web应用?
Web 应用中使用 JWT 是让应用变得更复杂了。在 web 应用中,绝大多数情况下,传统的 cookie-session 机制工作得更好。jwt 适合做简单的 restful api 认证,颁发一个固定有效期的 jwt,降低 jwt 暴露的风险,不要对 jwt 做服务端的状态管理,这样才能体现出 jwt 无状态的优势。作者:miffy_fei链接:https://juejin.cn/post/6844903870347345927来源:稀土掘金著作权归作者所有。原创 2025-06-17 20:37:50 · 910 阅读 · 0 评论 -
面试官:聊一下你对MySQL索引实现原理?
在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响。所以,我们要追求两者的一个平衡点,足够多的索引带来查询性能提高,又不因为索引过多导致修改数据等操作时负载过高。InnoDB支持3种常见索引,我们接下来要详细讲解的就是 B+ 树索引,哈希索引,全文索引。原创 2025-06-17 20:35:23 · 799 阅读 · 0 评论 -
面试官:你了解CAS吗?有什么问题吗?如何解决?
CAS全称,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。内部的AQS和原子类内部都使用了CAS。需要读写的内存值V。进行比较的值A。要写入的新值B。只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。在Java中,CAS操作主要通过java.util.concurrent.atomic包中的类来实现。例如,AtomicInteger、AtomicBoolean、AtomicReference等。原创 2025-06-17 20:31:46 · 838 阅读 · 0 评论 -
Java面试官:Synchronized是怎么实现的?
可重入锁是一种特殊的互斥锁,它允许同一个线程在持有锁的情况下再次获取该锁。也就是说,同一个线程可以多次获取同一个可重入锁,而不会发生死锁。在 Java 中,synchronized关键字就是一种可重入锁。当一个线程使用synchronized修饰的方法或代码块时,它会获得该对象的锁。如果该线程在持有锁的情况下再次调用同一个对象的synchronized方法或代码块,那么它会再次获得该对象的锁,而不会等待其他线程释放锁。可重入锁的好处是可以避免死锁的发生。原创 2025-06-17 20:26:58 · 1028 阅读 · 0 评论 -
【Spring Boot】Spring Boot Debug调试?
在使用spring-boot:run进行启动的时候,如果设置的断点进不去,要进行以下的设置。原创 2025-06-16 20:53:11 · 250 阅读 · 0 评论 -
【Spring Boot】Spring Boot 集成 Mybatis 实现双数据源?
这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源实现数据库的读写分离。原创 2025-06-16 20:46:21 · 307 阅读 · 0 评论 -
【Redis】一文聊清楚Redis主从复制原理
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点,而对于redis来说,一主两从是比较常见的搭配。主节点(Master)同时对外提供读和写操作从节点(Slave)通过replicate同步的方式,从主节点复制数据,保持自身数据与主节点一致从节点只能对外提供读操作当然,对于读多写少类的操作,为了提升整体读请求的处理能力,可以采用一主多从的方式。原创 2025-06-12 21:03:56 · 970 阅读 · 0 评论
分享