PostgreSQL—逻辑复制
测试采用 postgres:17beta2 版本的docker images 逻辑复制与流复制的区别 PostgreSQL 支持两种主要的复制模式:物理复制(也称为流复制)和逻辑复制。这两种复制模式有…
Java—绑定线程到指定CPU上(线程问题思考)
Java线程 在聊如何绑定之前,先铺垫一个相关的背景知识:Java线程的实现。 都知道 Thread 类的大部分方法都是 native 方法: 在 Java 中一个方法被声明为 native 方法,绝…
Minio—快速整理
MinIO 介绍 Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。 官方网站 https://min.io/product/enterpriseovervie…
LangChain+RAG—构建知识库(二)
后续的测试都是 LangChain + ollama + chroma 来进行RAG构建 Ollama安装 ollama 可以在本地快速启动并运行大型语言模型,支持很多种大模型,具体的可以在上面查看:…
LangChain+RAG—构建知识库(一)
大语言模型简介 模型简介 语言模型犹如一艘艘探索船,它们通过预测单词序列的概率,解码语言的奥秘。这些由人工神经网络构成的模型,经过海量文本数据的洗礼,不仅理解语言的本质,更能预测序列中的下一个单词。当…
PostgreSQL—监控
PostgreSQL的监控方案很多,功能强悍的包括zabbix、prometheus等,再搭配上grafana和echarts等可视化工具,逼格杠杠。还有针对PostgreSQL特定的监控如pg_to…
PostgreSQL—如何查找TOP SQL
数据版本为:postgres14 (不同版本之间的配置会有所变化) pg_stat_statements模块提供了一种跟踪服务器执行的所有 SQL 语句的计划和执行统计信息的方法。 该模块必须通过在p…
Kafka—整理记录
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量…
Redis—Redisson客户端
Redis 是用单线程来处理多个客户端的访问,因此作为 Redis 的开发和运维人员需要了解 Redis 服务端和客户端的通信协议,以及主流编程语言的 Redis 客户端使用方法,同时还需要了解客户端…
Java—P6Spy数据库SQL记录
P6Spy是一个框架,它可以无缝地拦截和记录数据库活动,而无需更改现有应用程序的代码。一般我们使用的比较多的是使用p6spy打印我们最后执行的sql语句。常用的数据框架也会自带打印sql的功能,比如j…
Spring—WebFlux请求处理流程
在了解SpringMvc的请求流程源码之后,理解WebFlux就容易的多,毕竟WebFlux处理流程是模仿Servlet另起炉灶的。 MVC的具体参考以前的文章 http://www.enmalvi.…
一致性协议
常见的一致性协议 有二阶段提交(2PC)、三阶段提交(3PC)、Paxos、Raft等算法。 这是很多分布式集群相互通信的基础。 2PC 2PC即Two-Phase Commit,二阶段提交。广泛应用…
Java—动态线程池
Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度。JDK 提高完整线程池实现,但是 Tomcat/Jetty 都没有直…
SpringBoot—jar包加密防止反编译
ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。 可以直接加…
Redis—集群方式
集群高可用常见的方式 Replication-Sentinel模式 Redis-Cluster模式 中心化代理模式(proxy模式) Replication-Sentinel模式 Redis sent…
Caffeine—缓存实战
之前分析了Caffeine的原理,缓存过期的内容 http://www.enmalvi.com/2023/10/03/caffeine/ 这里来简要讲讲如何快速使用,对于常见缓存类型而言,可以分为本地…
Caffeine—缓存学习
缓存(Cache)在代码世界中无处不在。从底层的CPU多级缓存,到客户端的页面缓存,处处都存在着缓存的身影。缓存从本质上来说,是一种空间换时间的手段,通过对数据进行一定的空间安排,使得下次进行数据访问…
SpringBoot—扩展接口
Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很…
正则表达式 – 密码格式
示例 1种 只能由1种组成 只能由字母组成,1-9位 ^[a-zA-Z]{1,9}$ 只能由数字组成,1-9位 ^\d{1,9}$ 只能由特殊字符组成,1-9位 ^[^\da-zA-Z\s]{1,9}…
Java—使用SnakeYAML解析与序列化YAML
Springboot底层-snakeyaml的使用,就是用来操作YAML的 依赖 <dependencies> ... <dependency> <groupId>org.yaml&…
Java—定时任务—HashedWheelTimer时间轮
海量定时任务管理的问题 一个大型内容审核平时,在运营设定审核了内容的通过的时间,到了这个时间之后,相关内容自动审核 通过, 本是个小的需求,但是考虑到如果需要定时审核的东西很多,这样大量的定时任务带来…
Java—有向无环图(DAG)
在软件开发中会有会有定时任务的存在,简单的定时任务只需要在固定时间触发它的执行就可以了。 但是对于复杂的定时任务,可能是由多个任务组成一个任务组,它们之间存在依赖关系,一个任务执行的条件,必须是它的前…
JXLS—Excel模板框架
因为业务的需要,要解决报表样式的复杂度问题,每一个中国式报表的复杂度都是极其变态的,所以可以通过模版的方式来导出Excel样式,而不是通过代码来构造Excel的样式,这就是不采用原生的POI与Easy…
Disruptor—无锁队列
Disruptor 是什么 Disruptor 由 LMAX 开发,用于改进 Java 线程间通信,主要适用于对延迟敏感度高到极端的应用程序,在保持高吞吐量的同时确保非常高的响应时间。通常,此类服务旨…
Redis—注解接口限流
Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。 在项目中因为某个接口疯狂被请求导致线程阻塞,所以要对单个接口加上阻塞。 准备工作 添加POM依赖 <parent…
SpringBoot—数据库读写分离
在集群数据库里,数据库的读写分离也是常见的优化手段。 读写分离有很多种方式可以来实现,比如用sharding-jdbc等框架来实现,不过这里用最简单的方式。 方案使用了AbstractRoutingD…
Netty—初探与核心(未完)
Netty 是由 JBOSS 提供的一个 Java 开源通讯框架,用以快速开发高性能、高可靠性的网络 IO 程序。它底层很好地封装了 Socket,处理网络通信的一个开源通信框架。通俗说明,Netty…
Netty—NIO基础
IO模型就是说用什么样的通道进行数据的发送和接收,Java共支持3种网络编程IO模式:BIO,NIO,AIO 之前有过学习这三种模式的理论内容 http://www.enmalvi.com/2022/…
Java8—Consumer、Supplier、Predicate、Function
这几个接口都在 java.util.function 包下的,分别是Consumer(消费型)、supplier(供给型)、predicate(谓词型)、function(功能性),相信有了后面的解释…
Spring—WebClient使用
WebClient是Spring5引入的,基于响应式编程实现的HTTP调用客户端。Spring官方推荐使用WebClient替代RestTemplate完成HTTP调用。因为WebClient是基于R…