自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

weixin_34452850的博客

道阻且长,行则将至

  • 博客(118)
  • 收藏
  • 关注

原创 5. 缓存模块

对于缓存功能,相信大家都十分熟悉了。一旦我们发现系统的性能存在瓶颈需要优化时,可能第一时间想到的方式就是加缓存。缓存本质上是一种空间换时间的技术,它将计算结果保存在距离用户更近、或访问效率更高的存储介质中,进而降低请求处理耗时,提升系统性能。

2023-07-18 15:21:53 466 2

原创 4. 数据源模块

在日常开发中,我们经常会接触到池化技术,这是一种非常经典的设计思想。简单来说,池化技术指的是:将一些创建过程较为繁琐的重量级对象,统一维护在一个对象池中进行管理,每次使用对象时都从池中获取,使用完成后再归还给对象池进行回收。

2023-07-11 20:04:04 448 2

原创 3. 日志模块(下)

在日志模块的上篇中,我们详细拆解了 MyBatis 是如何整合第三方日志框架,实现了完善的日志功能的。那么在本节中,我们再来具体分析下:为了实现“将日志功能优雅地嵌入到核心流程中,实现无侵入式地日志打印”这一目标,MyBatis 内部做了怎样的设计。

2023-07-07 13:58:08 432 2

原创 2. 日志模块(上)

无论对于业务系统还是中间件来说,日志都是必不可少的基础功能。完善、清晰地日志可以帮助我们观测系统运行的状态,并且快速定位问题。现在让我们站在 MyBatis 框架开发者的角度,来分析一下日志功能的实现。

2023-07-05 19:57:04 465 2

原创 1. MyBatis 整体架构

作为正式内容的第一篇,本次不会介绍具体的技术,而是先从全局视角上对 MyBatis 做一个俯瞰,了解 MyBatis 项目工程的组织结构,以及内部的核心功能模块。

2023-07-01 08:51:38 954 2

原创 0. 开篇词 —— 风物长宜放眼量

本专栏开篇于2023年年中,正值后疫情时代经济复苏不及预期、行业增速继续放缓、裁员失业率居高不下的宏观环境下,不确定性与焦虑感在整个社会中蔓延。但是我想说的是,越是在不确定的时代,越是要转而追求自身的确定性,摒弃对于时代红利 β 的依赖,专注于提升个人的 α。经济的兴衰、行业的变革背后都有其周期性的规律,拉长时间维度来看,我们当前所经历的一切也许并没有那么特殊。让我们一起把心态放平、视野放宽,在周期下行时持续蓄能,等待上行的机会再一飞冲天!最后附上我很喜欢的一句话共勉:风物长宜放眼量。

2023-07-01 08:43:57 402 2

原创 探寻容器的本质

云原生的基础就是容器化。可以说正是容器技术的快速发展,才推动了云原生的时代浪潮。

2022-09-09 17:31:27 590 2

原创 开篇——初识云原生

为了解决传统云计算领域的问题,容器化技术逐渐大放异彩,并推动云原生的快速发展。简单来说,云原生指的是在包括公有云、私有云、混合云等动态环境中构建和运行规模化应用的能力。这也是目前很多互联网大厂所采用的方式,即同时选择几家公有云,并且在企业内部也搭建私有云,将不同的业务部署在不同的云环境上,以达到冗余和容灾的目的。利用云原生的弹性调度能力,应用可以实现资源的动态扩缩容和环境的快速切换。基于云原生的容器化、弹性调度、服务治理等等技术手段,可以实现服务的大规模快速部署,解决了传统云计算的问题。

2022-09-05 09:34:24 352

原创 Web 应用防火墙

Web 应用防火墙(Web Application Firewall, WAF)通过对 HTTP(S) 请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、跨站请求伪造等攻击,保护 Web 服务安全稳定。

2022-06-15 17:56:35 1258

原创 Redisson 分布式锁执行流程

Redis分布式锁执行流程

2022-04-28 17:53:37 645

原创 熔断机制——断路器状态机

