02 2020 档案

摘要:该文章为阅读笔记,原地址 https://time.geekbang.org/column/article/7581 我把这样的网络协议学习过程总结为:一看觉得懂,一问就打鼓,一用就糊涂。 第一,我会从身边经常见到的事情出发,用故事来讲解各种网络协议,然后慢慢扩展到不熟悉的领域。 第二,我会用贴近场 阅读全文
posted @ 2020-02-28 11:58 lakeslove 阅读(157) 评论(0) 推荐(0)
摘要:只讲众多排序算法中的一小撮,也是最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。 阅读全文
posted @ 2020-02-16 16:01 lakeslove 阅读(147) 评论(0) 推荐(0)
摘要:写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。 阅读全文
posted @ 2020-02-16 14:35 lakeslove 阅读(119) 评论(0) 推荐(0)
摘要:当队满时,(tail+1)%n=head。 public class CircularQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head表示队头下标,tail表示队尾下标 private int 阅读全文
posted @ 2020-02-16 12:22 lakeslove 阅读(120) 评论(0) 推荐(0)
摘要:栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。 阅读全文
posted @ 2020-02-16 11:33 lakeslove 阅读(117) 评论(0) 推荐(0)
摘要:package com.example.demo1; public class MyList<T> { private int count = 0; private Node<T> firstNode = null; private Node<T> lastNode = null; public N 阅读全文
posted @ 2020-02-16 11:03 lakeslove 阅读(149) 评论(0) 推荐(0)
摘要:我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法。 缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。 常见的策略有三种: 先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Freq 阅读全文
posted @ 2020-02-15 21:35 lakeslove 阅读(171) 评论(0) 推荐(0)
摘要:第二个是连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。 很多时候我们并不是要去死记硬背某个数据结构或者算法,而 阅读全文
posted @ 2020-02-15 20:38 lakeslove 阅读(111) 评论(0) 推荐(0)
摘要:最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)。 阅读全文
posted @ 2020-02-15 19:28 lakeslove 阅读(230) 评论(0) 推荐(0)
摘要:大 O 这种复杂度表示方法只是表示一种变化趋势。我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。所以,我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。这段核心代码执行次数的 n 的量级,就是整段要分析代码的时间复杂度。 加法 阅读全文
posted @ 2020-02-15 19:03 lakeslove 阅读(180) 评论(0) 推荐(0)
摘要:基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。 那技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等,当然还有数据结构和算法。 作为业务开发,我们会用到各种框架、中间 阅读全文
posted @ 2020-02-15 18:34 lakeslove 阅读(170) 评论(0) 推荐(0)
摘要:05 | 白话容器基础(一):从进程说开去 Linux Cgroups 就是 Linux 内核中用来为进程设置资源限制的一个重要功能。 一个正在运行的 Docker 容器,其实就是一个启用了多个 Linux Namespace 的应用进程,而这个进程能够使用的资源量,则受 Cgroups 配置的限制 阅读全文
posted @ 2020-02-15 16:50 lakeslove 阅读(538) 评论(0) 推荐(0)
摘要:Kubernetes 项目已然成为容器技术的事实标准,重新定义了基础设施领域对应用编排与管理的种种可能。 这些关于 Linux 内核、分布式系统、网络、存储等方方面面的积累,并不会在 Docker 或者 Kubernetes 的文档中交代清楚。可偏偏就是它们,才是真正掌握容器技术体系的精髓所在,是每 阅读全文
posted @ 2020-02-14 14:11 lakeslove 阅读(191) 评论(0) 推荐(0)
摘要:2017年3月第一版 本书共370页 一共三部分,合计6章 书中围绕基本概念、指令集体系结构、处理器组成和能效、存储与外设、处理器级并行等5个核心问题展开 我应该看的是1、2、3、6章,4、5章可以略过 阅读全文
posted @ 2020-02-13 21:45 lakeslove 阅读(222) 评论(0) 推荐(0)
摘要:在软件工程中,不存在像“银弹”这样可以解决一切问题的设计、架构或软件,每一个软件系统,它都是独一无二的,你不可能用一套方法去解决所有的问题。 我们就是那种对消息队列功能和性能都没有很高的要求,所以选择RabbitMQ。 不管选择哪种消息队列其中还有个很关键的因素,团队里面有人能hold它,最起码熟悉 阅读全文
posted @ 2020-02-10 18:30 lakeslove 阅读(172) 评论(0) 推荐(0)
摘要:对于对于这 5 个步骤来说,能否决定秒杀成功,实际上只有风险控制和库存锁定这 2 个步骤。只要用户的秒杀请求通过风险控制,并在服务端完成库存锁定,就可以给用户返回秒杀结果了,对于后续的生成订单、短信通知和更新统计数据等步骤,并不一定要在秒杀请求中处理完成。 对于超时的请求可以直接丢弃,APP 将超时 阅读全文
posted @ 2020-02-10 16:28 lakeslove 阅读(174) 评论(0) 推荐(0)
摘要:在使用消息队列的过程中,你会遇到很多问题,比如选择哪款消息队列更适合你的业务系统?如何保证系统的高可靠、高可用和高性能?如何保证消息不重复、不丢失?如何做到水平扩展?诸如此类的问题,每一个问题想要解决好,都不太容易。 总结起来,通过这次系列课程的学习,你可以达成三个成就: 成为消息队列领域的“技术高 阅读全文
posted @ 2020-02-10 15:33 lakeslove 阅读(321) 评论(0) 推荐(0)
摘要:从整体上看,数据库分了主库和从库,数据也被切分到多个数据库节点上。但随着并发的增加,存储数据量的增多,数据库的磁盘 IO 逐渐成了系统的瓶颈,我们需要一种访问更快的组件来降低请求响应时间,提升整体系统性能。这时我们就会使用缓存。 缓存的不足 首先,缓存比较适合于读多写少的业务场景,并且数据最好带有一 阅读全文
posted @ 2020-02-10 13:25 lakeslove 阅读(509) 评论(0) 推荐(0)
摘要:建议你搭建发号器服务来生成全局唯一的 ID。 怎么不用UUID? 因为在系统设计时,ID 有可能成为排序的字段。 ID 有序也会提升数据的写入性能。 不能作为 ID 的另一个原因是它不具备业务含义 最后,UUID 是由 32 个 16 进制数字组成的字符串,如果作为数据库主键使用比较耗费空间。 Sn 阅读全文
posted @ 2020-02-09 20:12 lakeslove 阅读(507) 评论(0) 推荐(0)
摘要:数据库的写入请求量大造成的性能和可用性方面的问题,要解决这些问题,你所采取的措施就是对数据进行分片。这样可以很好地分摊数据库的读写压力,也可以突破单机的存储瓶颈,而常见的一种方式是对数据库做“分库分表”。 数据库分库分表的方式有两种:一种是垂直拆分,另一种是水平拆分。这两种方式,在我看来,掌握拆分方 阅读全文
posted @ 2020-02-09 17:17 lakeslove 阅读(393) 评论(0) 推荐(0)
摘要:依据一些云厂商的 Benchmark 的结果,在 4 核 8G 的机器上运 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS 那么你可能会说,是不是我无限制地增加从库的数量就可以抵抗大量的并发呢?实际上并不是的。因为随着从库数量增加,从库连接上来的 IO 线程比较 阅读全文
posted @ 2020-02-09 16:51 lakeslove 阅读(263) 评论(0) 推荐(0)
摘要:一般在线上我建议最小连接数控制在 10 左右,最大连接数控制在 20~30 左右即可。 阅读全文
posted @ 2020-02-09 16:22 lakeslove 阅读(354) 评论(0) 推荐(0)
摘要:高可扩展性的设计思路 拆分是提升系统扩展性最重要的一个思路,它会把庞杂的系统拆分成独立的,有单一职责的模块。相对于大系统来说,考虑一个一个小模块的扩展性当然会简单一些。将复杂的问题简单化,这就是我们的思路。 其实就是微服务 系统的易扩展之从存储和业务拆分来考虑。业务拆分是容易理解的,专人专事;从存储 阅读全文
posted @ 2020-02-09 15:45 lakeslove 阅读(446) 评论(0) 推荐(0)
摘要:提到互联网系统设计,你可能听到最多的词儿就是“三高”,也就是“高并发”“高性能”“高可用”,它们是互联网系统架构设计永恒的主题。 阅读全文
posted @ 2020-02-09 15:08 lakeslove 阅读(407) 评论(0) 推荐(0)
摘要:那我们要如何做呢?参照阿里发布的《阿里巴巴 Java 开发手册 v1.4.0(详尽版)》,我们可以将原先的三层架构细化成下面的样子: 我来解释一下这个分层架构中的每一层的作用。 分层架构的不足: 最主要的一个缺陷就是增加了代码的复杂度。 单一职责原则规定每个类只有单一的功能,在这里可以引申为每一层拥 阅读全文
posted @ 2020-02-09 09:41 lakeslove 阅读(337) 评论(0) 推荐(0)
摘要:归根结底一句话:高并发系统的演进应该是循序渐进,以解决系统中存在的问题为目的和驱动力的。 martin fowler好像曾经说过,能使用单体解决的问题,就不要采用分布式。不能为了技术而技术,采用分布式固然可以分流用户请求,提高系统的响应能力,但同样也带来了复杂性。软件开发最终的目的是商业利益。非常赞 阅读全文
posted @ 2020-02-08 17:33 lakeslove 阅读(512) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-02-08 13:24 lakeslove 阅读(316) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-02-06 19:18 lakeslove 阅读(170) 评论(0) 推荐(0)
摘要:主从有MS结构和双M结构 双M结构用serverId来判断是否自己的binlog,解决死循环问题。 阅读全文
posted @ 2020-02-05 20:01 lakeslove 阅读(120) 评论(0) 推荐(0)
摘要:bin_log的写入机制 binlog 的写入逻辑比较简单: 事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。 一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。 这就涉及到了 bi 阅读全文
posted @ 2020-02-05 19:14 lakeslove 阅读(187) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-02-05 17:54 lakeslove 阅读(92) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-02-05 17:27 lakeslove 阅读(88) 评论(0) 推荐(0)
摘要:这章没怎么搞明白 mysql有间隙锁, 带索引的好像只锁一个范围,但是不带索引的会锁这个表,没怎么搞明白,待研究。 阅读全文
posted @ 2020-02-05 13:01 lakeslove 阅读(103) 评论(0) 推荐(0)
摘要:你看到了,session A 先用 start transaction with consistent snapshot 命令启动了一个事务,之后 session B 才开始执行 update 语句。session B 执行完 100 万次 update 语句后,id=1 这一行处于什么状态呢?你可 阅读全文
posted @ 2020-02-05 10:34 lakeslove 阅读(117) 评论(0) 推荐(0)
摘要:对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。 mysql> select count(*) from tradelog where month(t_modified)=7; 这条语句需要走全索引扫描 select * from tradelog where id 阅读全文
posted @ 2020-02-03 19:21 lakeslove 阅读(147) 评论(0) 推荐(0)
摘要:select word from words order by rand() limit 3; 这条语句会扫描2count(*)+3行,执行如下:这里用到了内存临时表 set tmp_table_size=1024; set sort_buffer_size=32768; set max_lengt 阅读全文
posted @ 2020-02-03 17:03 lakeslove 阅读(157) 评论(0) 推荐(0)
摘要:MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。 select city,name,age from t where city='杭州' order by name limit 1000 ; 通常情况下,这个语句执行流程如下所示 : 初始化 sort_buffer,确定放 阅读全文
posted @ 2020-02-02 15:08 lakeslove 阅读(145) 评论(0) 推荐(0)
摘要:崩溃恢复时的判断规则。 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交; 如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:a. 如果是,则提交事务;b. 否则,回滚事务。 阅读全文
posted @ 2020-02-01 14:14 lakeslove 阅读(130) 评论(0) 推荐(0)
摘要:对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。 InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。所以,普通索引树比主键索引树小很多。 对于 count(*) 这样的操作,遍 阅读全文
posted @ 2020-02-01 12:51 lakeslove 阅读(488) 评论(0) 推荐(0)
摘要:delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。 也就是说,通过 delete 命令是不能回收表空间的。 这些可以复用,而没有被使用的空间,看起来就像是“空洞”。 不止是删除数据会造成空洞,插入数据也会。如果数据是按照索引递增顺序插入的,那么索引是紧 阅读全文
posted @ 2020-02-01 12:32 lakeslove 阅读(238) 评论(0) 推荐(0)