- 博客(145)
- 收藏
- 关注
原创 Kafka和RocketMQ的消息复制实现对比
消息队列复制基本单位复制方式可用性一致性RocketMQ(原生)Broker同时支持同步双写和异步复制不支持主从自动切换,无法保证可用性可以保证消息一致性KafkaPartition异步复制基于Zookeeper实现主从自动切换,保证高可用可通过配置 ISR 保证一致性并不存在一种完美的消息复制策略,都是在高性能、高可用和一致性之间做出权衡。...
2020-11-17 11:05:11
494
原创 缓存读写模式
缓存读写模式一. Cache Aside (旁路缓存)读操作客户端优先读取 Cache,如果 Cache miss,则 读取 DB,并且将读取到的数据回落到 Cache 中。写操作由客户端先更新 DB ,然后直接将 key 从 Cache 中删除,由 DB 来驱动缓存数据的更新。特点这种模式的特点是,由客户端处理所有数据访问细节,同时利用 Lazy 计算的思想,更新 DB 后,直接删除 Cache 并通过 DB 更新,确保数据以 DB 结果为准,可以大幅降低 Cache 和 DB
2020-09-04 16:23:24
538
原创 系统常用指标经验值(持续更新)
系统常用指标经验值(持续更新)一. 数据库相关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
1741
原创 MySQL 主从架构原理
MySQL 主从架构原理一. 主从架构基本原理上图展示的是 MySQL 的主从切换流程。在 State-1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。当需要切换的时候,就切成状态 2。这时候客户端读写访问的都是节点 B,而节点 A 是 B 的从库。在主从架构下,建议把从库设置为 Read-Only 模式,这样做有以下几个考虑:有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防
2020-08-30 11:33:51
2105
原创 MySQL的锁
MySQL的锁数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。一. 全局锁Flush tables with read lock (FTWRL)让整个库处于只读状态,所有更新操作都会被阻塞。**全局锁的典型使用场景是,做全库逻辑备份。**如果在做数据的时候不加锁,就可能出现备份的数据和原数据不一致的情况。
2020-08-16 17:56:17
312
原创 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
239
原创 MySQL整体架构
MySQL整体架构一. Server层Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接建立完成后,连接器会到权限表里面查出该客户端所拥有的权限。之后,这个连接里面所有的权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功建立连接后,即使你用管理员账
2020-08-12 15:21:03
265
原创 如何预估系统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
1741
1
原创 互联网系统数据库设计军规
军规适用场景:并发量大、数据量大的互联网业务一、基础规范(1)必须使用InnoDB存储引擎解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高(2)必须使用UTF8字符集解读:万国码,无需转码,无乱码风险,节省空间(3)数据表、数据字段必须加入中文注释解读:N年后谁tm知道这个r1,r2,r3字段是干嘛的(4)禁止使用存储过程、视图、触发器、E...
2020-04-03 11:53:56
342
原创 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
254
原创 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
185
原创 MySQL索引详解
MySQL索引详解一. 索引简介索引:帮助MySQL高效查询数据的一种有序的数据结构。如果没有索引,查询某行数据,只能进行全表扫描。这时,需要频繁地进行磁盘IO,性能很差。索引一般是一个key-value结构,key是索引值对于聚集索引(InnoDB),value是该行的所有数据对于非聚集索引(MyISAM),value是该行所在的磁盘块的指针二. 常用的索引数据结...
2019-12-28 12:25:59
1553
1
原创 MySQL权限
MySQL权限一. 用户标识用户标识= 用户名+ IP二. 用户权限相关的表mysql.user:一行记录代表一个用户标识(用户名+ip)mysql.db:一行记录代表一个数据库的权限mysql.tables_priv:一行记录代表对表的权限mysql.columns_priv:一行记录代表对某一列的权限三. 权限相关的常用命令为用户授权#为用户dev授权,允许查询ar...
2019-12-23 17:11:13
281
原创 Nginx概述
Nginx概述一. Nginx简介Nginx(发音为"engine X")是俄罗斯人编写的十分轻量级的HTTP 服务器,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名。业界一致认为它是Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响...
2019-09-12 10:35:08
370
原创 为什么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
1462
原创 讲透ThreadLocal
讲透ThreadLocal一. 简介ThreadLocal是JDK提供的一个工具类,其作用是在多线程共享资源的情况下,使每个线程持有一份该资源的副本,每个线程的副本都是独立互不影响的。线程操作各自的副本,这样就避免了资源竞争引发的线程安全问题。二. 使用示例模拟Spring中的事务管理,每个事务与当前线程绑定,不同线程的事务之间相互独立互不影响。代码如下:public class Tra...
2019-08-30 11:16:06
278
原创 MySQL的锁
MySQL的锁一. 全局锁Flush tables with read lock (FTWRL):这个命令可以加一个全局锁,让整个数据库处于只读状态,这样所有的DDL、DML和更新事务的操作都会被阻塞。全局锁的典型使用场景,是做全库逻辑备份。让这个库只读的风险:如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就要停摆;如果在从库上备份,那么备份期间从库不能执行主库同步过来...
2019-08-07 10:42:31
177
原创 MySQL索引详解
MySQL索引详解一. 索引的作用索引的作用:提高数据查询的效率。如果没有索引,每次查询数据都需要扫描全表。二. 索引的常见模型哈希表:以key-value的形式保存数据。优点:查询速度很快 O(1)缺点:只适用于等值查询的场景,无法进行模糊查询和范围查询。有序数组优点:采用二分查找,等值查询和范围查询的效率都比较高O(logn)缺点:插入或者更新数据时,需要移动元素,...
2019-08-06 22:03:37
169
原创 事务隔离级别总结
事务隔离级别总结一. ACID特性事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失败。 事务是区分文件存储系统与Nosql数据库重要特性之一,其存在的意义是为了保证即使在并发情况下也能正确的执行CRUD操作。怎样才算是正确的呢?这时提出了事务需要保证的四个特性即ACID:A:原子性(Atomicity)一个事务中的所有操作,要么全...
2019-07-10 13:47:01
305
原创 Spring AOP VS AspectJ
Spring AOP使用简单仅支持对Spring容器管理的Bean的增强,非Spring容器管理的对象(如业务POJO等)无法被拦截仅支持对方法级别的增强,无法对成员变量、getter&setter等进行增强动态代理类在运行时生成无法直接对方法内部调用进行增强无需引入额外的依赖和插件AspectJ使用相对复杂可以对项目中所有对象进行增强可以对类的方法、成员变量...
2019-07-07 12:24:13
410
原创 理解BloomFilter
理解BloomFilter一. 产生背景很多时候,我们都有这样一个需求:判断一个元素是否存在于集合中。比如IDEA中的单词拼写检查,要判断一个用户输入的单词是否在词库中。我们轻易能想到的一个简单的解决方案,就是使用一个Hash表,将所有合法的单词都保存在Hash表中,这样写入和查询的时间复杂度都为O(1),还是很快的。但是这样做有一个问题,就是太耗费空间。而且由于Hash表的散列冲突问题,就...
2019-06-22 08:53:59
280
原创 SpringBoot整合MyBatis原理
SpringBoot整合MyBatis原理一. 自动配置SpringBoot提供了MyBatis的自动配置类MybatisAutoConfiguration,可以自动注册SqlSessionFactory、SqlSessionTemplate等组件,开发人员只需在配置文件中指定相关属性即可。@Configuration@ConditionalOnClass({ SqlSessionFact...
2019-05-25 11:26:53
4923
原创 Redis Cluster执行流程
Redis Cluster执行流程集群(cluster)是Redis提供的分布式数据库解决方案,集群通过分片(sharding)来进行数据共享,并提供数据复制(replication)和故障转移(failover)等功能。下面介绍下Cluster的执行流程。一. 启动节点Redis服务器在启动时,会根据cluster-enabled配置决定是否开启服务器的集群模式。如果未开启,就进入stan...
2019-05-22 13:46:51
1159
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
392
原创 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
617
原创 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
207
原创 Cache-Aside Pattern
Cache-Aside Pattern一. 背景和问题缓存已经成为了几乎所有应用系统的必备要素。使用缓存可以有效提高系统的读性能,相比于直接读取数据库,吞吐量有了很大的提高。但是,在实际生产环境中,很难保证缓存与数据库中数据的完全一致。程序应采取某种策略,尽可能地保证缓存中的数据是最新的,并且可以检测到缓存中数据失效,并提供相应的解决方案。简单来说,Cache-Aside Pattern的提...
2019-05-15 11:15:40
2888
1
原创 Redis集群模式(Cluster)
Redis集群模式(Cluster)一. 单master在海量数据下的瓶颈在单master的架构下,由于所有slave的数据都与master保持一致,因此Redis所能承载的数据量完全取决于master机器所在的内存。一旦出现内存不足的情况,只能进行垂直扩若,扩展性较差。采用Cluster集群架构:多master + 读写分离 + 高可用支持N个master,且每个master下都...
2019-05-14 13:33:09
477
原创 Redis哨兵机制
Redis哨兵机制一. Sentinel介绍Sentinel,中文为哨兵,是Redis集群架构中一个非常重要的组件。主要功能:集群监控:负责监控主从集群中的Master和Slave进程是否正常工作。故障转移(failover):如果Master宕机,会自动从Slave中选举出新的Master,进行主从自动切换。配置中心:如果发生了故障转移,Sentinel负责通知客户端新的Mast...
2019-05-13 15:34:17
229
原创 Redis主从架构(replication)
Redis主从架构(replication)一. Redis如何支持超过10w+的并发量单机单机Redis能够承载的QPS大概在上万到几万之间,取决于机器性能、业务操作复杂性等。理论上说,单机Redis无法支撑超过10w的并发量。读写分离对于大部分缓存系统来说,请求都是读多写少的,因此采用读写分离架构能够有效提升整体性能。读写分离采用一主多从架构,所有写请求都由Master处理...
2019-05-11 10:24:47
273
原创 Redis持久化机制详解
Redis持久化机制详解一. 持久化的意义Redis持久化的意义:主要在于故障恢复。Redis如果仅将数据完全保存在内存中,是无法应对灾难性故障的。如果Redis进程突然挂掉,保存在内存中的数据就全没了,如果没有持久化,后果不堪设想。使用持久化+定期备份(如备份到云存储上)的机制,可以在很大程度上解决Redis故障恢复的问题。这样即使Redis服务宕机,且磁盘损坏,也可以从云存储上拉取备份的...
2019-05-09 23:17:03
246
原创 Spring源码深度解析(二)
Spring源码深度解析(二)一. 主要内容BeanFactory体系设计核心接口BeanDefinition加载流程设计思想总结二. BeanFactory体系设计BeanFactory是Spring中十分重要的接口,也是Spring IOC容器的顶级接口。它基于工厂模式,定义了最基本的IOC容器的功能,如获取Bean实例、查看Bean的类型和查看Bean是否存在等:在Be...
2019-05-06 14:53:55
971
原创 Spring源码深度解析(一)
Spring源码深度解析(一)一. 主要内容:概念描述Spring整体架构及主要模块概述二. 概念描述IoC :Inversion of Control,控制反转。到底反转了什么?假设具有依赖关系的对象如果要调用A的method()方法,而method方法又依赖于B的某些处理。原生方式:A a = new A();B b = new B();a.setB(b);a...
2019-05-06 13:31:56
582
原创 MyBatis预编译机制详解
MyBatis预编译机制详解一. "#{}“和”${}"的区别"#{}"是将传入的值按照字符串的形式进行处理,如下面这条语句:select user_id,user_name from t_user where user_id = #{user_id}MyBaits会首先对其进行预编译,将#{user_ids}替换成?占位符,然后在执行时替换成实际传入的user_id值,**并在两边...
2019-04-03 11:52:58
22179
28
原创 Redis持久化机制总结
Redis持久化机制总结一. Redis持久化概述为了应对生产环境下,Redis的故障恢复和数据备份等需求,Redis提供了两种持久化机制,分别是RDB和AOF。RDB:以特定的时间间隔,保存当前数据库中的全量数据快照。AOF:以追加日志的形式,将Redis服务器的操作写入日志文件。可以不开启任何持久化方案,但是这在生产环境下就是作死。RDB和AOF可以同时启用,但是在这种情况下,R...
2019-03-29 15:24:48
312
原创 详解RocketMQ事务消息
详解RocketMQ顺序消息顺序消息是RocketMQ提供的非常重要的一个特性,在4.x版本之后开源,可以利用事务消息轻松地实现分布式事务。本文对RocketMQ的事务消息进行详细介绍,并给出了代码示例。一. 相关概念RocketMQ在其消息定义的基础上,对事务消息扩展了两个相关的概念:Half(Prepare) Message——半消息(预处理消息)半消息是一种特殊的消息类型,该状...
2019-03-27 17:54:07
7976
1
原创 Spring中Bean的创建流程
Spring中Bean的创建流程一. 核心代码BeanDefinition的解析在AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation()中:@Nullableprotected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition m...
2019-03-14 13:40:39
4525
1
原创 Spring解决循环依赖的思路
Spring解决循环依赖的思路一. 什么是循环依赖循环依赖也就是循环引用,指两个或多个对象互相持有对方的引用。通俗地说,假设在Spring中有3个Service Bean,分别为ServiceA、ServiceB和ServiceC,如果ServiceA引用了ServiceB,ServiceB引用了ServiceC,而ServiceC又引用了ServiceA,最终形成可一个环,这样就出现了循环依...
2019-03-13 12:31:36
538
原创 ZAB协议详解
ZAB协议详解一. ZAB协议概述ZAB:Zookeeper Atomic Broadcast,Zookeeper原子消息广播协议,是为Zookeeper所专门设计的一种支持崩溃恢复的原子广播协议。ZAB协议并不像Paxos算法那样是一种通用的分布式一致性算法,而是专为Zookeeper所设计的。Zookeeper主要依赖ZAB协议来实现分布式数据的一致性。基于该协议,Zookeeper实...
2019-03-12 13:52:35
1506
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人