断路器状态流转过程:断路器初始状态为 CLOSED,此时服务可用正常调用;当调用失败的次数达到阈值时,熔断状态从 CLOSED 切换到 OPEN 状态。一般在实现时,如果调用成功一次,就会重置调用失败次数;当断路器处于 OPEN 状态时,我们会启动一个超时计时器,当计时器超时后,状态切换到 HALF_OPEN 半打开状态。你也可以通过设置一个定时器,定期地探测服务是否恢复;在断路器处于 HALF_OPEN 状态时,请求可以达到后端服务,如果累计一定的成功次数后,状态切换到 CLOSED;如果仍然出

2021-10-26 22:00:38 445

原创 垃圾收集器总结

垃圾收集器总结常用垃圾收集器对比垃圾收集器串行/并行/并发新生代/老年代算法目标适用场景Serial串行新生代复制低延迟优先单 CPU 环境下的 Client 模式Serial Old串行老年代标记-整理低延迟优先单 CPU 环境下的 Client 模式、CMS 的后备预案Parllel Scavenge并行新生代复制吞吐量优先在后台运算而不需要太多交互的业务Parallel Old并行老年代标记-整理吞吐量优先在后台

2021-07-21 10:24:15 159

原创 根据 DAU 估算 QPS 的一般思路

根据 DAU 估算流量和容量的一般思路以 DAU = 1000w 为例:PV按照日访问量为日活的10倍计算,PV = 1000w * 10 = 1亿均值QPS均值 QPS = 访问量/时长 = 1亿/(246060) = 1160峰值 QPS峰值 QPS 按照均值的10倍预估 = 11600。考虑到静态资源流量的放大效应,按照放大10倍计算,系统峰值 QPS = 116000容量考虑高可用、异地多活等策略,容量x2,QPS = 232000未来发展按照未来半年业务增长1.5倍计算,最

2021-07-20 10:59:22 3469 2

原创 JVM 内存划分

JVM 内存划分

2021-07-14 17:28:33 138

原创 Kafka和RocketMQ的消息复制实现对比

消息队列复制基本单位复制方式可用性一致性RocketMQ(原生)Broker同时支持同步双写和异步复制不支持主从自动切换,无法保证可用性可以保证消息一致性KafkaPartition异步复制基于Zookeeper实现主从自动切换,保证高可用可通过配置 ISR 保证一致性并不存在一种完美的消息复制策略,都是在高性能、高可用和一致性之间做出权衡。...

2020-11-17 11:05:11 384

原创 缓存读写模式

缓存读写模式一. Cache Aside (旁路缓存)读操作客户端优先读取 Cache,如果 Cache miss,则 读取 DB,并且将读取到的数据回落到 Cache 中。写操作由客户端先更新 DB ,然后直接将 key 从 Cache 中删除,由 DB 来驱动缓存数据的更新。特点这种模式的特点是,由客户端处理所有数据访问细节,同时利用 Lazy 计算的思想,更新 DB 后,直接删除 Cache 并通过 DB 更新,确保数据以 DB 结果为准,可以大幅降低 Cache 和 DB

2020-09-04 16:23:24 440

原创 系统常用指标经验值(持续更新)

系统常用指标经验值(持续更新)一. 数据库相关MySQL 单实例,读写 QPS 通常只有千级别(3000~6000),经过优化的查询语句,在性能较好的机器上,读 QPS可接近 1w。MySQL 执行一次普通的查询或者修改操作,平均耗时在 10~100ms 级别。慢查询:针对用户端的查询操作,slow_query 建议设置在 1s 以内。二. 缓存相关单机 Memcached 的读写 QPS 可以达到 10w~100w 级别,读写平均耗时在 1ms 以内。单机 Redis 的读写 QPS

2020-09-04 14:16:40 1268

原创 MySQL 主从架构原理

MySQL 主从架构原理一. 主从架构基本原理上图展示的是 MySQL 的主从切换流程。在 State-1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。当需要切换的时候,就切成状态 2。这时候客户端读写访问的都是节点 B,而节点 A 是 B 的从库。在主从架构下,建议把从库设置为 Read-Only 模式,这样做有以下几个考虑:有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防

2020-08-30 11:33:51 1965

原创 MySQL的锁

MySQL的锁数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。一. 全局锁Flush tables with read lock (FTWRL)让整个库处于只读状态,所有更新操作都会被阻塞。**全局锁的典型使用场景是,做全库逻辑备份。**如果在做数据的时候不加锁,就可能出现备份的数据和原数据不一致的情况。

