自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 23种设计模式的必备结构图

这里总结了23种设计模式的结构图及定义,样例代码在 Github:studeyang/design-pattern。工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。单例模式,保证一个类仅有一个实例,并提供一个访问

2023-05-16 10:19:56 598

原创 06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密

为了更好地理解 MySQL 优化器的工作原理,我们可以使用一个强大的调试工具:OPTIMIZER_TRACE。它是在 MySQL 5.6 及之后的版本中提供的,可以查看详细的查询执行计划,包括查询优化器的决策、选择使用的索引、连接顺序和优化器估算的行数等信息。当开启 OPTIMIZER_TRACE 时,MySQL 将会记录查询的执行计划,并生成一份详细的报告。这个报告可以提供给开发人员或数据库管理员进行分析,以了解 MySQL 是如何决定执行查询的,进而进行性能优化。

2023-04-23 11:11:57 316

原创 索引失效了?看看这几个常见的原因

索引是 MySQL 数据库中优化查询性能的重要工具,通过对查询条件和表数据的索引,MySQL可以快速定位数据,提高查询效率。但是,在实际的数据库开发和维护中,我们经常会遇到一些情况,导致索引失效,从而使得查询变得非常缓慢,甚至无法使用索引来优化查询,这会严重影响系统的性能。那么,是什么原因导致了索引失效呢?下面我通过实际的例子来具体说说。

2023-04-21 09:03:42 1759

原创 05期:面向业务的消息服务落地实践

传统的消息队列对业务方提出了更高的要求,我们期望提供的是一种以业务为重心的,面向服务的解决方案。

2023-03-28 18:46:04 497

原创 04期:领域驱动设计与微服务

这里记录的是学习分享内容,文章维护在 Github:studeyang/leanrning-share。随着微服务的兴起,你一定听说过领域驱动设计 DDD(domain-driven design),但是如果把它当成一个术语来看,似乎有点抽象。这到底是个什么玩意?别急,你肯定还听说过测试驱动开发(TDD, Test-driven development)吧?这是个什么概念呢?就是说开发的过程中要测试先行,倡导先写测试程序,然后编码实现。开发是目的,测试是辅助,所以叫做测试-驱动-开发,我们应该把它拆成 3

2023-03-20 17:54:04 260 1

原创 学习分享(第3期):你所理解的架构是什么?

说到架构,这个概念没有很清晰的范围划分,也没有一个标准的定义,每个人的理解可能都不一样。架构在百度百科中是这样定义的:架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。我们可以理解为:架构设计的主要目的是为了解决软件系统复杂度带来的问题。

2023-03-14 19:28:34 326

原创 学习分享(第 2 期):从源码层面看 Redis 节省内存的设计

我们知道,redisObject 是底层数据结构如 SDS, ziplist 的封装,因此,redisObject 如果能做优化,最终也能带来节省内存的用户体验。在源码server.h//对象类型(4位=0.5字节) unsigned encoding : 4;//编码(4位=0.5字节) unsigned lru : LRU_BITS;//记录对象最后一次被应用程序访问的时间(24位=3字节) int refcount;//引用计数。

2023-02-27 17:06:12 164

原创 学习分享(第 1 期)之 Redis:巧用 Hash 类型节省内存

其中有的 entry 保存一个图片 ID 的后 3 位(4 字节),有的 entry 保存存储对象 ID(8 字节),此时,每个 entry 的 prev_len 只需要 1 个字节就行,因为每个 entry 的前一个 entry 长度都小于 254 字节。但是,在插入数据时,Sorted Set 需要按 score 值的大小进行排序,它的性能就差了。还是用上面拆成两部分保存的方法,把图片 ID 的前 7 位 Hash 集合的 key,把图片 ID 的后 3 位作为 Hash 集合的 value。

2023-02-07 09:18:52 349

原创 Redis的String类型,原来这么占内存

假设现在我们要开发一个图片存储系统,要求这个系统能够根据图片 ID 快速查找到图片存储对象 ID。在这种场景下,图片 ID 和图片存储对象 ID 刚好是一对一的关系,是典型的“键 - 单值”模式,Redis 的 String 类型提供了“一个键对应一个值的数据”的保存形式,在这种场景下刚好适用。确定使用 String 类型后,接下来我们通过实战,来看看它的内存使用情况。首先通过下面命令连接上 Redis。本文我使用的 Redis Server 及下文源码都是 6.2.4 版本。

2023-01-10 10:51:18 661

原创 (byte)1658385462>>16=-40,怎么算的?

