- 博客(262)
- 收藏
- 关注
原创 【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中
某天,接到DBA通知,Redis sentinel 只支持到3.2.X,各组要将工程中的Redis sentinel引用改为Redis cluster... 有的工程引用了两种模式,有的只引入了Redis sentinel ,还和其他组有共同使用的key ,怎么办呢?? ... 结尾有彩蛋
2024-03-13 22:45:33 1080
原创 JVM和JVM内存管理
以上是从内存管理的角度对jvm进行的知识框架梳理,以后在工作中还要多多使用,多多体会。同时,结合已有的工作经验,我更加深刻的认识到,有些时候因为对原理的不了解,研发过程中的一些不经意的"小操作",都可能引起巨大风暴:大量没有被引用的类文件,如果被加载到jvm中,在metaSpaceSize设置的少时,有可能引起OutofMemoryError:Metaspace错误;队列长度设置不当,很有可能导致内存溢出;完善的内存监控系统可以使我们的系统如虎添翼。
2024-03-09 21:48:19 704
原创 数据库事务问题整理-MySQL
对MySQL事务的重新认识,包括事务的概念,事务解决的问题,MySQL innodb存储引擎中为了解决隔离性问题的MVCC机制
2024-02-29 17:07:11 568
原创 分布式一致性软件-zookeeper
在我们进行软件开发过程中,为了实现某个功能可能借助多个软件,如存储数据的数据库软件:MySQL,Redis;消息中间件:rocketMq,kafka等。那么在分布式系统中,如果想实现数据一致性,可以借助哪些软件呢?答:分布式一致性软件。
2024-02-25 20:36:07 1232
原创 Redis-内存管理
Redis是基于内存存储的,非关系型,键值对数据库。因此,对Redis来说,内存空间的管理至关重要。那Redis是如何内存管理的呢?
2024-02-21 13:50:12 529
原创 rocketMq-broker-PullMessageProcessor 的完整生命周期和设计思想
很多文章直接讲了processRequest方法的执行内容,并没有讲清楚PullMessageProcessor的生命周期,以及是如何被通知要进行消息拉取的。在这篇文章中,我们将对其进行梳理,并学习其中的设计思想。
2024-02-20 11:47:34 983
原创 【算法】Java-二叉树的右视图(BFS、DFS两种解法)
这道题的解法有很多,分享这两种解法的原因是在做这道题时,我感受到了自己的一点点质变。方法一,对队列的熟练应用。方法二,深度理解了递归的过程,后面还要继续应用,继续体会。学习算法增加了我看问题的视角,经常感叹“原来可以这样”,“居然还能这样”,“这人想的真好”之类。但我们知道“知道”和“做到”之间,有一条“鸿沟”,用新的“知道”的方法解出题的感觉真是太棒了,我做到了!当然,过程非常不容易,经常有些题目都看不懂,或者别人的思路理解不了。这时候,我们要想想,这道题难度是不是太大了,如果太大,要降低难度;
2024-01-14 19:09:44 1042 3
原创 Java字节码分析快速入门/字节码执行分析(一)
我们知道,计算机直接使用的程序语言语句是机器指令码,又称机器码/代码。但在Java开发过程中,Java源码先被编译成了字节码,然后才解释称机器码运行。这是为什么呢? 字节码是什么呢?
2023-06-28 20:48:31 1294
原创 [Java基础]面向对象
在这篇文章中,我们将学习面向对象的思想,并学习如何使用面向对象思想编程。包括关于对象和类,类之间的关系,引用,对象的创建和使用,构造函数,内存解析等内容。
2023-06-09 17:37:44 778
原创 【Spring源码阅读】IOC容器的依赖注入
从代码中我们看到一个整体的框架,getBean是依赖注入的入口,下面我们将通过createBean方法了解注入的整个实现过程。在这个过程中,会根据BeanDefinition的要求生成Bean对象,同时对Bean初始化。SpringIOC容器的依赖注入发生在用户第一次向IOC容器获取Bean时。除在BeanDefinition中设置lazy-init属性让容器完成bean的预实例化。所以这篇文章,我们将从getBean()方法入手分析SpringIOC容器依赖注入的过程。
2023-03-10 17:46:44 86
原创 Spring源码阅读-IOC容器初始化过程
BeanDefinition 就是POJO对象在IOC容器中的抽象。通过BeanDefinition 这个数据结构,使IOC容器能够方便的对POJO对象也就是Bean进行管理。将BeanDefinition 注册到hashmap中,也就是一个IOC容器中。Spring IOC容器的初始化过程:Resource定位,BeanDefinition载入,向IOC容器注册BeanDefinition。整个过程由refresh()方法触发,三个过程由不同的模块完成,使用户更加灵活的对这三个过程剪裁和扩展。
2023-03-05 23:13:28 241
原创 【设计模式】策略模式在Java工程中应用
策略模式帮助我们把相似的算法抽象,使用上下文管理抽象类的具体实现,每次新增算法时,只需新增具体实现。使我们的代码轻松解耦,符合开闭原则,极大的缩小了影响范围。是成为一名优秀工程师的必修课!
2023-02-26 23:56:38 990 2
原创 Zookeeper-应用-分布式锁以及和Redis实现对比
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。前面我们分享过了使用Redis实现分布式锁。这篇文章中,我们聊一下使用ZooKeeper如何实现分布式锁......
2022-06-17 17:56:37 522
原创 ZooKeeper-集群-ZAB协议与数据同步
在前面两篇文章中,我们认识了什么是ZooKeeper,ZooKeeper有哪些功能,ZooKeeper集群,ZooKeeper集群中的选举机制。那么在ZooKeeper集群中,数据是如何在节点间同步的呢?数据同步过程中又会产生哪些问题又是如何解决的呢?......
2022-06-03 00:16:29 413
原创 Redis-作为缓存可能遇到的问题
Redis作为缓存,不是存进去就万事大吉了,还要根据调用场景,缓存的内容,请求方式,QPS,合理设置过期时间等采取预防措施。
2022-05-28 23:35:37 247 1
原创 【设计模式】策略模式与spring结合
在上一篇《【设计模式】策略模式》中,我们讲解了策略模式的基本概念和用法。策略模式是符合“开闭原则”的典型案例,但在上一篇文章中,我们发现,如果想调用其他的策略,虽然不用修改核心业务代码,但需要修改客户端代码。我们说,将策略的选择放在功能页面,当用户选择时,向后端传入策略,从数据库字典表中获取该策略对应的类的名字,再通过反射,获得对应的策略类。但如果不修改数据库,还有没有别的方法?当然...
2018-09-11 19:32:21 548 1
原创 简述从浏览器发出请求到数据返回的全过程
你知道我们从浏览器发出一条请求到数据返回都经过了哪些过程吗?你知道异地多活部署情况下是如何路由你的请求的妈?你知道如何拦截网络攻击吗?这篇文章有答案
2024-03-16 12:05:53 610
原创 【Spring】SpringMVC请求原理
什么是SpringMVC,MVC? SpringMVC的执行流程是怎样的?dispatcherServlet在SpringMVC中起到了什么作用?dispatcherServlet 和Servlet的关系又是什么?这篇文章会帮你找到答案
2024-03-15 19:08:05 896
转载 【概念】微服务架构
微服务(Microservices)是一种,它将一个大型的、复杂的应用程序分解为一组小型的、互相独立的服务。每个微服务都专注于实现某一特定业务功能,并且可以单独部署、扩展和维护,具备自己的数据库或数据存储能力。这些服务通过轻量级通信机制(如RESTful API、消息队列等)进行交互和协作,以完成整个系统的业务逻辑。
2024-02-25 15:09:47 25
转载 Redis-事务处理
Redis本身作为内存数据库,对事务也有处理。redis事务是指一组命令的有序执行,它允许客户端将多个命令打包在一起作为一个逻辑单元来处理。
2024-02-22 15:48:14 22
原创 rocketMq-Consumer的两种消费模式:push和pull(含源码解读)
在RocketMQ中,虽然从概念上讲Consumer有两种消费模式:Push和Pull,push模式让人感觉由broker将消息主动push到consumer。但在实际实现时,这两种模式都采用了类似长轮询(long polling)的机制,即由Consumer主动向Broker拉取消息。不过,它们的具体行为有所不同,我们主要介绍一下Push模式。
2024-02-04 20:03:15 974
转载 rocketMq和kafka在技术选型上的区别
RocketMQ和Kafka都是高性能、分布式的消息中间件,它们在消息队列领域具有广泛的应用。那么在技术选型上有哪些关键区别呢?
2024-01-30 17:56:00 49
原创 ThreadPoolExecutor 基础
ThreadPoolExecutor 类是Java并发包(java.util.concurrent)中用于创建和管理线程池的核心类,在本文中,我们将介绍一些关于ThreadPoolExecutor 基础内容。
2024-01-25 11:41:13 740
转载 关于java.util.concurrent包
java.util.concurrent 包下的类和接口是为了支持并发编程而设计。这个包提供了丰富的工具和数据结构,旨在简化多线程环境中的编程,并提高程序在并发执行时的性能、可伸缩性和可靠性。
2024-01-24 18:17:21 25
原创 使用CompletableFuture实现并发计算-结合实例
CompletableFuture是Java 8引入的一个强大的并发工具类,它是Future接口的扩展实现。它提供了更丰富的异步编程模型和功能,允许开发者以非阻塞的方式处理异步计算的结果,并且可以将多个异步任务链式组合起来形成复杂的流程。本文将结合代码应用讲解CompletableFuture的主要功能
2024-01-24 14:06:50 838 3
原创 [Java基础]wait(),sleep(),notify(),notifyAll()
在实际的工作当中,经常会用到wait(),sleep(),notify(),notifyAll()等方法,我在这里系统的整理下。
2023-09-15 15:06:17 156
原创 【算法】Java-使用数组模拟单向链表,双向链表
数组实现链表,一个数组用于存放数据,一个数组存放"指针",这里的指针用数组下标代替。如果是双向链表,要用两个数组存放指针。同时要注意首节点和尾结点的记录方法。在实现双链表时,我曾用两个变量表示首尾节点,对比起来,没有用e[0],e[1]表示简洁,而且非常容易搞混。占用第0位和第1位保存链表头和尾时要注意初始的idx=2,第k个插入的元素的索引下标是k+1。大家可以使用更多方法实现,过程虽然曲折,但一顿操作下来,对链表的操作会非常的熟练。
2023-09-11 18:04:32 296
原创 [Java基础]对象转型
在这篇文章中,我们将继续学习Java基础知识:对象转型。对象转型在Java应用中非常广泛,在这篇文章中,我将系统的为大家梳理一下。1、一个基类引用类型的对象可以指向其子类的对象;2、一个基类的引用不能指向其子类新增的属性和方法;3、可以使用 引用类型 instance of 类名的方式来判断该引用类型所指向的对象属于该类还是该类的子类;4、子类对象可以当基类对象使用叫做向上转型(upcasting),基类对象可以当做子类对象使用称为向下转型(downcasting)
2023-08-17 19:22:31 235
原创 【算法练习】4种反转链表的方法(Java实现)
几种链表反转方法的主要区别在于迭代法和递归法是在原链表上直接反转,无需额外空间;而头插法和栈辅助需要 O(N) 的额外空间。一般迭代法代码最简洁,递归法需要处理终止条件,但思路清晰。
2023-08-17 15:01:30 1973
原创 [Java基础]面向对象-关键字分析:this,static,final,super
在前面的文章中,我们讲过Java关键字是电脑提前定义好的,有特殊意义的标识符。Java关键字对编译器有特殊意义,用来表示一种数据类型,或程序的结构。关键字不能用来做为对象,类,方法,包,参数的名称。在这篇文章中,我们将介绍Java类中常用的关键字的使用:this,static,final,super在这篇文章中,我们主要学习了Java的4个关键字:this,static,final,super。
2023-08-08 16:17:54 138
原创 JVM-运行时数据区
Java虚拟机在执行Java程序时,将它管理的内存分为不同的区域。这些区域用途不同,创建和销毁的时间也不同。有的随虚拟机进程启动一直存在,有的依赖用户线程启动和结束而创建和销毁。
2023-08-02 18:26:16 729
转载 【转】ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 的区别及使用
如果你的 app 需要随时响应处理新提交的任务,那 ExecutorService 的这种生命周期的设计就很合适。但是一个 app 总有结束的时刻,当 app 结束时,ExecutorService 却并不会终止,它将导致 JVM 继续存活并运行。说明:它试图终止线程的方法是通过调用 Thread.interrupt() 方法来实现的,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt() 方法是无法中断当前的线程的。
2023-05-26 16:34:55 167
原创 [Java基础]基本概念(下)运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用
在上一篇文章中,我们学习了Java基础基本概念中的标识符,关键字,基本数据类型。这篇文章,我们将学习:运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用。
2023-05-22 11:25:33 396
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人