2020-08-16 17:56:17 250

原创 MySQL日志系统

MySQL 日志系统一. redo Logredo log 是 InnoDB 引擎特有的功能。当 MySQL 执行更新操作时,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做的。InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么整个 redo log 就可以保存 4G 的数据。red

2020-08-12 22:11:34 187

原创 MySQL整体架构

MySQL整体架构一. Server层Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接建立完成后,连接器会到权限表里面查出该客户端所拥有的权限。之后,这个连接里面所有的权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功建立连接后,即使你用管理员账

2020-08-12 15:21:03 182

原创 如何预估系统QPS

如何预估系统QPS场景举例:开屏广告,全天流量 = 12000CPM = 1200w PV根据8/2原则,80%的流量在20%的时间段内产生峰值QPS = (1200w * 0.8) / (24 * 60 * 60 * 0.2) = 760保险起见,预留20%的Buffer,因此可预估系统峰值QPS=920...

2020-06-30 09:53:03 1552 1

原创 互联网系统数据库设计军规

军规适用场景:并发量大、数据量大的互联网业务一、基础规范(1)必须使用InnoDB存储引擎解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高(2)必须使用UTF8字符集解读:万国码,无需转码,无乱码风险,节省空间(3)数据表、数据字段必须加入中文注释解读:N年后谁tm知道这个r1,r2,r3字段是干嘛的(4)禁止使用存储过程、视图、触发器、E...

2020-04-03 11:53:56 250

原创 Git精华

Git精华一. Git工作区域划分二. 本地仓库初始化#创建本地工作目录mkdir git_learn#进行git初始化cd git_learngit init三. 常用操作查看本地仓库状态git status将本地修改同步到暂存区git add eshop.txt将暂存区内容提交到本地仓库git commit -m '开始开发电商系统'四...

2020-03-21 21:20:57 183

原创 MySQL字符集与排序规则小结

MySQL字符集与排序规则小结一. 字符集utf8mb4说明MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。utf8 VS utf8mb4utf8最大字...

2020-02-24 18:09:14 142

原创 MySQL索引详解

MySQL索引详解一. 索引简介索引:帮助MySQL高效查询数据的一种有序的数据结构。如果没有索引,查询某行数据,只能进行全表扫描。这时,需要频繁地进行磁盘IO,性能很差。索引一般是一个key-value结构,key是索引值对于聚集索引(InnoDB),value是该行的所有数据对于非聚集索引(MyISAM),value是该行所在的磁盘块的指针二. 常用的索引数据结...

2019-12-28 12:25:59 1456 1

原创 MySQL权限

MySQL权限一. 用户标识用户标识= 用户名+ IP二. 用户权限相关的表mysql.user:一行记录代表一个用户标识(用户名+ip)mysql.db:一行记录代表一个数据库的权限mysql.tables_priv:一行记录代表对表的权限mysql.columns_priv:一行记录代表对某一列的权限三. 权限相关的常用命令为用户授权#为用户dev授权,允许查询ar...

2019-12-23 17:11:13 197

原创 Nginx概述

Nginx概述一. Nginx简介Nginx(发音为"engine X")是俄罗斯人编写的十分轻量级的HTTP 服务器,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名。业界一致认为它是Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响...

2019-09-12 10:35:08 288

原创 为什么HashMap的容量为2的指数