原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。反码:正数的反码是其本身。负数的反码是在其原码的基础上,符号位不变,其余各位取反。补码:正数的补码就是其本身。负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。从原码、反码、补码的表示方式不难看出,原码才是人眼最直观能看出值的表示方式,那么为什么还要有反码和补码呢?答案是为了简化计算机集成电路的设计。我们人脑是可以辨别第一位是符号位的,在计算的时候我们会根据符号位,选择对真值区域的加减。

2022-12-26 15:11:31 679

原创 Redis高可用之哨兵机制实现细节

本文来自我的 technotes [1] Redis篇,欢迎你常来逛逛。

2022-12-20 13:57:58 419

原创 Redis高可用全景一览

前几天我在知乎看到一个问题:如何建立自己的知识体系和观点?[1]在一篇高赞回答中讲述了建立“外脑”是关键,文章观点认为:大脑是用来思考的,不是用来记忆的。我很认同这样的看法,我的账号名为“杨同学technotes”,technotes[2] 源于我最近几年总结的 github 项目,意为“技术笔记”,这便是我的“外脑”。我将一直往里面填充东西,不断优化内容,欢迎关注。本文来自我的 technotes Redis篇。对于一项技术的学习,我们要对这项技术有一个全局观,下面是一张 Redis 全景图,我觉得画得非

2022-12-12 20:29:37 423

原创 XXL-JOB核心源码解读及时间轮原理剖析

你好,今天我想和你分享一下XXL-JOB的核心实现。如果你是XXL-JOB的用户,那么你肯定思考过它的实现原理;如果你还未接触过这个产品,那么可以通过本文了解一下。XXL-JOB的架构图(2.0版本)如下:它是如何工作的呢?从使用方的角度来看,首先执行器要向服务端注册。那么这里你可能就有疑问了,执行器向服务端注册?怎么注册的?多久注册一次?采用什么通信协议?注册完了之后,服务端才能知道有哪些执行器,并触发任务调度。那么服务端是如何记录每个任务的触发时机,并完成精准调度的呢?XXL-JOB采用的是Quartz

2022-12-05 21:44:28 2126

原创 spring initializr脚手架搭建详解

项目分为 initializr、start-client、start-site 三个部分,重要部分说明如下。|- initializr 代码生成|- initializr-generator 生成基础工程代码|- initializr-generator-spring 生成 spring 工程代码|- initializr-generator-test 单元测试的封装|- initializr-generator-zebra 生成 zebra 分层架构。

2022-11-27 18:48:18 1376

原创 实战:如何优雅地扩展Log4j配置?

Log4j 日志框架我们经常会使用到,最近,我就遇到了一个与日志配置相关的问题。简单来说,就是在原来日志配置的基础上,指定类的日志打印到指定的日志文件中。

2022-11-21 10:06:50 1255

原创 Nacos注册中心快速入门

本文介绍了`Nacos`注册中心入门使用,并介绍了通过`Feign`及`Ribbon`完成服务间调用,`Nacos`也实现了基于权重的负载均衡策略,这点可以搭配`Ribbon`使用。

2022-11-09 12:42:20 276

原创 基于start.spring.io,定制你的Java脚手架

2020 年,我们公司迎来了业务发展的迅猛期,滋生大量创建工程的需求。总体来说,创建工程面临着以下几个问题。

2022-10-29 15:35:54 1076

原创 海量数据情况下,怎么用Bitmap进行签到统计?

在 Web 和移动应用的业务场景中,我们经常需要保存这样一种信息:统计用户在手机 App 上的签到打卡信息。在签到打卡的场景中,我们只用记录签到(1)或未签到(0),它就是非常典型的二值状态。在签到统计时,每个用户一天的签到用 1 个 bit 位就能表示,一个月(假设是 31 天)的签到情况用 31 个 bit 位就可以,而一年的签到也只需要用 365 个 bit 位。

2022-10-29 15:28:29 779

原创 Nacos配置中心落地与实践

一、背景目前,我们公司各团队配置中心使用各异,电商使用的是 Spring Cloud Config,支付使用的是 Apollo,APP 团队使用的是 Apollo+Nacos。为了更好地应对公司业务的发展,统一基础设施技术栈必不可少。图片来源:直播《如何做好微服务基础设施选型》--李运华此外,电商团队使用的 Spring Cloud Config 面临以下技术痛点:修改配置需要重启服务配置管理不友好(通过gitlab修改)缺少权限管控、格式检验、安全配置等特性二、配置中心选型开源

2022-10-22 17:46:34 1150

原创 Kafka的Reactor模式--支撑10万请求数

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://www.dbses.cn/technotes关于如何处理请求,我们很容易想到的方案有两个。顺序处理请求伪代码大概是这个样子:while (true) { Request request = accept(connection); handle(request);}这种方式的吞吐量太差,每个请求都必须等待前一个请求处理完毕才能得到处理。适用于请求发送非常不频繁的系统。异步处理请.

