- 博客(484)
- 资源 (6)
- 收藏
- 关注
原创 架构设计之异地多活与单元化(Set化)
异地多活是指在不同城市建立独立的数据中心,关键点就是异地、多活,活是指这些数据中心在日常的业务中也需要走流量,多活就是多个数据中心,异地是指在不同的城市建立数据中心。和“活”相对应的是冷,冷备数据中心是指备份全量数据,平时不支撑业务需求。
2025-04-26 07:00:00
825
原创 架构设计之推荐系统初识
推荐系统是移动互联网时代非常成功的人工智能技术落地场景之一。本文我们将从架构设计的角度回顾和讨论推荐系统的一些核心算法模块,重点从离线层、近线层和在线层三个架构层面讨论这些算法。本文不会讲解一些具体推荐模块的架构设计,但无论什么推荐模块,其逻辑经过拆解后都可以映射到本文的架构体系中,做到触类旁通,举一反三。架构设计是一个很大的话题,本文这里只讨论和推荐系统相关的部分。更具体地说,我们主要关注的是算法以及其他相关逻辑在时间和空间上的关系——这样一种逻辑上的架构关系。下面介绍的是一些。
2025-04-25 23:30:00
535
原创 云原生之认识DDD
充血模型更加符合现实中的对象,因为一个员工在现实世界里不只有姓名,年龄,电话等,还可以工作,吃饭,睡觉等行为,只有属性信息的对象不是一个完整的对象。1)贫血模型是事务脚本模式,贫血模型相对简单,模型上只有数据没有行为,业务逻辑由xxxService、xxxManger等类来承载,相对来说比较直接,针对简单的业务,贫血模型可以快速的完成交付,但后期的维护成本比较高,很容易变成我们所说的面条代码。这就是DDD要做的事情!贫血模型,所谓的贫血模型是在定义对象时,指定以对象的属性信息,却没有对象的行为信息。
2025-04-24 23:00:00
1326
1
原创 Java并发编程之CompletableFuture原理与实践
在Java并发编程中,CompletableFuture是一个强大而灵活的工具。今天,我们将深入探讨它的实现原理、最佳实践,以及面试中的重要考点。CompletableFuture是Java并发编程中的重要工具,它通过巧妙的设计提供了强大的异步编程能力。深入理解其实现原理掌握正确的使用方式注意性能优化实践异常处理合理进行任务编排相关材料CompletableFuture原理与实践-外卖商家端API的异步化。
2025-04-23 23:00:00
441
原创 Java基础之异或(^)运算
异或运算的时间复杂度为 O ( 1 ) O(1)O(1),因为它是一个按位操作,仅需常数时间。基本性质:交换律、结合律、自反性等。应用场景:交换变量、查找唯一数、判断符号等。优势:高效、简洁,特别适用于数组、整数处理相关问题。理解和熟练运用异或操作,对于掌握算法优化、数论相关题目非常重要。
2025-04-22 22:00:00
600
原创 Java虚拟机之GC收集器对比解读
Java 虚拟机提供了多种垃圾收集器(Garbage Collector, GC),每种收集器都有其特定的设计目标和适用场景。JVM 的垃圾收集器主要分为两大类:分代收集器和分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1 和 ZGC,下面我们来看看这两大类的垃圾收集器。
2025-04-21 21:00:00
476
原创 Java并发编程之线程池的原理和实践
线程池的核心思想是预先创建一定数量的线程,并把它们保存在线程池中,当有任务需要执行时,线程池会从空闲线程中取出一个线程来执行该任务。任务执行完毕后,线程不是被销毁,而是返还给线程池,可以立即或稍后被再次用来执行其他任务。这种机制可以避免因频繁创建和销毁线程而带来的性能开销,同时也能控制同时运行的线程数量,从而提高系统的性能和资源利用率。线程池的主要组成部分包括工作线程、任务队列、线程管理器等。线程池的设计有助于优化多线程程序的性能和资源利用,同时简化了线程的管理和复用的复杂性。
2025-03-08 09:00:00
948
原创 Java基础之Integer使用和实践
我们知道Java是面向对象的语言,号称一切皆对象,但是有8种原始数据类型(boolean、byte 、short、char、int、float、double、long)需要除排除在外。本文就以原始数据类型int和其包装类Integer为例进行讲解,主要包含以下几个方面的内容:Integer的不可变性;自动装箱和自动拆箱(boxing/unboxing);Integer的缓存值;使用Integer注意的事项等。如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。
2025-03-06 07:15:00
727
原创 Java并发编程之ThreadLocal认识和原理
通过当前线程对象 thread 获取该 thread 所维护的 ThreadLocalMap,如果 ThreadLocalMap 不为 null,则以 ThreadLocal 实例为 key,值为 value 的键值对存入 ThreadLocalMap,若 ThreadLocalMap 为 null 的话,就新建 ThreadLocalMap,然后再以 ThreadLocal 为键,值为 value 的键值对存入即可。
2025-03-04 09:00:00
843
原创 Java虚拟机之JVM内存模型
Java内存模型(Java Memory Model ,JMM)是jvm的一种规范,定义了jvm的内存模型。它屏蔽了各种硬件和操作系统的访问差异,不像c那样直接访问硬件内存,相对安全很多,它的主要目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。可以保证并发编程场景中的原子性、可见性和有序性。
2025-03-04 00:47:37
1103
原创 Java并发编程之ConcurrentHashMap的原理和使用
ConcurrentHashMap(CHM) 是 Java 并发包中实现线程安全的哈希表,其核心设计目标是在高并发场景下兼顾性能与线程安全。与 HashTable 的全表锁不同,CHM 通过分段锁(JDK7)和CAS+synchronized细粒度锁(JDK8+) 实现高效并发控制,解决了传统同步容器的性能瓶颈。锁粒度细化:从分段锁(JDK7)到桶锁(JDK8)的演进;无锁化设计:CAS操作降低线程阻塞概率;数据结构优化:红黑树替代长链表提升查询效率;
2025-03-02 23:57:03
892
原创 Java基础之== 和 equals() 的主要区别
= 是Java中的一个基本操作符,用于比较两个对象的引用是否相同(对于引用类型)或两个基本类型的值是否相等(对于基本类型)。equals() 是Java Object 类中的一个方法,用于比较两个对象的内容是否相等。默认情况下,它比较的是对象的引用,但在很多类中(如 String、Integer 等),该方法已被重写以提供类特定的比较逻辑。1)== : 对于引用数据类型==比较的是内存地址是否相等,对基本数据类型==比较的是值是否相等。
2025-03-02 15:07:38
172
原创 Java基础之字符串优化性能
String对象是我们日常工作中使用最频繁的对象,它的性能问题也是我们最容易忽略的。String对象作为Java语言中最重要的数据类型,是内存中占据空间最大的对象,高效地使用字符串,可以提升系统的整体性能。今天这篇文章我们从String对象的实现、特性以及实际使用中的优化三方面,来深入了解String对象。
2025-03-02 15:07:11
1030
原创 Java并发编程之HashMap的设计
HashMap通过哈希表数据结构的形式来存储键值对,这种设计的好处就是查询键值对的效率高。我们在使用HashMap时,可以结合自己的场景来设置初始容量和加载因子两个参数。当查询操作较为频繁时,我们可以适当地减少加载因子;如果对内存利用率要求比较高,我可以适当的增加加载因子。我们还可以在预知存储数据量的情况下,提前设置初始容量(初始容量=预知数据量/加载因子)。这样做的好处是可以减少resize()操作,提高HashMap的效率。
2025-03-02 07:30:00
1141
原创 Java并发编程之AQS
AQS是AbstractQueueSynchronizer是缩写,其意思就是抽象队列同步器。原理就是通过一个FIFO队列维护一个state同步状态值,只需要继承该抽象类重写对应的方法便可实现一套线程同步机制。AQS抽象类在java.util.concurrent.locks包下定义。如上图所示,AQS属于一个抽象类,主要是用来构建锁结构以及同步器的一个抽象类。AQS继承了AbstractOwnableSynchronizer,其作用为设置和获取独占锁的拥有者线程方法。
2025-03-01 21:49:46
1517
原创 Java并发编程之ReentrantLock
ReentrantLock 是 Java 并发编程中一种重要的同步机制,它比传统的 synchronized 提供了更高的灵活性和功能。下面将从 ReentrantLock 的基本原理、详细使用方法、内部实现机制、注意事项等方面详细说明。ReentrantLock 是基于可重入的概念设计的锁。当一个线程已经获取了 ReentrantLock 锁,它可以再次进入该锁的同步代码块而不会陷入死锁。这是因为 ReentrantLock 记录了每个线程获取锁的次数,并允许同一线程多次获取它。线程获取锁的次数与释放锁的
2025-03-01 20:21:36
471
原创 Java 并发编程之synchronized
在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。在JDK1.5之前,Java是依靠Synchronized关键字实现锁功能来做到这点的。Synchronized是JVM实现的一种内置锁,锁的获取和释放是由JVM隐式实现。到了JDK1.5版本,并发包中新增了Lock接口来实现锁功能,它提供了与Synchronized关键字类似的同步功能,只是在使用时需要显式获取和释放锁。
2025-03-01 18:39:53
1098
原创 Java并发编程之可见性、原子性和有序性
可见性是一个线程对共享变量的修改,另一个线程能够立刻看到,如果不能立刻看到,就可能会产生可见性问题。在单核CPU上是不存在可见性问题的,可见性问题主要存在于运行在多核CPU上的并发程序。归根结底,可见性问题还是由CPU的缓存导致的,而缓存导致的可见性问题是导致诸多诡异的并发编程问题的“幕后黑手”之一。我们只有深入理解了缓存导致的可见性问题,并在实际工作中时刻注意避免可见性问题,才能更好的编写出高并发程序。
2025-03-01 16:53:01
274
原创 消息队列之关于如何实现延时队列
首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。下订单成功后,在30分钟内没有支付,自动取消订单外卖平台发送订餐通知,下单成功后60s给用户推送短信。如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存淘宝新建商户一个月内还没上传商品信息,将冻结商铺等用户登录之后5分钟给用户做分类推送;用户多少天未登录给用户做召回推送;关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
2023-12-23 22:30:53
484
原创 MySQL之事务
MySQL事务是指对数据库的一组操作要么全部成功,要么全部失败。事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。MySQL的事务默认是自提交式模式,如果想要开启事务,必须以begin命令开始,以commit或者rollback命令结束。
2023-10-14 13:57:57
454
原创 redis 缓存设计
缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!解决方式:Java中可以使用初始化白名单数据缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。Cache Aside(旁路缓存)策略;
2023-10-14 07:30:00
339
原创 redis 集群(cluster)
由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个Master。相关材料redis集群知识点。
2023-09-19 07:00:00
354
原创 redis 哨兵(sentinel)机制
redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心功能是主节点的自动故障转移。Redis 在 2.8 版本以后提供的哨兵(Sentinel)机制,它的作用是实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。监控、选主、通知。
2023-09-18 08:00:00
466
原创 redis 主存复制
主存复制,就是master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。这个模式可以保证多台服务器的数据一致性,且主从服务器之间采用的是「读写分离」的方式。主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。也就是说,所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。主要功能特性读写分离。
2023-09-17 07:00:00
180
原创 redis 事务
watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。
2023-09-16 12:03:58
209
原创 redis 持久化机制
持久化、主存复制(及读写分离)、哨兵、以及集群几种技术分别解决了Redis高可用的什么问题?Redis的持久化技术,主要是RDB和AOF两种持久化方案;在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久化实现的一些原理细节及需要注意的问题。最后,介绍在实际使用中,持久化方案的选择,以及经常遇到的问题等。Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据永久丢失,需要定期将Redis中的数据以某种形式(数据/命令)从内存保存到磁盘;
2023-09-15 21:08:08
353
原创 redis 初识与入门
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存消息队列分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。除此之外,Redis 还支持事务持久化。
2023-09-12 23:00:05
433
原创 redis 核心数据结构
redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据结构。除此之外,通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处理上百万次的请求的系统。目前支持多种语言的api,方便用户使用。
2023-09-10 14:07:30
400
原创 redis I/O多路复用机制
所谓 I/O 多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现。优点:就是这种方式非常容易让人理解,写起代码来非常的自然,符合人的直线型思维。
2023-09-08 22:18:36
1816
原创 递归思想以及常见的算法题
递归函数定义基础情况处理(边界问题处理)递归调用递推到当前层以计算n!(n的阶乘)为例:下面是代码模板public void recur(int level, int param) { // 场景不同,参数不同// 先编写终止条件(没有终止条件的递归就是无限递归,类似死循环)// 处理结果数据return;// 处理当前层逻辑(有时需要先处理当前层逻辑再递归到下一导,// 有时候需要递归到下一层根据返回结果处理当前层,所以需要灵活运用)// 进入到下一层(即开始递归)
2023-08-20 16:42:15
223
原创 【架构设计】如何设计一个高性能短链系统
所谓系统设计,就是给一个场景,让你给出对应的架构设计,需要考虑哪些问题,采用什么方案解决。很多面试官喜欢出这么一道题来考验你的知识广度和逻辑思考能力。
2023-08-08 23:33:31
957
原创 Go 代码生成利器 Go Generate
在Go语言中,go generate 命令是一个非常有用的工具,它可以帮助我们自动化地生成代码。本文将详细介绍如何使用 go generate 命令,并提供一些示例来说明它的用法。go generate 命令是一个用于自动化生成Go代码的工具。它可以在Go源文件中的特殊注释中指定命令,然后在运行 go generate 命令时自动执行这些命令。这些命令可以用来生成代码、格式化代码、运行测试等等。
2023-08-08 22:24:59
3459
原创 【网络编程】TCP 3次握手&4次挥手浅析
大家都知道传输层中的TCP协议是面向连接的,提供可靠的连接服务,其中最出名的就是三次握手和四次挥手。
2023-07-29 13:58:23
1555
原创 链表基础知识
链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的结构是多式多样的,当时通常用的也就是两种:(1)第一种是无头非循环单向链表(2)第二种是带头循环双向链表无头单向非循环列表:结构简单,一般不会单独用来存放数据。实际中更多是作为其他数据结构的子结构,比如说哈希桶等等。带头双向循环链表:结构最复杂,一般单独存储数据。实际中经常使用的链表数据结构,都是带头双向循环链表。
2023-07-29 12:40:45
464
原创 最近很火的 LangChain 你了解吗
LangChain 是一个 2023 年 1 月(v0.0.64)在 GitHub 上新开源的新框架,框架的作用是可以通过可组合性使用 LLM 构建你的应用程序。现阶段更新频率较高。有 Python 和 JS 的两种版本。和 AIGC 一样的热度,广受追捧,Stars 已经冲到了 38k 左右。官方的说辞:LangChain 是一个用于开发由语言模型驱动的应用程序的框架。具有数据意识:将语言模型与其他数据源连接起来。具有自主性:允许语言模型与其环境进行交互。
2023-07-16 19:51:44
2931
原创 【MySQL】资深开发竟然不清楚int(1)和int(10)的区别
int后面的数字不能表示字段的长度,int(num)一般加上zerofill,才有效果。zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 … 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么你只能自己处理了。
2023-07-05 22:34:40
595
原创 Go GC之三色标记算法
为了解决原始标记清除算法带来的长时间 STW,多数现代的追踪式垃圾收集器都会实现三色标记算法的变种以缩短 STW 的时间。主流的垃圾收集器基本上都是基于可达性分析算法来判定对象是否存活的。根据对象是否被垃圾收集器扫描过而用白、灰、黑三种颜色来标记对象的状态的一种方法。而其中白色对象—表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始阶段,所有的对象都是白色的,若在分析结束之后对象仍然为白色,则表示这些对象为不可达对象,对这些对象进行回收。黑色对象。
2023-05-21 21:19:22
1878
1
原创 Go 并发之channel(通道)
通道类型的值本身就是并发安全的,这也是 Go 语言自带的、唯一一个可以满足并发安全性的类型。它使用起来十分简单。在声明并初始化一个通道的时候,需要用到 Go 语言的内建函数make。就像用make初始化切片那样,传给这个函数的第一个参数是代表了通道的具体类型的类型字面量。在声明一个通道类型变量的时候,首先要确定该通道类型的元素类型,这决定了可以通过这个通道传递什么类型的数据。比如,类型字面量chan int,其中的chan是表示通道类型的关键字,而int则说明了该通道类型的元素类型。
2023-05-20 22:48:47
4180
5
rocketmq_broker.conf
2020-12-04
redis主存复制数据同步过程日志
2020-12-02
redis面试题及答案(上).pdf
2019-10-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人