为什么HashMap的容量为2的指数一. HashMap的容量揭秘我们知道,HashMap的容量要求为2的指数(16、32、256等),默认为16。此外,HashMap也支持在构造器中指定初始容量initialCapacity,并会将容量设置为大于等于initialCapacity的最小的2的指数。HashMap会基于这个容量创建table数组:/** * The table, i...

2019-09-03 15:58:24 1343

原创 讲透ThreadLocal

讲透ThreadLocal一. 简介ThreadLocal是JDK提供的一个工具类,其作用是在多线程共享资源的情况下,使每个线程持有一份该资源的副本,每个线程的副本都是独立互不影响的。线程操作各自的副本,这样就避免了资源竞争引发的线程安全问题。二. 使用示例模拟Spring中的事务管理,每个事务与当前线程绑定,不同线程的事务之间相互独立互不影响。代码如下:public class Tra...

2019-08-30 11:16:06 215

原创 MySQL的锁

MySQL的锁一. 全局锁Flush tables with read lock (FTWRL):这个命令可以加一个全局锁,让整个数据库处于只读状态,这样所有的DDL、DML和更新事务的操作都会被阻塞。全局锁的典型使用场景,是做全库逻辑备份。让这个库只读的风险:如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就要停摆;如果在从库上备份,那么备份期间从库不能执行主库同步过来...

2019-08-07 10:42:31 126

原创 MySQL索引详解

MySQL索引详解一. 索引的作用索引的作用:提高数据查询的效率。如果没有索引,每次查询数据都需要扫描全表。二. 索引的常见模型哈希表:以key-value的形式保存数据。优点:查询速度很快 O(1)缺点:只适用于等值查询的场景,无法进行模糊查询和范围查询。有序数组优点:采用二分查找,等值查询和范围查询的效率都比较高O(logn)缺点:插入或者更新数据时,需要移动元素,...

2019-08-06 22:03:37 125

原创 事务隔离级别总结

事务隔离级别总结一. ACID特性事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失败。 事务是区分文件存储系统与Nosql数据库重要特性之一,其存在的意义是为了保证即使在并发情况下也能正确的执行CRUD操作。怎样才算是正确的呢?这时提出了事务需要保证的四个特性即ACID:A:原子性(Atomicity)一个事务中的所有操作,要么全...

2019-07-10 13:47:01 234

原创 Spring AOP VS AspectJ

Spring AOP使用简单仅支持对Spring容器管理的Bean的增强,非Spring容器管理的对象(如业务POJO等)无法被拦截仅支持对方法级别的增强,无法对成员变量、getter&setter等进行增强动态代理类在运行时生成无法直接对方法内部调用进行增强无需引入额外的依赖和插件AspectJ使用相对复杂可以对项目中所有对象进行增强可以对类的方法、成员变量...

2019-07-07 12:24:13 274

原创 理解BloomFilter

理解BloomFilter一. 产生背景很多时候,我们都有这样一个需求:判断一个元素是否存在于集合中。比如IDEA中的单词拼写检查,要判断一个用户输入的单词是否在词库中。我们轻易能想到的一个简单的解决方案,就是使用一个Hash表,将所有合法的单词都保存在Hash表中,这样写入和查询的时间复杂度都为O(1),还是很快的。但是这样做有一个问题,就是太耗费空间。而且由于Hash表的散列冲突问题,就...

2019-06-22 08:53:59 202

原创 SpringBoot整合MyBatis原理

SpringBoot整合MyBatis原理一. 自动配置SpringBoot提供了MyBatis的自动配置类MybatisAutoConfiguration,可以自动注册SqlSessionFactory、SqlSessionTemplate等组件,开发人员只需在配置文件中指定相关属性即可。@Configuration@ConditionalOnClass({ SqlSessionFact...

2019-05-25 11:26:53 4596

原创 Redis Cluster执行流程

Redis Cluster执行流程集群(cluster)是Redis提供的分布式数据库解决方案,集群通过分片(sharding)来进行数据共享,并提供数据复制(replication)和故障转移(failover)等功能。下面介绍下Cluster的执行流程。一. 启动节点Redis服务器在启动时,会根据cluster-enabled配置决定是否开启服务器的集群模式。如果未开启,就进入stan...

2019-05-22 13:46:51 1018 1

原创 基于ReadWriteLock读写锁实现的缓存

package william.pattern;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadW...

2019-05-22 10:47:24 324

原创 Redis Sentinel执行流程

Redis Sentinel执行流程Sentinel是Redis的高可用解决方案:由一个或多个Sentinel实例组成Sentinel Cluster,可以监控任意多个master服务器,及这些master下属的slave服务器。当被监视的master进入下线状态时,Sentinel Cluster会自动将其下属的slave中的一个升级为master,然后由新的master代替已下线的maste...

2019-05-21 19:33:16 495

原创 Spring的事务传播行为

Spring的事务传播行为一. 定义Spring定义了7中事务的传播行为,在TransactionDefinition类中:public interface TransactionDefinition { int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY...

2019-05-17 11:26:51 160

空空如也

空空如也

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

TA关注的人

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