2021-07-18 22:43:55 373

原创 踩坑系列--线程池使用最佳实践

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://www.dbses.cn/technotes踩坑8:线程池需要手动声明案例场景使用 FixedThreadPool 的场景如下。@GetMapping("oom1")public void oom1() throws InterruptedException { ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.n.

2021-07-11 21:55:19 274

原创 踩坑系列--正确地给代码加锁

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://www.dbses.cn/technotes踩坑5:锁加在了不同层面上导致结果不符合预期案例场景class Data { @Getter private static int counter = 0; public static int reset() { counter = 0; return counter; } pub.

2021-07-04 23:48:01 1178

原创 踩坑系列--正确使用并发工具类库

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes我们来看看在使用并发工具时,经常遇到哪些坑,以及如何解决、避免这些坑。踩坑1:线程池中使用 ThreadLocal 导致数据串了案例场景某业务组同学在生产上有时获取到的用户信息是别人的。使用的代码如下。@GetMapping("wrong")public Map wrong(@RequestParam("userId") Integer user.

2021-06-24 19:17:49 225

原创 当我们谈论系统性能测试时,具体谈论的是什么?

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01丨性能测试是什么样的?性能测试要有指标时间指标、容量指标、资源利用率指标。性能测试要有模型业务模型,比如说,我们有 100 种业务,只有 50 个业务需要有并发量,那就要把这些有并发的业务统计出来,哪个业务并发多,哪个业务并发少,做压力测试时就要控制好这样的比例。监控模型,这个部分的监控,要有分层、分段的能力,要有全局监控、定向监控的能力。性能.

2021-06-06 13:39:05 162

原创 如何设计一款百亿级API网关?

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | 背景介绍1.1 API 网关是什么?API网关是运行于外部请求与内部服务之间的一个流量入口,实现对外部请求的协议转换、鉴权、流控、参数校验、监控等通用功能。总结来说,网关主要解决两个问题:第一,统一 API 的管理;第二,整合微服务的重复功能;1.2 为什么要做 Shepherd API 网关主要原因有三点。1、提高研发效率:在没有 Sh.

2021-05-28 14:42:20 695 3

原创 Kafka的消费者(五)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | 消费者组到底是什么?消费者组(Consumer Group)特性消费者组,即 Consumer Group,是 Kafka 提供的可扩展且具有容错性的消费者机制。组内可以有多个消费者或消费者实例(Consumer Instance),它们共享一个公共的 ID,这个 ID 被称为 Group ID。组内的所有消费者协调在一起来消费订阅主题(Sub.

2021-05-14 14:22:50 210

原创 Kafka消息无丢失配置(四)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotesKafka 到底在什么情况下才能保证消息不丢失呢?一句话概括,Kafka 只对“已提交”的消息(committed message)做有限度的持久化保证。这句话里面有两个核心要素。第一个核心要素是“已提交的消息”。当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,它们会告诉生产者程序这条消息已成功提交。此时,这条消息在 Ka.

2021-05-08 17:05:04 114

原创 Kafka的生产者(三)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | 生产消息的分区机制在使用 Apache Kafka 生产和消费消息的时候,如何将大的数据量均匀地分配到 Kafka 的各个 Broker 上?今天就来说说 Kafka 生产者如何实现这个需求。Kafka 的消息组织方式实际上是三级结构:主题 - 分区 - 消息。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中被保存多份。官网上的这张图.

2021-05-08 16:30:13 329

原创 Kafka使用前准备(二)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | 我应该选择哪种Kafka?整个 Kafka 生态圈如下图所示。Kafka Connect 通过一个个具体的连接器(Connector),串联起上下游的外部系统。由于存在多个组织或公司发布不同的 Kafka,目前市面上主要有以下三种:Apache KafkaApache Kafka 是最“正宗”的 Kafka,自 Kafka 开源伊始,它便.

2021-04-30 10:19:40 271

原创 Kafka入门(一)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | Kafka 介绍Kafka 是什么?Apache Kafka 是一款开源的消息引擎系统 Messaging System,就像引擎一样,具备某种能量转换传输的能力。Kafka 是做什么用的?根据维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。通俗来讲,就是系统 A 发送消.

2021-04-30 10:08:53 140

原创 Spring Boot构建系统监控层(六)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | 使用 Actuator 组件实现系统监控引入 Spring Boot Actuator 组件引入依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-a.

2021-04-24 15:27:43 351

原创 Spring Boot构建系统安全层(五)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | Spring Security 架构及核心类Spring Security 中的过滤器链Spring Security 中采用的是管道-过滤器(Pipe-Filter)架构模式,这些过滤器链,构成了 Spring Security 的核心。如下图所示:项目一旦启动,过滤器链将会实现自动配置,如下图所示:UsernamePasswordAu.

2021-04-24 15:24:50 166 1

原创 Spring Boot构建消息通信层(四)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes01 | 使用 KafkaTemplate 集成 Kafka与 JdbcTemplate 和 RestTemplate 类似,Spring Boot 作为一款支持快速开发的集成性框架,同样提供了一批以 -Template 命名的模板工具类用于实现消息通信。对于 Kafka 而言,这个工具类就是 KafkaTemplate。使用 KafkaTemplate.

2021-04-16 17:47:36 222

原创 Spring Boot构建Web服务层(三)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes1 | 构建一个 RESTful 风格的 Web 服务理解 RESTful 架构风格REST(Representational State Transfer,表述性状态转移)这种架构风格把位于服务器端的访问入口看作一个资源,在传输协议上使用标准的 HTTP 方法,比如最常见的 GET、PUT、POST 和 DELETE。下表展示了 RESTful 风格的.

2021-04-16 17:34:24 162

原创 Spring Boot构建数据访问层(二)

本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotes06 | JDBC 访问关系型数据库规范作为一套统一标准,JDBC 规范具备完整的架构体系,如下图所示:JDBC 规范中有哪些核心编程对象?对于日常开发而言,JDBC 规范中的核心编程对象包括 DriverManger、DataSource、Connection、Statement,及 ResultSet。DriverManagerJDBC 中.

2021-04-10 16:36:37 206

原创 Spring Boot的配置体系(一)

开篇词本文为博主自学笔记整理,内容来源于互联网,如有侵权,请联系删除。个人笔记:https://github.com/dbses/TechNotesSpring Boot 框架使配置变简单、使编程变简单、使部署变简单、使监控变简单。总结来说有如下特点。看上去简单,实则复杂Spring Boot 提供了很多隐式的功能,比如自动配置,它将系统开发的复杂度隐藏得很深。技术体系和组件众多Spring Boot 提供了一大批功能组件,这些功能组件构成了庞大的技术体系。框架集成的“坑”不少

2021-04-07 21:04:41 235

原创 SpringCloud原理与实战-01基础篇

为什么要学习微服务架构?微服务架构中,经常会遇到下面问题。服务实例太多怎么办?当系统中存在大量独立服务时,如何有效识别和管理这些服务的实例?这将成为一大挑战!分布式系统,一定要能够实时对这些服务实例进行治理。服务调用关系太杂乱怎么办?服务数量所衍生的另一个问题,是服务调用之间的关系会变得混乱,客户端与各个服务之间也会存在较高的耦合度,分布式系统需要提供简洁而明确的入口供客户端访问。服务访问出错了怎么办?分布式环境下的调用,与单体系统中的方法级调用不同。服务间的跨进程调用可能出现各种

2021-03-27 21:52:03 312

原创 如何实现系统的单点登录?

目录1. 单点登录的流程是什么样的?2. 从代码层面剖析单点登录流程3. 跨域问题怎么解决?4. 如何实现会话超时?1. 单点登录的流程是什么样的?总体来说,一次单点登录过程包括了 3 次重定向过程。第一次重定向,发现 Session 里未携带用户信息,拦截该未登录请求,重定向到 CAS Server;第二次重定向,是登录成功重定向到初始访问接口(用户被拦截的接口),这步的重定向很关键,解决了单点登录的跨域问题;第三次重定向,Session 携带用户信息去访问初始接口;整个流程图如下:思考以下几

2020-07-24 21:13:56 775

原创 github下载代码慢解决办法

这里写自定义目录标题方法一:修改host文件,绕过DNS解析方法一:修改host文件,绕过DNS解析通过访问:https://www.ipaddress.com/ 分别获取以下两个网址的ip:(1) github.com(2) github.global.ssl.fastly.net然后修改系统的host文件:## 102.54.94.97 rhino.acme.com # source server# 38.25.63.10 x.acme.com # x client host# lo

2020-07-16 09:20:59 456

原创 面试官:HashMap了解吗?回答balabala。那你讲讲红黑树吧!

目录1. 二叉树基本概念1.1 什么是树(Tree)?1.2 什么是二叉树(Binary Tree)?1.3 二叉树的存储1.4 二叉树的遍历2. 二叉查找树2.1 二叉查找树的查找操作2.2 二叉查找树的插入操作2.3 二叉查找树的删除操作3. 红黑树(Red-Black Tree)3.1 如何定义一棵"红黑树"?参考资料1. 二叉树基本概念二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储?1.1 什么是树(Tree)?树的相关概念:节点(Node)、高度(Height)、深度(Depth)

2020-07-02 20:54:17 341

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除