【真·一篇就够了】网络优秀博文汇总
文章目录
- 注:部分参考《后端架构师技术图谱》
- 架构相关
- 存储
- 搜索
- 分布式相关
- 监控
- 链路跟踪
- 日志
- 队列
- 中间件
- 微服务相关
- 大数据相关
- 语言相关
- Linux系统相关
- 网络相关
- 数据结构算法相关
- 技术社区
注:部分参考《后端架构师技术图谱》
架构相关
存储
SQL
mysql
理论
- 《数据库的三大范式以及五大约束》
- 第一范式:数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;
- 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
- 第三范式:必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
- 《数据库的三大范式以及五大约束》
原理
《MySQL的InnoDB索引原理详解》
《MySQL存储引擎--MyISAM与InnoDB区别》
- 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁
《myisam和innodb索引实现的不同》
《MySQL数据库存储引擎详解》
InnoDB
- 《一篇文章带你读懂Mysql和InnoDB》
优化
《MySQL36条军规》
《MYSQL性能优化的最佳20+条经验》
《SQL优化之道》
《通过show status 来优化MySQL数据库》
《避免全表扫描的sql优化》
《mysql数据库死锁的产生原因及解决办法》
《导致索引失效的可能情况》
《MySQL 在并发场景下的问题及解决思路》
《MySQL 单表百万数据记录分页性能优化》
《MySQL 性能优化高阶神技》
《数据库分库分表》
- 《数据库分库分表常见分布式主键ID生成策略》
- 《数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示》
- 《数据库分库分表(sharding)系列(二) 全局主键生成策略》
- 《数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量》
- 《数据库分库分表(sharding)系列(四) 多数据源的事务处理》
- 《数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案》
- 《数据库Sharding的基本思想和切分策略》
《 MYSQL分页limit速度太慢优化方法》
- 原则上就是缩小扫描范围。
索引
聚集索引, 非聚集索引
《MySQL 聚集索引/非聚集索引简述》
《MyISAM和InnoDB的索引实现》
MyISAM 是非聚集,InnoDB 是聚集
复合索引
《复合索引的优点和注意事项》
文中有一处错误:
对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高; select * from table1 where col1=A AND col2=B AND col3=D 如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引
- 原文中提到索引是按照“col1,col2,col3”的顺序创建的,而mysql在按照最左前缀的索引匹配原则,且会自动优化 where 条件的顺序,当条件中只有 col2=B AND col1=A 时,会自动转化为 col1=A AND col2=B,所以依然会使用索引。
《MySQL查询where条件的顺序对查询效率的影响》
自适应哈希索引(AHI)
- 《InnoDB存储引擎——自适应哈希索引》
explain
- 《MySQL 性能优化神器 Explain 使用分析》
系列文章
- 《Mysql使用系列》
- 《MySQL存储引擎比较》
- 读写分离模式
- 《Mysql主从方案的实现》
- 《搭建MySQL主从复制经典架构》
- 《Haproxy+多台MySQL从服务器(Slave) 实现负载均衡》
- 《DRBD+Heartbeat+Mysql高可用读写分离架构》
- DRDB 进行磁盘复制,避免单点问题。
- 《MySQL Cluster 方式》
- 分片模式
- 《分库分表需要考虑的问题及方案》
- 中间件: 轻量级:sharding-jdbc、TSharding;重量级:Atlas、MyCAT、Vitess等。
- 问题:事务、Join、迁移、扩容、ID、分页等。
- 事务补偿:对数据进行对帐检查;基于日志进行比对;定期同标准数据来源进行同步等。
- 分库策略:数值范围;取模;日期等。
- 分库数量:通常 MySQL 单库 5千万条、Oracle 单库一亿条需要分库。
- 《MySql分表和表分区详解》
- 分区:是MySQL内部机制,对客户端透明,数据存储在不同文件中,表面上看是同一个表。
- 分表:物理上创建不同的表、客户端需要管理分表路由。
- 《分库分表需要考虑的问题及方案》
tidb
- 《官网网站》
- 《十问 TiDB :关于架构设计的一些思考》
- 《TiDB 新特性漫谈:从 Follower Read 说起》
NoSQL
- redis
- 数据结构详解
- 《Redis内部数据结构详解(1)——dict》
- 《Redis内部数据结构详解(2)——sds》
- 《Redis内部数据结构详解(3)——robj》
- 《Redis中为什么使用跳表》
- 《Redis源码解析系列》
- redis命令解读
- 《redis使用相关文档》
- 《Redis用法解读》
- 《为什么使用 Redis 及其产品定位》
- 《redis 持久化机制AOF/RDB详解》
- 《redis源码分析-rehash过程详解》
- 《详解Redis和Memcached》
- 《Redis 高负载下的中断优化》
- 《Redis 内存使用优化与存储》
- 《美团针对Redis Rehash机制的探索和实践》
- 《大规模 codis 集群的治理与实践》
- 《Redis常见集群方案、Codis实践及与Twemproxy比较》
- 《Redis Sentinel主从高可用方案》
- 《深入剖析 redis 数据淘汰策略》
- 《大规模 codis 集群的治理与实践》
- 数据结构详解
- leveldb
- 《Leveldb 实现原理》
- 《LevelDB原理探究与代码分析》
- 《leveldb(ssdb)性能、使用场景评估》
- rocksdb
- 《RocksDB上锁机制的实例详解》
- 《Rocksdb源码剖析一----Rocksdb概述与基本组件》
- 《RocksDB. Leveled Compaction原理分析》
- 《RocksDB系列解读》
- memcache
- 《深入Memcache内部(一)》
- 《深入Memcache内部(二)-item内存分配》
- 《Memcached分布式》
- 《Memcache调优》
- pika
- 《Pika的设计及实现》
FS
- hdfs
- 《【Hadoop学习】HDFS基本原理》
- seaweedfs
- 《分布式文件存储Seaweedfs源码剖析》
- ceph
- 《分布式存储 Ceph 介绍及原理架构》
搜索
- ES
- 《如何构建一个低成本,高可用,少运维的ES平台》
分布式相关
《分布式系统的时间》
《分布式架构知识体系》
Zookeeper
- 《ZooKeeper原理及使用》
- 《不理解Zookeeper一致性原理,谈何异地多活改造》
Etcd
- 《etcd:从应用场景到实现原理的全方位解读》
- 《Raft图解》
分布式架构
《亿级Web系统搭建——单机到分布式集群》
《Web系统大规模并发——电商秒杀与抢购》
《从单一架构到分布式交易架构,网易严选的成功实践》
《大规模网站架构的缓存机制和几何分形学》
《终于有人把“TCC分布式事务”实现原理讲明白了》
《分布式系统设计权衡之CAP》
《建高并发高可用的电商平台架构实践》
《分布式集群的负载均衡》
《一个复杂系统的拆分改造实践》
《秒杀业务架构的优化之路》
扩展性设计
- 《架构师不可不知的十大可扩展架构》
- 总结下来,通用的套路就是分布、缓存及异步处理。
- 《可扩展性设计之数据切分》
- 水平切分+垂直切分
- 利用中间件进行分片如,MySQL Proxy。
- 利用分片策略进行切分,如按照ID取模。
- 《说说如何实现可扩展性的大型网站架构》
- 分布式服务+消息队列。
- 《大型网站技术架构(七)–网站的可扩展性架构》
- 《架构师不可不知的十大可扩展架构》
CAP 与 BASE 理论
- 《从分布式一致性谈到CAP理论、BASE理论》
- 一致性分类:强一致(立即一致);弱一致(可在单位时间内实现一致,比如秒级);最终一致(弱一致的一种,一定时间内最终一致)
- CAP:一致性、可用性、分区容错性(网络故障引起)
- BASE:Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)
- BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
- 《从分布式一致性谈到CAP理论、BASE理论》
分布式锁
- 《分布式锁的几种实现方式》
- 基于数据库的分布式锁:优点:操作简单、容易理解。缺点:存在单点问题、数据库性能够开销较大、不可重入;
- 基于缓存的分布式锁:优点:非阻塞、性能好。缺点:操作不好容易造成锁无法释放的情况。
- Zookeeper 分布式锁:通过有序临时节点实现锁机制,自己对应的节点需要最小,则被认为是获得了锁。优点:集群可以透明解决单点问题,避免锁不被释放问题,同时锁可以重入。缺点:性能不如缓存方式,吞吐量会随着zk集群规模变大而下降。
- 《基于Zookeeper的分布式锁》
- 清楚的原理描述 + Java 代码示例。
- 《jedisLock—redis分布式锁实现》
- 基于 setnx(set if ont exists),有则返回false,否则返回true。并支持过期时间。
- 《Memcached 和 Redis 分布式锁方案》
- 利用 memcached 的 add(有别于set)操作,当key存在时,返回false。
- 《分布式锁的几种实现方式》
稳定性 & 高可用
- 《聊聊高并发系统之限流特技-1》
- 《聊聊高并发系统限流特技-2》
- 《高并发之服务降级与熔断》
- 《系统设计:关于高可用系统的一些技术方案》
- 可扩展:水平扩展、垂直扩展。 通过冗余部署,避免单点故障。
- 隔离:避免单一业务占用全部资源。避免业务之间的相互影响 2. 机房隔离避免单点故障。
- 解耦:降低维护成本,降低耦合风险。减少依赖,减少相互间的影响。
- 限流:滑动窗口计数法、漏桶算法、令牌桶算法等算法。遇到突发流量时,保证系统稳定。
- 降级:紧急情况下释放非核心功能的资源。牺牲非核心业务,保证核心业务的高可用。
- 熔断:异常情况超出阈值进入熔断状态,快速失败。减少不稳定的外部依赖对核心服务的影响。
- 自动化测试:通过完善的测试,减少发布引起的故障。
- 灰度发布:灰度发布是速度与安全性作为妥协,能够有效减少发布故障。
- 《关于高可用的系统》
- 设计原则:数据不丢(持久化);服务高可用(服务副本);绝对的100%高可用很难,目标是做到尽可能多的9,如99.999%(全年累计只有5分钟)。
监控
- Open-Falcon
- 《Open-Falcon使用介绍》
- Promethues
链路跟踪
- 《基于 SOFATracer + Zipkin 实现分布式链路跟踪》
- 《分布式链路跟踪组件 SOFATracer 和 Zipkin 模型转换》
日志
- ElasticSeach
- 《如何构建一个低成本,高可用,少运维的ES平台》
- 《Elasticsearch 权威指南》
- Logstash
- Kibana
- Filebeat
- 日志搜集
- 《从零开始搭建一个ELKB日志收集系统》
- 《用ELK搭建简单的日志收集分析系统》
- 《日志收集系统-探究》
队列
- Kafka
- 《kafka数据可靠性深度解读》
- 《Kafka 设计与原理详解》
- 《深入学习Kafka:Leader Election - Kafka集群Leader选举过程分析》
- Kafka系列文章
- 《Kafka设计解析(一)- Kafka背景及架构介绍》
- 《Kafka设计解析(二)- Kafka High Availability (上)》
- 《Kafka设计解析(三)- Kafka High Availability (下)》
- 《Kafka设计解析(四)- Kafka Consumer设计解析》
- 《Kafka设计解析(五)- Kafka性能测试方法及Benchmark报告》
- 《Kafka 设计解析(六):Kafka 高性能关键技术解析》
- 《Kafka 设计解析(七):流式计算的新贵 Kafka Stream》
- 《Kafka 设计解析(八):Kafka 事务机制与 Exactly Once 语义实现原理》
- 《Kafka技术内幕&Kafka权威指南读书笔记系列》
- RocketMQ
- 《RocketMQ 实战之快速入门》
- 《RocketMQ 源码解析》
- RabbitMQ
- 《RabbitMQ的应用场景以及基本原理介绍》
- 《消息队列之 RabbitMQ》
- 《RabbitMQ之消息确认机制(事务+Confirm)》
- 《RabbitMQ 的4种集群架构》
- NSQ
- MQ对比
- 《Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件》
- 《Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件》
- 《Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能》
- 《Kafka vs RocketMQ——单机系统可靠性》
中间件
Web Server
- Nginx
- 《Ngnix的基本学习-多进程和Apache的比较》
- Nginx 通过异步非阻塞的事件处理机制实现高并发。Apache 每个请求独占一个线程,非常消耗系统资源。
- 事件驱动适合于IO密集型服务(Nginx),多进程或线程适合于CPU密集型服务(Apache),所以Nginx适合做反向代理,而非web服务器使用。
- 《nginx与Apache的对比以及优缺点》
- nginx只适合静态和反向代理,不适合处理动态请求。
- 《百万并发下的Nginx优化》
- 《Nginx 中文文档》
- 《Ngnix的基本学习-多进程和Apache的比较》
- OpenResty
- 官方网站
- 《浅谈 OpenResty》
- 通过 Lua 模块可以在Nginx上进行开发。
- agentzh 的 Nginx 教程
- Tengine
- 官方网站
- Apache Httpd
- 官方网站
- Nginx
- Tomcat
- 架构原理
- Tomcat
- 《TOMCAT原理详解及请求过程》
- 《Tomcat服务器原理详解》
- 《Tomcat 系统架构与设计模式,第 1 部分: 工作原理》
- 《四张图带你了解Tomcat系统架构》
- 《JBoss vs. Tomcat: Choosing A Java Application Server》
- Tomcat 是轻量级的 Serverlet 容器,没有实现全部 JEE 特性(比如持久化和事务处理),但可以通过其他组件代替,比如Spring。
- Jboss 实现全部了JEE特性,软件开源免费、文档收费。- 调优方案
- 《TOMCAT原理详解及请求过程》
- 《Tomcat 调优方案》
- 启动NIO模式(或者APR);调整线程池;禁用AJP连接器(Nginx+tomcat的架构,不需要AJP);- 《tomcat http协议与ajp协议》
- 《AJP与HTTP比较和分析》
- AJP 协议(8009端口)用于降低和前端Server(如Apache,而且需要支持AJP协议)的连接数(前端),通过长连接提高性能。
- 并发高时,AJP协议优于HTTP协议。
- Jetty
- 《Tomcat 调优方案》
- 《Jetty 的工作原理以及与 Tomcat 的比较》
- 《jetty和tomcat优势比较》
- 架构比较:Jetty的架构比Tomcat的更为简单。
- 性能比较:Jetty和Tomcat性能方面差异不大,Jetty默认采用NIO结束在处理I/O请求上更占优势,Tomcat默认采用BIO处理I/O请求,Tomcat适合处理少数非常繁忙的链接,处理静态资源时性能较差。
- 其他方面:Jetty的应用更加快速,修改简单,对新的Servlet规范的支持较好;Tomcat 对JEE和Servlet 支持更加全面。
- 《jetty和tomcat优势比较》
- 《Jetty 的工作原理以及与 Tomcat 的比较》
微服务相关
RPC
- 《从零开始实现RPC框架 - RPC原理及实现》
- 核心角色:Server: 暴露服务的服务提供方、Client: 调用远程服务的服务消费方、Registry: 服务注册与发现的注册中心。
- 《分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较》
- 《RPCX浅析》
- 《从零开始实现RPC框架 - RPC原理及实现》
《从“被动挖光缆”到“主动剪网线”,蚂蚁金服异地多活的微服务体系》
《互联网架构,究竟为啥要做服务化?》
《微服务:从设计到部署》
大数据相关
- 《超详细的大数据学习资源推荐(上)》
- 《超详细的大数据学习资源推荐(下)》
语言相关
Golang
- 内存分配原理
- 《图解 Go 内存分配器》
- 《图解Go语言内存分配》
- 《golang 内存分配》
- 《Go语言的栈空间管理》
- 《Go 堆栈的理解》
- 《聊一聊goroutine stack》
- 《Go内存分配那些事,就这么简单》
- 《Writing a Memory Allocator》
- 《编写可维护Go语言代码建议》
- 《Go语言充电站》
- 《golang源码分析》
- 《go语言学习》
- 《Golang GC的实现原理》
- 《深入理解 Go map:赋值和扩容迁移》
- 《Golang协程的实现原理》
- 《golang的协程调度-硬核原理》
- 《Golang并发模型:轻松入门流水线模型》
- 《Goroutine并发调度模型深入之实现一个协程池》
- 《Goroutine并发调度模型深度解析之手撸一个协程池》
- 《Go优质项目推荐》
- 《Golang平滑重启》
- 《请问sync.Pool有什么缺点?》
- 《Go 1.13中 sync.Pool 是如何优化的?》
- 《 Go 可视化性能分析工具》
- 《聊聊 Go Socket 框架 Teleport 的设计思路》
- 内存分配原理
PHP
- 《PHP底层工作原理》
- 《深入PHP内核》
- 《PHP内核探索》
- 《PHP优质项目推荐》
- 《PHP底层工作原理》
Java
- 《CMS垃圾回收机制》
- 《从实际案例聊聊Java应用的GC优化》
- 《不可不说的Java“锁”事》
- 《Java开发中的23种设计模式详解》
- 《JVM调优》
- 《Java优质项目推荐》
Linux系统相关
- 《linux系列学习》
- 《linux命令系列》
- 《Linux工具快速教程》
- 《Linux select()详解》
- 《最全面的linux信号量解析》
- 《Linux 文件系统剖析》
- 《Linux中查看系统资源占用情况的命令》
- 《 深入理解Linux网络技术内幕》
网络相关
《TCP/IP学习》
OSI 七层协议
- 《OSI七层协议模型、TCP/IP四层模型学习笔记》
TCP/IP
- 《深入浅出 TCP/IP 协议》
- 《TCP协议中的三次握手和四次挥手》
HTTP
- 《http协议详解(超详细)》
HTTP2.0
- 《HTTP 2.0 原理详细分析》
- 《HTTP2.0的基本单位为二进制帧》
- 利用二进制帧负责传输。
- 多路复用。
- HTTPS
- 《https原理通俗了解》
- 《这样理解HTTPS更容易》
- 使用非对称加密协商加密算法
- 使用对称加密方式传输数据
- 使用第三方机构签发的证书,来加密公钥,用于公钥的安全传输、防止被中间人串改。
- 《八大免费SSL证书-给你的网站免费添加Https安全加密》
网络模型
- 《web优化必须了解的原理之I/o的五种模型和web的三种工作模式》
- 五种I/O模型:阻塞I/O,非阻塞I/O,I/O复用、事件(信号)驱动I/O、异步I/O,前四种I/O属于同步操作,I/O的第一阶段不同、第二阶段相同,最后的一种则属于异步操作。
- 三种 Web Server 工作方式:Prefork(多进程)、Worker方式(线程方式)、Event方式。
- 《select、poll、epoll之间的区别总结》
- select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。
- select 有打开文件描述符数量限制,默认1024(2048 for x64),100万并发,就要用1000个进程、切换开销大;poll采用链表结构,没有数量限制。
- select,poll “醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,通过回调机制节省大量CPU时间;select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,而epoll只要一次拷贝。
- poll会随着并发增加,性能逐渐下降,epoll采用红黑树结构,性能稳定,不会随着连接数增加而降低。
- 《select,poll,epoll比较 》
- 在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
- 《深入理解Java NIO》
- NIO 是一种同步非阻塞的 IO 模型。同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指线程在等待 IO 的时候,可以同时做其他任务
- 《BIO与NIO、AIO的区别》
- 《两种高效的服务器设计模型:Reactor和Proactor模型》
- 《web优化必须了解的原理之I/o的五种模型和web的三种工作模式》
Epoll
- 《epoll使用详解(精髓)》
Java NIO
- 《深入理解Java NIO》
- 《Java NIO编写Socket服务器的一个例子》
kqueue
- 《kqueue用法简介》
连接和短连接
- 《TCP/IP系列——长连接与短连接的区别》
框架
- 《Netty原理剖析》
- Reactor 模式介绍。
- Netty 是 Reactor 模式的一种实现。
- 零拷贝(Zero-copy)
- 《对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解》
- 多个物理分离的buffer,通过逻辑上合并成为一个,从而避免了数据在内存之间的拷贝。
- 序列化(二进制协议)
- 《对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解》
- 《Netty原理剖析》
Hessian
- 《Hessian原理分析》 Binary-RPC;不仅仅是序列化
Protobuf
- 《Protobuf协议的Java应用例子》 Goolge出品、占用空间和效率完胜其他序列化类库,如Hessian;需要编写 .proto 文件。
- 《Protocol Buffers序列化协议及应用》
- 关于协议的解释;缺点:可读性差;
- 《简单的使用 protobuf 和 protostuff》
- protostuff 的好处是不用写 .proto 文件,Java 对象直接就可以序列化。
- 《简单的使用 protobuf 和 protostuff》
- 《Protobuf协议的Java应用例子》 Goolge出品、占用空间和效率完胜其他序列化类库,如Hessian;需要编写 .proto 文件。
数据结构算法相关
数据结构
队列
《java队列——queue详细分析》
非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。
阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。
《LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析》
集合
- 《Java Set集合的详解》
链表、数组
- 《Java集合详解–什么是List》
字典、关联数组
- 《Java map 详解 - 用法、遍历、排序、常用API等》
栈
- 《java数据结构与算法之栈(Stack)设计与实现》
- 《Java Stack 类》
- 《java stack的详细实现分析》
- Stack 是线程安全的。
- 内部使用数组保存数据,不够时翻倍。
树
- 《二叉树》
- 每个节点最多有两个叶子节点。
- 《二叉树》
完全二叉树
- 《完全二叉树》
- 叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
平衡二叉树
左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
《浅谈数据结构-平衡二叉树》
《浅谈算法和数据结构: 八 平衡查找树之2-3树》
二叉查找树(BST)
- 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)。
- 《浅谈算法和数据结构: 七 二叉查找树》
红黑树
- 《最容易懂得红黑树》
- 添加阶段后,左旋或者右旋从而再次达到平衡。
- 《浅谈算法和数据结构: 九 平衡查找树之红黑树》
- 《最容易懂得红黑树》
B,B+,B*树
MySQL是基于B+树聚集索引组织表
《B-树,B+树,B*树详解》
《B-树,B+树与B*树的优缺点比较》
- B+树的叶子节点链表结构相比于 B-树便于扫库,和范围检索。
LSM 树
LSM(Log-Structured Merge-Trees)和 B+ 树相比,是牺牲了部分读的性能来换取写的性能(通过批量写入),实现读写之间的平衡。 Hbase、LevelDB、Tair(Long DB)、nessDB 采用 LSM 树的结构。LSM可以快速建立索引。
《LSM树 VS B+树》
B+ 树读性能好,但由于需要有序结构,当key比较分散时,磁盘寻道频繁,造成写性能较差。
LSM 是将一个大树拆分成N棵小树,先写到内存(无寻道问题,性能高),在内存中构建一颗有序小树(有序树),随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历(二分查找)所有的小树,但在每颗小树内部数据是有序的。
《LSM树(Log-Structured Merge Tree)存储引擎》
极端的说,基于LSM树实现的HBase的写性能比MySQL高了一个数量级,读性能低了一个数量级。
优化方式:Bloom filter 替代二分查找;compact 小数位大树,提高查询性能。
Hbase 中,内存中达到一定阈值后,整体flush到磁盘上、形成一个文件(B+数),HDFS不支持update操作,所以Hbase做整体flush而不是merge update。flush到磁盘上的小树,定期会合并成一个大树。
BitSet
- 经常用于大规模数据的排重检查。
- 《Java Bitset类》
- 《Java BitSet(位集)》
常用算法
《常见排序算法及对应的时间复杂度和空间复杂度》
《图解排序算法系列》
《AES加密的四种模式详解》
《B-树和B+树》
排序、查找算法
- 《常见排序算法及对应的时间复杂度和空间复杂度》
选择排序
- 《Java中的经典算法之选择排序(SelectionSort)》
- 每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。
- 《Java中的经典算法之选择排序(SelectionSort)》
冒泡排序
- 《冒泡排序的2种写法》
- 相邻元素前后交换、把最大的排到最后。
- 时间复杂度 O(n²)
- 《冒泡排序的2种写法》
插入排序
- 《排序算法总结之插入排序》
快速排序
- 《坐在马桶上看算法:快速排序》
- 一侧比另外一侧都大或小。
归并排序
- 《图解排序算法(四)之归并排序》
- 分而治之,分成小份排序,在合并(重建一个新空间进行复制)。
- 《图解排序算法(四)之归并排序》
堆排序
- 《图解排序算法(三)之堆排序》
- 排序过程就是构建最大堆的过程,最大堆:每个结点的值都大于或等于其左右孩子结点的值,堆顶元素是最大值。
- 《图解排序算法(三)之堆排序》
计数排序
- 《计数排序和桶排序》
- 和桶排序过程比较像,差别在于桶的数量。
- 《计数排序和桶排序》
桶排序
- 《【啊哈!算法】最快最简单的排序——桶排序》
- 《排序算法(三):计数排序与桶排序》
- 桶排序将[0,1)区间划分为n个相同的大小的子区间,这些子区间被称为桶。
- 每个桶单独进行排序,然后再遍历每个桶。
基数排序
- 按照个位、十位、百位、…依次来排。
- 《排序算法系列:基数排序》
- 《基数排序》
二分查找
- 《二分查找(java实现)》
- 要求待查找的序列有序。
- 时间复杂度 O(logN)。
- 《java实现二分查找-两种方式》
- while + 递归。
- 《二分查找(java实现)》
《一致性hash算法》
分布式一致性算法
PAXOS
- 《分布式系列文章——Paxos算法原理与推导》
- 《Paxos–>Fast Paxos–>Zookeeper分析》
- 《【分布式】Zookeeper与Paxos》
Zab
- 《Zab:Zookeeper 中的分布式一致性协议介绍》
Raft
- 《Raft 为什么是更易理解的分布式一致性算法》
- 三种角色:Leader(领袖)、Follower(群众)、Candidate(候选人)
- 通过随机等待的方式发出投票,得票多的获胜。
- 《Raft图解》
- 《Raft 为什么是更易理解的分布式一致性算法》
Gossip
- 《Gossip算法》
两阶段提交、多阶段提交
- 《关于分布式事务、两阶段提交协议、三阶提交协议》
技术社区
- 社区
- 《美团技术团队》
- 《Go中国》
- 《51CTO博客》
- 《CSDN》
- 《博客园》
- 《v2ex》
- 《掘金》
- 《segmentfault
- 《腾讯-云社区》
- 《Golang语言社区》
- 优秀个人博客
- 《鸟窝》
- 《Go语言充电站》
【真·一篇就够了】网络优秀博文汇总相关推荐
- 一篇就够 2023网络安全技术自学路线图及职业选择方向
一篇就够 | 2023网络安全技术自学路线图及职业选择方向 每天都有新闻报道描述着新技术对人们的生活和工作方式带来的巨大乃至压倒性影响.与此同时有关网络攻击和数据泄露的头条新闻也是日益频繁. 攻击者可 ...
- 2020优秀博文集合
前言 本文是一个优秀博文汇总,有时候看到好的文章,放在浏览器的收藏夹里,很容易就吃灰了,所以,我把一些我本年看到的值得我学习的文章汇总到此,方便制定学习计划,也方便后续回顾 文章汇总 JAVA安全 本 ...
- 深度好文:云网络丢包故障定位,看这一篇就够了~
深度好文:云网络丢包故障定位,看这一篇就够了~ https://mp.weixin.qq.com/s/-Q1AkxUr9xzGKwUMV-FQhQ Alex 高效运维 今天 来源:本文经授权转自公众号 ...
- 网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!
本文中文译文由作者"ably.io"发布于公众号"高可用架构",译文原题:<深入解读HTTP3的原理及应用>.英文原题:<HTTP/3 dee ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- 干货 | 目标检测入门,看这篇就够了(下)
作者 | 李家丞( 同济大学数学系本科在读,现格灵深瞳算法部实习生) 近年来,深度学习模型逐渐取代传统机器视觉方法而成为目标检测领域的主流算法,本系列文章将回顾早期的经典工作,并对较新的趋势做一个全景 ...
- 1盒子刷Armbian,看这一篇就够了——Armbian全方位安装指导书
N1盒子刷Armbian,看这一篇就够了--Armbian全方位安装指导书 2020-03-30 19:04:11 72点赞 715收藏 122评论 创作立场声明:一个写完之后很累很累的年轻人 追加修 ...
- 干货!学习 Python 看这篇管够!!!
文 | 潮汐 来源:Python 技术「ID: pythonall」 写在前面 各位朋友们大家好,时间飞逝,转眼咱们公众号运营 2 年了,这两年感谢各位忠实粉丝的陪伴,让我们能更有动力继续前行,也希望 ...
- 学习MyBatis3这一篇就够了
目录 第一章 MyBatis3概述 1.1.概述 1.2.特点 1.3.对比 1.4.官网 1.5.下载 第二章 MyBatis3的增删改查 2.1.环境准备 2.2.创建工程 2.3.导入依赖 2. ...
最新文章
- 手机的秘密--按几个键就知道
- FPGA逻辑设计回顾(6)多比特信号的CDC处理方式之异步FIFO
- Eclipse中clean项目的作用
- java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...
- 两种极端情况的案例:N+1次查询和笛卡尔积
- 配置silverlight 2的开发环境
- 图灵测试是什么?为什么AlphaGo那么牛却过不了?
- 多维数组怎么降维_从零开始的机器学习实用指南(八):降维
- 【spark】Spark通过ClickHouse-Native-JDBC写入Clickhouse
- 北大计算机科学与技术怎么样,国内高校计算机科学与技术学科排名,浙大表现亮眼,北大荣登榜首...
- Kossel 升级记 - 速度、速度还是速度
- JAVA程序员,你读过这些书吗?
- 学JAVA需要学数据结构吗?选择哪版数据结构教程合适?
- 如何在苹果Mac上保存终端命令?
- python 学生编程--3 多彩同心圆
- html实现下载功能(两种方式)
- PS颜色模式及修图工具
- 重装后显示计算机无法联网,重装系统后电脑无法连接网络怎么办
- 微信文件夹的dat文件怎么打开_微信dat文件如何打开?
- 车载PHY的唤醒与睡眠的正确姿势