分布式缓存架构设计:缓存穿透、击穿、雪崩解决方案
分布式缓存架构设计:缓存穿透、击穿、雪崩解决方案 引言 想象一下,你是一家热门餐厅的老板。每天中午,成百上千的顾客涌进来点餐。你的厨房(数据库)能力有限,所以你在前台设置了一个“今日特价菜”展示板(缓存)。顾客先看展示板,如果有想吃的,直接下单;如果没有,才去问厨房。 一切看起来运转良好,直到发生以下几种情况: 穿透:一个顾客问“有没有红烧鲸鱼肉?”——这道菜压根就不在菜单上。但每次他问,你的服务
RAG(检索增强生成)系统设计与实现
RAG(检索增强生成)系统设计与实现 引言 想象一下,你正在开发一个企业级知识问答系统。用户问:“我们公司去年Q3的营收数据在哪个报表里?”这个问题看似简单,但背后隐藏着巨大的挑战:大语言模型(LLM)虽然博闻强识,却对你的企业内部数据一无所知。它可能自信满满地编造一个答案,然后你的老板就会收到一份“我们Q3营收是10个亿,在财务报表第42页”的虚假信息——而实际数据是8.5个亿,在第17页。 这
Python性能调优:cProfile、memory_profiler实战
Python性能调优:cProfile、memory_profiler实战 引言 想象一下,你刚部署了一个FastAPI服务,用户反馈接口响应越来越慢,服务器内存飙升,最终OOM崩溃。你盯着监控面板,CPU使用率像过山车,内存曲线陡峭如悬崖。问题出在哪?是某个函数太慢,还是内存泄漏?没有数据支撑的优化,就像蒙着眼睛修车——你可能换了个零件,但问题依然存在。 我经历过一个真实案例:一个数据处理服务,
ThreadPoolExecutor 源码拆解:从位运算到拒绝策略的完整链路
ThreadPoolExecutor 源码拆解:从位运算到拒绝策略的完整链路 引言 想象一下,你经营一家餐厅。高峰期客人络绎不绝,你不可能每来一个客人就临时去招聘一个服务员——这就是池化思想的由来。在 Java 生态中,线程池就是这家\"餐厅\",核心线程是\"正式员工\",阻塞队列是\"等位区\",最大线程是\"临时工上限\",而拒绝策略决定了\"客满之后该怎么办\"。 然而,阿里 Java 开发规约明确要求:必须
Git的常用命令
Git的常用命令1. 新建代码库
git init # 在当前目录新建一个Git代码库
git init [project-name] # 新建一个目录,将其初始化为Git代码库
git clone [url] # 克隆项目到本地
2. 配置
git config –list # 显示当前的Gi ...
Feign接口调用的介绍与实现
1. 使用Feign调用服务接口在Java中,进行项目开发基本都是模块划分,划分模块之后,就需要进行接口的调用。那么该如何进行接口的调用呢??
HttpClient
HttpClient提供了高效的、最新的、功能丰富的支持Http协议的客户端编程工具包。
HttpClient相比传统JDK自带的U ...
Ribbon的介绍及使用
1. Spring Cloud Ribbon(负载均衡)介绍及使用目前主流的负载均衡方案分两种:
集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载均衡,比如Nginx。
客户端自己做负载均衡,根据自己的请求情况做负载,Ribbon就属于客户端自己做负载。
Spring Clou ...
Spring Cloud Eureka的介绍和使用
Spring Cloud Eureka 是一个基于REST的服务,并且提供了基于Java的客户端组件,能够非常方便地将服务注册到Spring Cloud Eureka中进行统一管理。
服务治理是微服务架构中必不可少的一部分,阿里开源的Dubbo框架就是针对服务治理的。服务治理必须要有一个注册中心,除 ...
Spring Boot Starter的介绍和使用
我们都知道Spring Boot开发相当的便利,对于开发人员来说是一个福音,其实它就是通过引入各种的Spring Boot Starter包可以快速搭建出一个项目的脚手架。
目前提供的Spring Boot Starter包有很多,比如:
spring-boot-starter-web : 快速构 ...
Spring Boot的基本使用
1. SpringBoot的简介Spring Boot其设计目的是简化Spring应用的初始搭建以及开发过程,省去了创建Web项目的一系列配置文件的编写。
Spring Boot是通过Starter的方式轻松集成第三方的框架,去掉XML的配置,全部使用注解代替。
Spring Boot开发的优点:
...
单链表的增删改查
1. 链表(Linked List)介绍链表是有序的列表,它在内存中的存储结构如下:
1)链表是以节点的方式来存储,是链式存储。
2)每个节点包含data域,next域:指向下一个节点。
3)链表的各个节点不一定是连续存储。
4)链表分带头节点的链表和不带头节点的链表,根据实际的需求来确定。
单 ...
数组模拟环形队列
1. 思路分析1)尾索引的下一个为头索引时表示队满,即:将队列容量空出一个作为约定,这个在做判断队列满的时候要注意 (rear + 1) % maxSize == front 【满】
2)rear == front 【空】
3)(rear + maxSize -front) % maxSize 【环 ...
数组模拟队列
1. 队列的介绍1)队列是一个有序列表,可以用数组或是链表来实现。
2)遵循先进先出的原则。即:**先进队列的数据,要先取出。后进的要后取出。
3)示意图:
2. 数组模拟队列思路
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。 ...
二维数组与稀疏数组的转换
1. 图解
这个教程的讲解是以五子棋棋盘落子的应用场景来介绍的,棋盘就相当于一个二维数组,其中 0表示无子,1表示黑子,2表示蓝子。
2. 思路2.1 二维数组转换成稀疏数组:
遍历原始的二维数组,获取有效数据的个数 sum;
根据有效数据个数 sum 创建一个稀疏数组 sparseArr int[ ...









