西维蜀黍

🐒 Software engineer | 📷Photographer | 👹Urban explorer

  • 主页
  • 所有文章
Tag Friends

西维蜀黍

🐒 Software engineer | 📷Photographer | 👹Urban explorer

  • 主页
  • 所有文章

【Distributed System】消息队列(Message Queue)

2019-07-10

什么是消息队列(Message Queue)

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。

另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3…对于消费者就会按照1,2,3…的顺序来消费。但是偶尔也会出现消息被消费的顺序不对的情况,比如某个消息消费失败又或者一个 queue 多个consumer 也会导致消息被消费的顺序不对,我们一定要保证消息被消费的顺序正确。

除了上面说的消息消费顺序的问题,使用消息队列,我们还要考虑如何保证消息不被重复消费?如何保证消息的可靠性传输(如何处理消息丢失的问题)?等等问题。所以说使用消息队列也不是十全十美的,使用它也会让系统可用性降低、复杂度提高,另外需要我们保障一致性等问题。

为什么要用消息队列

使用消息队列主要有两点好处:

  • 通过异步处理提高系统性能(削峰、减少响应所需时间);
  • 降低系统耦合性。

1 异步处理提高系统性能

image-20190710130350394

如上图,在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。

例子 1 - 削峰

通过以上分析我们可以得出消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。

举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:

image-20190710130430420

因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。

因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。

例子 2 - 减少响应所需时间

我们通过实际案例说明:假设A系统接收一个请求,需要在自己本地写库执行SQL,然后需要调用BCD三个系统的接口。

假设自己本地写库要3ms,调用BCD三个系统分别要300ms、450ms、200ms。

那么最终请求总延时是3 + 300 + 450 + 200 = 953ms,接近1s,可能用户会感觉太慢了。

此时整个系统大概是这样的:

img

但是一旦使用了MQ之后,系统A只需要发送3条消息到MQ中的3个消息队列,然后就返回给用户了。

假设发送消息到MQ中耗时20ms,那么用户感知到这个接口的耗时仅仅是20 + 3 = 23ms,用户几乎无感知,倍儿爽!

此时整个系统结构大概是这样的:

img

可以看到,通过MQ的异步功能,可以大大提高接口的性能。

2 降低系统耦合性

我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。

我们最常见的事件驱动架构(Event-driven architecture)类似生产者消费者模式,在大型网站中通常用利用消息队列实现事件驱动结构

消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。

消息接受者对消息进行过滤、处理、包装后,构造成一个新的消息类型,将消息继续发送出去,等待其他消息接受者订阅该消息。因此基于事件(消息对象)驱动的业务架构可以是一系列流程。

另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息。

备注: 不要认为消息队列只能利用发布-订阅模式工作,只不过在解耦这个特定业务环境下是使用发布-订阅模式的。除了发布-订阅模式,还有点对点订阅模式(一个消息只有一个消费者),我们比较常用的是发布-订阅模式。 另外,这两种消息模型是 JMS 提供的,AMQP 协议还提供了 5 种消息模型。

使用消息队列带来的一些问题

系统可用性降低

系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!

系统复杂性提高

加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!

保证MQ消息不丢失?

使用了MQ之后,还要关心消息丢失的问题。这里我们挑RabbitMQ来说明一下吧。

生产者弄丢了数据

RabbitMQ生产者将数据发送到rabbitmq的时候,可能数据在网络传输中搞丢了,这个时候RabbitMQ收不到消息,消息就丢了。

RabbitMQ提供了两种方式来解决这个问题:

事务方式:

在生产者发送消息之前,通过channel.txSelect开启一个事务,接着发送消息

如果消息没有成功被RabbitMQ接收到,生产者会收到异常,此时就可以进行事务回滚channel.txRollback然后重新发送。假如RabbitMQ收到了这个消息,就可以提交事务channel.txCommit。

但是这样一来,生产者的吞吐量和性能都会降低很多,现在一般不这么干。

另外一种方式就是通过confirm机制:

这个confirm模式是在生产者哪里设置的,就是每次写消息的时候会分配一个唯一的id,然后RabbitMQ收到之后会回传一个ack,告诉生产者这个消息ok了。

如果rabbitmq没有处理到这个消息,那么就回调一个nack的接口,这个时候生产者就可以重发。

事务机制和cnofirm机制最大的不同在于事务机制是同步的,提交一个事务之后会阻塞在那儿

但是confirm机制是异步的,发送一个消息之后就可以发送下一个消息,然后那个消息rabbitmq接收了之后会异步回调你一个接口通知你这个消息接收到了。

所以一般在生产者这块避免数据丢失,都是用confirm机制的。

Rabbitmq弄丢了数据

RabbitMQ集群也会弄丢消息,这个问题在官方文档的教程中也提到过,就是说在消息发送到RabbitMQ之后,默认是没有落地磁盘的,万一RabbitMQ宕机了,这个时候消息就丢失了。

所以为了解决这个问题,RabbitMQ提供了一个持久化的机制,消息写入之后会持久化到磁盘

这样哪怕是宕机了,恢复之后也会自动恢复之前存储的数据,这样的机制可以确保消息不会丢失。

设置持久化有两个步骤:

  • 第一个是创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里的数据
  • 第二个是发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的,此时rabbitmq就会将消息持久化到磁盘上去。

但是这样一来可能会有人说:万一消息发送到RabbitMQ之后,还没来得及持久化到磁盘就挂掉了,数据也丢失了,怎么办?

对于这个问题,其实是配合上面的confirm机制一起来保证的,就是在消息持久化到磁盘之后才会给生产者发送ack消息。

万一真的遇到了那种极端的情况,生产者是可以感知到的,此时生产者可以通过重试发送消息给别的RabbitMQ节点

消费端弄丢了数据

RabbitMQ消费端弄丢了数据的情况是这样的:在消费消息的时候,刚拿到消息,结果进程挂了,这个时候RabbitMQ就会认为你已经消费成功了,这条数据就丢了。

对于这个问题,要先说明一下RabbitMQ消费消息的机制:在消费者收到消息的时候,会发送一个ack给RabbitMQ,告诉RabbitMQ这条消息被消费到了,这样RabbitMQ就会把消息删除。

但是默认情况下这个发送ack的操作是自动提交的,也就是说消费者一收到这个消息就会自动返回ack给RabbitMQ,所以会出现丢消息的问题。

所以针对这个问题的解决方案就是:关闭RabbitMQ消费者的自动提交ack,在消费者处理完这条消息之后再手动提交ack。

这样即使遇到了上面的情况,RabbitMQ也不会把这条消息删除,会在你程序重启之后,重新下发这条消息过来。

一致性问题

本来好好的,A系统调用BC系统接口,如果BC系统出错了,会抛出异常,返回给A系统让A系统知道,这样的话就可以做回滚操作了

但是使用了MQ之后,A系统发送完消息就完事了,认为成功了。而刚好C系统写数据库的时候失败了,但是A认为C已经成功了?这样一来数据就不一致了。

JMS VS AMQP

JMS

JMS(Java Message Service,Java 消息服务)是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。

JMS(Java Message Service,Java 消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

ActiveMQ 就是基于 JMS 规范实现的。

JMS两种消息模型

点到点(P2P)模型

image-20190710130810923

使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:我们生产者发送100条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。)

发布/订阅(Pub/Sub)模型

发布订阅模型(Pub/Sub) 使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。

AMQP

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制。

RabbitMQ 就是基于 AMQP 协议实现的。

JMS 与 AMQP 对比

对比方向 JMS AMQP
定义 Java API 协议
跨语言 否 是
跨平台 否 是
支持消息类型 提供两种消息模型:Peer-2-Peer; Pub/sub 提供了五种消息模型:①direct exchange;②fanout exchange;③topic change;④headers exchange;⑤system exchange。本质来讲,后四种和JMS的pub/sub模型没有太大差别,仅是在路由机制上做了更详细的划分;
支持消息类型 支持多种消息类型 ,我们在上面提到过 byte[](二进制)

总结:

  • AMQP 为消息定义了线路层(wire-level protocol)的协议,而JMS所定义的是API规范。在 Java 体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差。而AMQP天然具有跨平台、跨语言特性。
  • JMS 支持TextMessage、MapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。
  • 由于Exchange 提供的路由算法,AMQP可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

常见的消息队列对比

对比方向 概要
吞吐量 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。
可用性 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
时效性 RabbitMQ 基于erlang开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。其他三个都是 ms 级。
功能支持 除了 Kafka,其他三个功能都较为完备。 Kafka 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准
消息丢失 ActiveMQ 和 RabbitMQ 丢失的可能性非常低, RocketMQ 和 Kafka 理论上不会丢失。

总结:

  • ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很慢,不推荐使用。
  • RabbitMQ 在吞吐量方面虽然稍逊于 Kafka 和 RocketMQ ,但是由于它基于 erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 erlang 开发,所以国内很少有公司有实力做erlang源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这四种消息队列中,RabbitMQ 一定是你的首选。如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
  • RocketMQ 阿里出品,Java 系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。RocketMQ 社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准 JMS 规范走的有些系统要迁移需要修改大量代码。还有就是阿里出台的技术,你得做好这个技术万一被抛弃,社区黄掉的风险,那如果你们公司有技术实力我觉得用RocketMQ 挺好的
  • Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。

RabbitMQ

是阿里开源的消息中间件,目前已经捐献个Apache基金会,它是由Java语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,经历过双11的洗礼,实力不容小觑。
优点:

  • 单机支持 1 万以上持久化队列
  • RocketMQ 的所有消息都是持久化的,先写入系统 pagecache(页高速缓冲存储器),然后刷盘,可以保证内存与磁盘都有一份数据,访问时,直接从内存读取。
  • 模型简单,接口易用(JMS 的接口很多场合并不太实用)
  • 性能非常好,可以大量堆积消息在broker(集群中包含一个或多个服务器,这些服务器被称为broker)中;
  • 支持多种消费,包括集群消费、广播消费等。
  • 各个环节分布式扩展设计,主从HA(高可用性集群);
  • 开发度较活跃,版本更新很快。

缺点:

  • 支持的客户端语言不多,目前是java及c++,其中c++不成熟;
  • RocketMQ社区关注度及成熟度也不及前两者;
  • 没有web管理界面,提供了一个CLI(命令行界面)管理工具带来查询、管理和诊断各种问题;
  • 没有在 mq 核心中去实现JMS等接口;

常见应用场景

  1. 邮箱发送:用户注册后投递消息到rabbitmq中,由消息的消费方异步的发送邮件,提升系统响应速度
  2. 流量削峰:一般在秒杀活动中应用广泛,秒杀会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。用于控制活动人数,将超过此一定阀值的订单直接丢弃。缓解短时间的高流量压垮应用。
  3. 订单超时:利用rabbitmq的延迟队列,可以很简单的实现订单超时的功能,比如用户在下单后30分钟未支付取消订单

ActiveMQ

RocketMQ

Kafka

如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。

Reference

新手也能看懂,消息队列其实很简单 - https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650122907&idx=1&sn=99ec2c658ec8164dc73f18b25e3e5525&chksm=f36bb7bac41c3eac17b3fd6428ca5ac292faf8d4d4d7b2128bc3b566d6b59a0c28ae56632bbe&scene=21#wechat_redirect

  • 《大型网站技术架构》
  • 《Java工程师面试突击第1季-中华石杉老师》
  • 90%的Java程序员,都扛不住这波消息中间件的面试四连炮! - https://zhuanlan.zhihu.com/p/72728396
  • Distributed System
  • DistributedSystem

扫一扫,分享到微信

【Operating System】死锁(deadlock)
【Distributed System】Dubbo 入门
© 2020 西维蜀黍
  • Tag
  • Friends

tag:

  • Algorithm Problem
  • AWS
  • Algorithm
  • Architectural Pattern
  • Architecture
  • ArchitectureDesign
  • Nginx
  • Frontend
  • Cache
  • Browser
  • C#
  • Debug
  • Visual Studio
  • Cache System
  • Compile
  • Data Structure
  • JavaScript
  • Data Format
  • Database
  • Design Pattern
  • Distributed System
  • Microservices
  • Django
  • Redis
  • Docker
  • ELK
  • Format
  • Git
  • Version Control
  • Golang
  • HTTP
  • Network
  • Hardware
  • Interview
  • JQuery
  • Java EE
  • Software Testing
  • Java
  • Network Programming
  • LaTeX
  • Linux
  • Operating System
  • Linxu
  • Lock
  • macOS
  • Markdown
  • Lucene
  • Mattermost
  • MySQL
  • Netwok
  • Netwrok
  • Node.js
  • nvm
  • NPM
  • npm
  • OOP
  • OpenWrt
  • Operating Systems
  • Performancede
  • Performance
  • Programming
  • Protobuf
  • Python
  • RaspbeeryPi
  • Codis
  • SQL
  • Regular Expression
  • Security
  • Spring
  • TypeScript
  • VMware
  • Vmware
  • Windows
  • WordPress
  • VPN
  • hexo
  • ZooKeeper
  • iOS
  • hugo

    缺失模块。
    1、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    2、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: true
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 【Microservices】Service Mesh(服务网格)

    2020-08-22

    #Microservices

  • 【Golang】性能分析 - 监控Golang程序的垃圾回收

    2020-08-22

    #Golang

  • 【Golang】性能分析 - PProf

    2020-08-15

    #Golang

  • 【Linux】命令-date

    2020-08-09

    #Linux

  • 【Python】Python3 的时间

    2020-08-09

    #Python

  • 【Python】Log Framework - logging

    2020-08-09

    #Python

  • 【hugo】使用

    2020-08-09

    #hugo

  • 【Python】Django - Django Shell

    2020-08-09

    #Python

  • 【Python】安装Python

    2020-08-06

    #Python

  • 【Python】升级Python版本

    2020-08-06

    #Python

  • 【Golang】关键字 - defer

    2020-08-02

    #Golang

  • 【Golang】初始化(Intialization)

    2020-08-02

    #Golang

  • 【Golang】类型-string

    2020-08-02

    #Golang

  • 【Golang】文档

    2020-08-02

    #Golang

  • 【Golang】编译 - 交叉编译(Cross Compilation)

    2020-08-02

    #Golang

  • 【Golang】关键字 - const

    2020-08-02

    #Golang

  • 【Protobuf】Protocol Buffers 性能

    2020-07-31

    #Protobuf

  • 【Protobuf】Protocol Buffers Demo

    2020-07-31

    #Protobuf

  • 【Golang】位运算

    2020-07-31

    #Golang

  • 【Protobuf】Protocol Buffers Convention Guide

    2020-07-29

    #Protobuf

  • 【Protobuf】Protocol Buffers 深入

    2020-07-28

    #Protobuf

  • 【Linux】命令-nohup命令

    2020-07-28

    #Linux

  • 【Microservices】服务调用

    2020-07-26

    #Microservices

  • 【Microservices】常见服务注册/发现实现框架

    2020-07-26

    #Microservices

  • 【VPN】Terminal 运行 Cisco AnyConnect VPN

    2020-07-26

    #VPN

  • 【Microservices】微服务 - 服务注册(Service Registry)和服务发现(Service Discovery)

    2020-07-26

    #Microservices

  • 【ZooKeeper】学习

    2020-07-25

    #ZooKeeper

  • 【ZooKeeper】安装

    2020-07-25

    #ZooKeeper

  • 【Java】安装

    2020-07-25

    #Java

  • 【Redis】Codis 安装

    2020-07-25

    #Cache System#Redis#Codis

  • 【Golang】Golang 安装

    2020-07-23

    #Golang

  • 【Performance】Prometheus - Exporter - Redis Exporter

    2020-07-23

    #Performancede

  • 【Performance】Prometheus 深入

    2020-07-23

    #Performance

  • 【Linux】安装 oh-my-zsh

    2020-07-23

    #Linux

  • 【Performance】Promethues - Exporter

    2020-07-22

    #Performance

  • 【Performance】Prometheus - Node Exporter

    2020-07-22

    #Performance

  • 【Performance】Prometheus 初入

    2020-07-22

    #Performance

  • 【Performance】Grafana 学习

    2020-07-22

    #Performance

  • 【Software Testing】App 自动化测试框架 - Appium

    2020-07-15

    #Software Testing

  • 【Software Testing】App 自动化测试框架

    2020-07-15

    #Software Testing

  • 【Protobuf】Protocol Buffers 2中使用map

    2020-07-12

    #Protobuf

  • 【Cache System】Redis Cluster

    2020-07-10

    #Cache System#Redis

  • 【Cache System】Redis 集群方案

    2020-07-10

    #Cache System#Redis

  • 【Redis】Codis Pipeline

    2020-07-10

    #Cache System#Redis#Codis

  • 【Mattermost】webhook

    2020-07-09

    #Mattermost

  • 【ELK】ELK(Elasticsearch+Logstash+Kibana)学习

    2020-07-07

    #ELK

  • 【Lucene】Lucene 语法

    2020-07-06

    #Lucene

  • 【MySQL】将执行结果输出到文件

    2020-07-06

    #MySQL

  • 【Golang】通过私有库安装依赖

    2020-07-06

    #Golang

  • 【Golang】生成随机数

    2020-07-06

    #Golang

  • 【Git】忽略已经提交的文件

    2020-07-06

    #Git

  • 【Golang】gvm - Golang 版本管理

    2020-07-06

    #Golang

  • 【Golang】代码检查

    2020-07-06

    #Golang

  • 【Golang】幽灵变量(Shadowed Variables)

    2020-07-06

    #Golang

  • 【OpenWrt】OpenWrt学习

    2020-07-03

    #OpenWrt

  • 【Network】路由(Route)

    2020-06-27

    #Network

  • 【macOS】移除默认输入法

    2020-06-27

    #macOS

  • 【Network】NAT

    2020-06-27

    #Network

  • 【Vmware】安装 VMware EXSI 6.7

    2020-06-27

    #Vmware

  • 【OpenWrt】查看 CPU 温度

    2020-06-21

    #OpenWrt

  • 【Network】tcpdump 抓包

    2020-06-20

    #Network

  • 【Linux】修改 MAC 地址

    2020-06-20

    #Linux

  • 【Linux】查看网络信息

    2020-06-20

    #Linux

  • 【Linux】查看网络接口(Network Interface)

    2020-06-20

    #Linux

  • 【OpenWrt】MacOS 下红米路由器 AC2100 刷 OpenWrt

    2020-06-20

    #OpenWrt

  • 【Golang】Golang 遍历 map 时 key 随机化问题

    2020-06-14

    #Golang

  • 【hexo】使用 node 14 运行 hexo 报错

    2020-06-13

    #hexo

  • 【Linux】Oh-my-zsh 启动慢

    2020-06-13

    #Linux

  • 【Linux】查看当前所有进程

    2020-06-13

    #Linux

  • 【Linux】shell 和 shell 脚本的执行

    2020-06-13

    #Linux

  • 【Linux】Shell 和 Bash

    2020-06-13

    #Linux

  • 【Linux】bash 和 zsh 的启动脚本(.zshrc,.bash_profile,~/.profile 等区别)

    2020-06-13

    #Linux

  • 【Golang】go-redis Redis 连接库学习

    2020-05-24

    #Golang

  • 【Redis】Wireshark 分析 Redis 通讯

    2020-05-24

    #Redis

  • 【Docker】Docker Compose

    2020-05-24

    #Docker

  • 【macOS】brew 使用

    2020-05-24

    #macOS

  • 【Docker】Docker 常用命令

    2020-05-23

    #Docker

  • 【Redis】Codis

    2020-05-12

    #Cache System#Redis#Codis

  • 【Redis】Redis pipeline

    2020-05-09

    #Redis

  • 【Redis】Redis 性能分析 Insight

    2020-05-09

    #Redis

  • 【Redis】Redis 性能测试(redis-benchmark)

    2020-05-09

    #Redis

  • 【Redis】Redis High-availability

    2020-05-07

    #Redis

  • 【Redis】Redis 持久化(Persistence)

    2020-05-07

    #Redis

  • 【Redis】Redis 事务(Transaction)

    2020-05-07

    #Redis

  • 【Redis】Redis Key长度与性能

    2020-05-07

    #Redis

  • 【Linux】Crontab

    2020-05-05

    #Linux

  • 【WordPress】使用Docker创建WordPress 实例

    2020-05-05

    #WordPress

  • 【AWS】AWS CLI - s3 使用

    2020-05-05

    #AWS

  • 【Compile】交叉编译(Cross compiler)

    2020-05-05

    #Compile

  • 【Linux】Ubuntu安装Docker

    2020-05-01

    #Linux

  • 【Linux】shell变量

    2020-04-26

    #Linux

  • 【Linux】makefile

    2020-04-25

    #Linux

  • 【MySQL】Out of range value for column

    2020-04-25

    #MySQL

  • 【Architecture】连接池(Connection Pool)

    2020-04-21

    #Architecture

  • 【MySQL】Too many connections

    2020-04-21

    #MySQL

  • 【Redis】查看连接信息

    2020-04-21

    #Redis

  • 【Redis】设置密码

    2020-04-21

    #Redis

  • 【Linux】iostat - 查看IO实时监控

    2020-04-21

    #Linux

  • 【MySQL】学习

    2020-04-12

    #MySQL

  • 【Architecture】架构学习

    2020-04-11

    #Architecture

  • 【Distributed System】无服务器(Serverless)

    2020-04-11

    #Distributed System

  • 【Network】网络测速工具 - iperf3

    2020-04-11

    #Network

  • 【Golang】JSON序列化与反序列化

    2020-03-30

    #Golang

  • 【MySQL】用户和权限管理

    2020-03-29

    #MySQL

  • 【MySQL】MySQL安全性设置

    2020-03-29

    #MySQL

  • 【MySQL】查看log

    2020-03-29

    #MySQL

  • 【MySQL】Establishing a Database Connection

    2020-03-29

    #MySQL

  • 【Golang】Set实现

    2020-03-22

    #Golang

  • 【Golang】go-redis 连接Redis

    2020-03-22

    #Golang

  • 【Netwok】通过反向代理实现内网穿透

    2020-03-22

    #Netwok

  • 【Golang】内置函数

    2020-03-15

    #Golang

  • 【Golang】数据类型

    2020-03-15

    #Golang

  • 【Golang】循环

    2020-03-15

    #Golang

  • 【Golang】异常处理

    2020-03-15

    #Golang

  • 【Golang】静态数组(Array)和切片(slices)

    2020-03-15

    #Golang

  • 【Golang】函数

    2020-03-15

    #Golang

  • 【Golang】模块管理与引用

    2020-03-15

    #Golang

  • 【Golang】变量

    2020-03-15

    #Golang

  • 【Golang】枚举(enumeration)

    2020-03-15

    #Golang

  • 【Golang】变量访问域

    2020-03-15

    #Golang

  • 【Golang】map

    2020-03-15

    #Golang

  • 【Golang】struct

    2020-03-15

    #Golang

  • 【Golang】interface 和 interface{} 类型

    2020-03-15

    #Golang

  • 【Golang】类型转换 - 类型断言(Type Assertion)和强制类型转换

    2020-03-15

    #Golang

  • 【Hardware】ID 卡和 IC 卡

    2020-02-09

    #Hardware

  • 【MySQL】数据类型

    2020-01-31

    #MySQL

  • 【MySQL】MySQL 中的各种数据类型转换

    2020-01-31

    #MySQL

  • 【MySQL】命名习惯

    2020-01-31

    #MySQL

  • 【Golang】Golang 命令

    2020-01-30

    #Golang

  • 【Golang】指针(Pointers)

    2020-01-30

    #Golang

  • 【Golang】类型转换 - 获取变量类型

    2020-01-30

    #Golang

  • 【Linux】CentOS 安装Docker

    2020-01-30

    #Linux

  • 【Protobuf】Protocol Buffers 入门

    2020-01-29

    #Protobuf

  • 【Golang】上传文件

    2020-01-29

    #Golang

  • 【Raspbeery Pi】树莓派玩耍

    2020-01-29

    #RaspbeeryPi

  • 【Network】电信光猫内网穿透

    2020-01-29

    #Network

  • 【Golang】Golang 使用 UUID

    2020-01-12

    #Golang

  • 【Golang】Golang 的环境变量

    2020-01-12

    #Golang

  • 【Golang】Golang 依赖管理 - go module

    2020-01-12

    #Golang

  • 【Golang】Golang 使用 gRPC

    2020-01-12

    #Golang

  • 【Golang】Golang 连接 MySQL

    2020-01-12

    #Golang

  • 【Golang】修改代码后自动重新编译并启动

    2020-01-12

    #Golang

  • 【Golang】使用 gorm(ORM 框架)

    2020-01-12

    #Golang

  • 【Golang】Web Framework - Gin 使用

    2020-01-12

    #Golang

  • 【Golang】Print

    2020-01-12

    #Golang

  • 【Format】csv

    2020-01-12

    #Format

  • 【Software Testing】Postman 深入

    2019-12-09

    #Software Testing

  • 【Linux】资源使用问题排查

    2019-12-09

    #Linux

  • 【Python】显示对象的所有 Attribute

    2019-12-06

    #Python

  • 【Python】print

    2019-12-01

    #Python

  • 【Python】断言(assert)

    2019-12-01

    #Python

  • 【WordPress】修改站点域名

    2019-12-01

    #WordPress

  • 【Python】常见错误

    2019-11-28

    #Python

  • 【SQL】select for update

    2019-11-26

    #SQL

  • 【Python】Basics - 特殊变量(Special Variables)

    2019-11-26

    #Python

  • 【Python】魔术方法(Magic Methods)

    2019-11-24

    #Python

  • 【Python】import 问题排查

    2019-11-23

    #Python

  • 【Python】pytest - 运行错误

    2019-11-18

    #Python

  • 【Python】 单元测试框架 - pytest

    2019-11-18

    #Python

  • 【Django】Django ORM - 文档整理

    2019-11-17

    #Django

  • 【Django】Django ORM - 性能优化

    2019-11-17

    #Django

  • 【Django】Django ORM - 使 DB Schema 生效

    2019-11-17

    #Django

  • 【Django】使用 Template

    2019-11-17

    #Django

  • 【MySQL】日志记录

    2019-11-17

    #MySQL

  • 【Python】枚举

    2019-11-17

    #Python

  • 【Python】is 和 ==

    2019-11-16

    #Python

  • 【Django】Django 静态资源和 HTML 文件管理

    2019-11-13

    #Django

  • 【Architectural Pattern】前端框架中的 MVC、MVP 和 MVVM

    2019-11-10

    #Architectural Pattern

  • 【Distributed System】分布式 session(Distributed Seesion)

    2019-11-10

    #Distributed System

  • 【hexo】使用 AWS s3 作为 hexo 图库

    2019-11-10

    #hexo

  • 【JQuery】获取对象

    2019-11-10

    #JQuery

  • 【Python】闭包和匿名函数

    2019-11-10

    #Python

  • 【Python】装饰器(Wrapper)

    2019-11-10

    #Python

  • 【Django】Django 路由规则

    2019-11-10

    #Django

  • 【Django】Django 创建 Django 项目或应用

    2019-11-10

    #Django

  • 【Django】template - 插入 Python 代码

    2019-11-10

    #Django

  • 【Django】Django ORM - QuerySet 序列化

    2019-11-10

    #Django

  • 【Django】Django ORM - 查询数据

    2019-11-10

    #Django

  • 【Django】Django ORM - CRUD

    2019-11-10

    #Django

  • 【Django】Django ORM - Define Model

    2019-11-10

    #Django

  • 【macOS】清除 DNS 缓存

    2019-11-06

    #macOS

  • 【Django】错误汇总

    2019-11-05

    #Django

  • 【Python】前缀

    2019-11-04

    #Python

  • 【MySQL】MySQL 错误记录

    2019-11-04

    #MySQL

  • 【Python】Comprehensions

    2019-11-01

    #Python

  • 【Python】Python 一切皆对象

    2019-11-01

    #Python

  • 【Python】I/O - 输入

    2019-11-01

    #Python

  • 【Python】Basics - Built-in Function(内置函数)

    2019-11-01

    #Python

  • 【Python】String

    2019-11-01

    #Python

  • 【Python】Collection - dict

    2019-11-01

    #Python

  • 【Python】Collection - list

    2019-11-01

    #Python

  • 【Python】Python Style Guide

    2019-11-01

    #Python

  • 【JavaEE】Java Servlet和 JSP(JavaServer Pages)

    2019-11-01

    #Java EE

  • 【Database】聚集索引(Clustered Index)与非聚集索引(Non-clustered Index)

    2019-10-31

    #Database

  • 【Django】通过 ORM 访问 MySQL,插入 Emoji 报错

    2019-10-31

    #Django

  • 【MySQL】MySQL 的存储引擎(Storage Engines)- MyISAM 与 InnoDB

    2019-10-31

    #MySQL

  • 【Django】Django 项目部署到 uWSGI + Nginx 作为生产环境

    2019-10-28

    #Nginx#Django

  • 【HTTP】Web Server(Web 服务器)、Web Application Server(Web 应用服务器)和 CGI(Common Gateway Interface)的故事

    2019-10-28

    #HTTP#Network

  • 【Python】WSGI(Web Server Gateway Interface)、uWSGI Server、uwsgi、WSGI Application 的故事

    2019-10-28

    #Python

  • 【Python】Error Handling

    2019-10-28

    #Python

  • 【Architecture】Design - Error Handling

    2019-10-28

    #Architecture#ArchitectureDesign

  • 【Architecture】Design - Database Schema Design

    2019-10-28

    #Architecture#ArchitectureDesign

  • 【Architecture】Design - API Design

    2019-10-28

    #Architecture#ArchitectureDesign

  • 【Django】Django 使用 Redis

    2019-10-28

    #Django#Redis

  • 【Redis】自动过期

    2019-10-28

    #Redis

  • 【Python】变量作用域

    2019-10-27

    #Python

  • 【Redis】Redis 操作

    2019-10-27

    #Redis

  • 【Redis】安装 Redis

    2019-10-27

    #Redis

  • 【Python】PyCharm 中的 import 问题

    2019-10-27

    #Python

  • 【Python】Basics - 函数返回值

    2019-10-27

    #Python

  • 【Python】Exception

    2019-10-20

    #Python

  • 【Django】Error - Django : Table doesn't exist

    2019-10-20

    #Django

  • 【Python】import

    2019-10-20

    #Python

  • 【Django】Django 读写 Cookie

    2019-10-20

    #Django

  • 【HTTP】Cookie

    2019-10-20

    #HTTP

  • 【Python】Collection - set

    2019-10-20

    #Python

  • 【Python】Basics - 函数参数

    2019-10-20

    #Python

  • 【Django】Django Form

    2019-10-20

    #Django

  • 【SQL】清空表数据后如何让自增 ID 从 1 开始

    2019-10-20

    #MySQL#SQL

  • 【MySQL】ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key

    2019-10-20

    #MySQL

  • 【Django】Django 中的时间获取与相关问题

    2019-10-19

    #Django

  • 【Django】Django Shell

    2019-10-19

    #Django

  • 【Software Testing】Postman 中的 Cookies 设置

    2019-10-19

    #Software Testing

  • 【Nginx】MacOS 下安装 Nginx

    2019-10-19

    #Nginx#macOS

  • 【Node.js】 使用 nvm 管理本地 Node.js 版本

    2019-10-19

    #Node.js#nvm

  • 【Django】处理 PUT 和 DELETE 方法

    2019-10-08

    #Django

  • 【Python】杂 - virtualenv 管理 Python 项目依赖

    2019-10-08

    #Python

  • 【Python】Django - 连接 MySQL

    2019-10-08

    #Django

  • 【Python】杂 - 通过 pyenv 快速切换当前系统 Python 版本

    2019-10-06

    #Python

  • 【Python】杂 - macOS 下设置 Python 默认版本

    2019-10-06

    #Python

  • 【Python】API - 时间表示

    2019-10-06

    #Python

  • 【MySQL】MySQL 8 + macOS 错误:Authentication plugin 'caching_sha2_password' cannot be loaded

    2019-10-06

    #MySQL

  • 【Python】I/O - 异步 I/O

    2019-09-24

    #Python

  • 【Python】线程 - ThreadLocal

    2019-09-24

    #Python

  • 【Python】Basics - 类

    2019-09-23

    #Python

  • 【Python】线程 - 锁

    2019-09-23

    #Python

  • 【Python】线程 - 多线程(Multithreading)

    2019-09-23

    #Python

  • 【Python】线程 - 多进程

    2019-09-23

    #Python

  • 【Linux】命令 - cut命令

    2019-09-17

    #Linux

  • 【Linux】Shell/Bash - 多命令执行、管道(pipeline)和重定向(redirection)

    2019-09-17

    #Linux

  • 【Linux】命令 - grep 命令

    2019-09-16

    #Linux

  • 【HTTP】RESTful

    2019-08-26

    #HTTP

  • 【HTTP】HTTP 请求方法(Methods)

    2019-08-26

    #HTTP

  • 【SQL】约束(Constraints)

    2019-08-22

    #SQL

  • 【SQL】常用 SQL 语句

    2019-08-22

    #SQL

  • 【Network】IPv4 地址

    2019-08-21

    #Network

  • 【Algorithm】算法思想 - 二分法(Binary Search)

    2019-08-16

    #Algorithm

  • 【Markdown】Markdown 使用中 HTML

    2019-08-15

    #Markdown

  • 【Java】运算符 - 乘法除法问题

    2019-08-14

    #Java

  • 【Java】源码 - BitSet

    2019-08-14

    #Java

  • 【Algorithm】动态规划 - 背包问题

    2019-08-13

    #Algorithm

  • 【Linxu】磁盘管理

    2019-08-08

    #Linxu

  • 【Python】协程(Coroutine)

    2019-08-08

    #Python

  • 【Python】Python 的单线程

    2019-08-06

    #Python

  • 【Python】Python 几种常用的测试框架

    2019-08-06

    #Python

  • 【Architecture】高并发

    2019-08-06

    #Architecture

  • 【Architecture】中台概念

    2019-08-06

    #Architecture

  • 【Algorithm】算法思想 - 分治算法(Divide and Conquer)

    2019-08-05

    #Algorithm

  • 【Algorithm】算法思想 - 贪心算法(Greedy Algorithm)

    2019-08-05

    #Algorithm

  • 【Algorithm】排序算法 - 计数排序(Counting Sort)

    2019-08-05

    #Algorithm

  • 【Architecture】系统架构考虑

    2019-08-05

    #Architecture

  • 【Distributed System】微服务 - Kubernetes 初步

    2019-08-04

    #Microservices

  • 【Distributed System】SOA 与 MicroServices

    2019-08-04

    #Distributed System#Microservices

  • 【Docker】减小 Docker 镜像体积

    2019-08-04

    #Docker

  • 【Performance】 性能指标(Performance Indicator)

    2019-08-04

    #Performance

  • 【Java】集合类 - PriorityQueue类(优先队列)

    2019-08-02

    #Java

  • 【Linux】命令 - sed命令

    2019-08-02

    #Linux

  • 【Linux】命令 - lsof 命令

    2019-08-01

    #Linux

  • 【Distributed System】云计算(Cloud Computing)

    2019-08-01

    #Distributed System

  • 【Data Structure】树 - 平衡二叉搜索树 - 有了二叉查找树、AVL 树为啥还需要红黑树?

    2019-08-01

    #Data Structure

  • 【Distributed System】消息队列-RabbitMQ

    2019-08-01

    #Distributed System

  • 【Microservices】微服务(Microservice Architecture)

    2019-07-31

    #Microservices

  • 【Spring】Spring 框架

    2019-07-31

    #Spring

  • 【Database】读写分离(Read/Write Splitting)

    2019-07-31

    #Database

  • 【Data Structure】优先队列(Priority Queue)

    2019-07-31

    #Data Structure

  • 【Algorithm】排序算法 - 桶排序(Bucket Sort)

    2019-07-30

    #Algorithm

  • 【Algorithm】TopK 问题

    2019-07-30

    #Algorithm

  • 【Java】I/O - 读取数据

    2019-07-30

    #Java

  • 【Algorithm】排序算法 - 堆排序(Heap Sort)

    2019-07-30

    #Algorithm

  • 【Data Structure】堆(Heap)/ 二叉堆(binary heap)

    2019-07-29

    #Data Structure

  • 【Algorithm】算法思想 - 动态规划(Dynamic Programming)

    2019-07-29

    #Algorithm

  • 【Algorithm】递归(Recursion)

    2019-07-29

    #Algorithm

  • 【Algorithm】BigNum 原理

    2019-07-29

    #Algorithm

  • 【Algorithm】算法的时间复杂度(Time complexity)

    2019-07-27

    #Algorithm

  • 【Distributed System】负载均衡(Load balancing)

    2019-07-26

    #Distributed System

  • 【Algorithm】排序算法 - 归并排序(Merge Sort)

    2019-07-25

    #Algorithm

  • 【Netwrok】输入一个 URL 会发生什么

    2019-07-24

    #Netwrok

  • 【LaTeX】支持中文

    2019-07-24

    #LaTeX

  • 【Operating System】进程 - Linux启动进程的几种方式

    2019-07-18

    #Linux#Operating Systems

  • 【Java】集合类 - LinkedHashMap

    2019-07-16

    #Java

  • 【Operating System】LRU(Least Recently Used)算法

    2019-07-15

    #Algorithm#Operating System

  • 【Network】HTTP 常用响应码

    2019-07-15

    #HTTP#Network

  • 【Database】分库分表

    2019-07-12

    #Database

  • 【Distributed System】柔性事务(Flexible Transactions)

    2019-07-12

    #Distributed System

  • 【Distributed System】一致性哈希(Consistent Hashing)

    2019-07-12

    #Distributed System

  • 【Distributed System】分布式事务(Distributed Transaction)

    2019-07-12

    #Distributed System

  • 【Java】锁 - Lock 接口

    2019-07-12

    #Java

  • 【Java】Java关键字 - synchronized关键字中的锁状态

    2019-07-12

    #Java

  • 【Lock】独享锁(Exclusive Lock) VS 共享锁(Shared Lock)

    2019-07-12

    #Java#Lock

  • 【Distributed System】分布式锁(Distributed Lock)

    2019-07-11

    #Distributed System

  • 【Distributed System】分布式系统

    2019-07-11

    #Distributed System

  • 【Operating System】I/O - 零拷贝(Zero-copy)

    2019-07-11

    #Operating System

  • 【Java】JVM - Java内存模型中的缓存一致性(Cache Coherency)问题

    2019-07-11

    #Java

  • 【Java】Netty入门

    2019-07-10

    #Java#Network Programming

  • 【Regular Expression】正则表达式(Regular Expression)

    2019-07-10

    #Regular Expression

  • 【Java EE】Jetty入门

    2019-07-10

    #Java EE

  • 【Operating System】死锁(deadlock)

    2019-07-10

    #Operating System

  • 【Distributed System】消息队列(Message Queue)

    2019-07-10

    #Distributed System

  • 【Distributed System】Dubbo 入门

    2019-07-10

    #Microservices

  • 【Java】值传递与引用传递

    2019-07-10

    #Java

  • 【Linux】统计某文件/文件夹个数

    2019-07-10

    #Linux

  • 【Database】数据库连接池

    2019-07-09

    #Database

  • 【Operating System】I/O - 磁盘I/O相关概念

    2019-07-09

    #Operating System

  • 【Cache System】缓存穿透(Cache Penetration)、缓存雪崩(Cache Avalanche)与缓存击穿(Cache Breakdown)

    2019-07-08

    #Cache System

  • 【Algorithm】海量数据处理 - 布隆过滤器(Bloom Filter)

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理 - 位图(Bitmap)

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理 - MapReduce

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理 - hash映射再取模 + hashmap统计 + 排序

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理

    2019-07-05

    #Algorithm

  • 【Algorithm Problem】海量数据处理 - 10亿int型数,统计只出现一次的数

    2019-07-05

    #Algorithm Problem

  • 【Security】Web安全

    2019-07-04

    #Security

  • 【OOP】什么是多态

    2019-07-03

    #OOP

  • 【Java】基本数据类型 - 基本数据类型的类型转换

    2019-06-28

    #Java

  • 【Java】基本数据类型 - Java支持的8种基本数据类型

    2019-06-28

    #Java

  • 【Algorithm】计算斐波纳契数(Fibonacci Number)

    2019-06-27

    #Algorithm

  • 【Algorithm】排序算法 - 希尔排序(Shell Sort)

    2019-06-26

    #Algorithm

  • 【Algorithm】排序算法 - 插入排序(Insertion Sort)

    2019-06-25

    #Algorithm

  • 【Algorithm】排序(Sorting)算法

    2019-06-25

    #Algorithm

  • 【Algorithm】排序算法 - 冒泡排序(Bubble Sort)

    2019-06-25

    #Algorithm

  • 【Algorithm】排序算法 - 快速排序(Quick Sort)

    2019-06-25

    #Algorithm

  • 【Interview】应聘者提问

    2019-06-19

    #Interview

  • 【Network】Shadowsocks总结

    2019-06-19

    #Network

  • 【Data Structure】图(Graph) - 图的物理存储

    2019-06-14

    #Data Structure

  • 【Data Structure】图(Graph) - 图的深度优先搜索(Depth First Search)

    2019-06-14

    #Data Structure

  • 【Data Structure】多叉搜索树 - Trie树(字典树)

    2019-06-13

    #Data Structure

  • 【Database】数据库索引(Index)

    2019-06-10

    #Database

  • 【Database】数据库索引为什么使用 B+ 树

    2019-06-10

    #Database

  • 【Data Structure】多路平衡查找树 - B+ 树(B+ Tree)

    2019-06-05

    #Data Structure

  • 【Data Structure】多路平衡查找树 - B树(B-Tree)

    2019-06-04

    #Data Structure

  • 【Data Structure】多路平衡查找树 - 2-3 查找树和 2-4 查找树

    2019-06-04

    #Data Structure

  • 【Algorithm】查找算法

    2019-06-03

    #Algorithm

  • 【Network】Charles 为什么可以获取 HTTPS 包内容

    2019-05-31

    #Network

  • 【Data Structure】哈希表(Hash table)

    2019-05-30

    #Data Structure

  • 【Data Structure】常用数据结构的时间复杂度

    2019-05-30

    #Data Structure

  • 【Data Structure】哈夫曼树(Huffman Tree)

    2019-05-30

    #Data Structure

  • 【Data Structure】平衡二叉搜索树 - 红黑树(Red-Black Tree)

    2019-05-30

    #Data Structure

  • 【Data Structure】平衡二叉搜索树 - AVL树

    2019-05-30

    #Data Structure

  • 【Data Structure】自平衡二叉搜索树(Self-balancing Binary Search Tree)

    2019-05-29

    #Data Structure

  • 【Data Structure】二叉搜索树(Binary Search Tree)

    2019-05-29

    #Data Structure

  • 【Data Structure】线索二叉树(Threaded Binary Tree)

    2019-05-28

    #Data Structure

  • 【Data Structure】二叉树的遍历(Traversal)

    2019-05-27

    #Data Structure

  • 【Data Structure】二叉树(Binary Tree)

    2019-05-27

    #Data Structure

  • 【Network】OpenWrt的路由器ssh访问

    2019-05-27

    #Network

  • 【Data Structure】广义表

    2019-05-24

    #Data Structure

  • 【Data Structure】矩阵

    2019-05-24

    #Data Structure

  • 【Data Structure】树(Tree)

    2019-05-24

    #Data Structure

  • 【Algorithm】字符串匹配算法 - 朴素的字符串匹配算法(Naive String Matching Algorithm)

    2019-05-23

    #Algorithm

  • 【Algorithm】字符串匹配算法 - KMP 算法

    2019-05-22

    #Algorithm

  • 【Data Structure】串(String)

    2019-05-21

    #Data Structure

  • 【Data Structure】队列(Queue)

    2019-05-21

    #Data Structure

  • 【Data Structure】栈的应用

    2019-05-17

    #Data Structure

  • 【Java】集合类-Stack

    2019-05-16

    #Java

  • 【Data Structure】栈(Stack)

    2019-05-16

    #Data Structure

  • 【Java】运算符-位运算符

    2019-05-16

    #Java

  • 【Data Structure】循环链表(Circular Linked List)

    2019-05-16

    #Data Structure

  • 【Data Structure】双向链表(Doubly Linked List)

    2019-05-16

    #Data Structure

  • 【Java】集合类 - LinkedList

    2019-05-16

    #Java

  • 【Data Structure】链表(Linked List)

    2019-05-16

    #Data Structure

  • 【Java】集合类 - ArrayList

    2019-05-15

    #Java

  • 【Data Structure】顺序表

    2019-05-15

    #Data Structure

  • 【Algorithm】什么是算法(Algorithm)

    2019-05-15

    #Algorithm

  • 【Data Structure】什么是数据结构

    2019-05-14

    #Data Structure

  • 【Data Structure】线性表(Linear List)

    2019-05-14

    #Data Structure

  • 【Data Structure】图(Graph)

    2019-05-14

    #Data Structure

  • 【Algorithm Problem】统计文章中每个单词出现的次数

    2019-05-14

    #Algorithm Problem

  • 【Algorithm】排序算法 - 选择排序(Selection Sort)

    2019-05-14

    #Algorithm

  • 【Algorithm】查找算法(Search) - 二分搜索算法(Binary Search)

    2019-05-13

    #Algorithm

  • 【Security】Wireshake抓包分析HTTPS

    2019-05-13

    #Security

  • 【Security】HTTPS

    2019-05-13

    #Security

  • 【Security】安全的HTTP的演化

    2019-05-13

    #Security

  • 【Security】密码学基础

    2019-05-13

    #Security

  • 【Network】HTTP协议的演变

    2019-05-08

    #HTTP#Network

  • 【Network】IP 协议(网际协议)

    2019-05-08

    #Network

  • 【Network】UDP

    2019-05-08

    #Network

  • 【Network】TCP/IP

    2019-05-08

    #Network

  • 【Network】TCP 的拥塞控制(Congestion Handling)

    2019-05-08

    #Network

  • 【Network】TCP 的流量控制(Traffic Control) - 滑动窗口(Sliding Window)

    2019-05-07

    #Network

  • 【Network】TCP 为什么是三次握手,而不是两次或四次?

    2019-05-06

    #Network

  • 【Network】TCP 四次挥手(TCP Four-way Wavehand)

    2019-05-06

    #Network

  • 【Network】Wireshark 抓包学习TCP通讯

    2019-05-03

    #Network

  • 【Network】TCP(Transmission Control Protocol)

    2019-05-03

    #Network

  • 【Network】TCP 三次握手(TCP Three-way Handshake)

    2019-05-03

    #Network

  • 【Design Pattern】结构类模式 — 装饰器模式(Decorator Pattern)

    2019-04-09

    #Design Pattern

  • 【Spring】Spring中的IoC

    2019-04-08

    #Spring

  • 【Spring】面向切面编程(AOP) 与Spring

    2019-04-08

    #Spring

  • 【Design Pattern】结构类模式 —- 代理模式(Proxy Pattern)

    2019-04-05

    #Design Pattern

  • 【Java】泛型(Generics)

    2019-04-02

    #Java

  • 【Java】Java对象的生命周期

    2019-04-02

    #Java

  • 【Java】Java关键字-transient关键字

    2019-04-02

    #Java

  • 【Java】反射(Reflection)

    2019-04-02

    #Java

  • 【Java】instanceof关键字与 isInstance方法

    2019-04-01

    #Java

  • 【Java】类的访问修饰符(Access Qualifier)

    2019-04-01

    #Java

  • 【Java】Java中的引用与如何避免OutOfMemory

    2019-04-01

    #Java

  • 【Java】内部类(Inner Class)

    2019-04-01

    #Java

  • 【Java】Java关键字-static 关键字

    2019-04-01

    #Java

  • 【Java】抽象类(Abstract Class)与接口(Interface)

    2019-04-01

    #Java

  • 【OOP】重写(Overriding)与重载(Overloading)

    2019-04-01

    #OOP

  • 【Java】类(Class)与继承(Inheritance)

    2019-03-29

    #Java

  • 【Java】访问修饰符(Access Modifier)

    2019-03-29

    #Java

  • 【Java】Java 动态代理(Dynamic Proxy)

    2019-03-28

    #Java

  • 【Java】对象的序列化(Serialization)与反序列化(Deserialization)

    2019-03-28

    #Java

  • 【Java】枚举Enum

    2019-03-27

    #Java

  • 【Java】枚举实现单例模式

    2019-03-26

    #Java

  • 【Java】同步容器与线程安全问题

    2019-03-26

    #Java

  • 【Java】String - String.intern()方法

    2019-03-26

    #Java

  • 【Java】垃圾回收 - 分代垃圾回收

    2019-03-26

    #Java

  • 【Java】对象的内存分配 - 垃圾回收过程

    2019-03-26

    #Java

  • 【Java】垃圾收集(Garbage Collection)

    2019-03-26

    #Java

  • 【Java】Java关键字-final关键字

    2019-03-19

    #Java

  • 【Java】集合类 - 并发容器(Concurrent Container)

    2019-03-18

    #Java

  • 【Java】集合类 - CopyOnWriteArrayList

    2019-03-18

    #Java

  • 【Java】hashCode()

    2019-03-18

    #Java

  • 【Java】集合类 - ConcurrentHashMap

    2019-03-18

    #Java

  • 【Java】集合类-Map

    2019-03-18

    #Java

  • 【Java】集合类-遍历Map对象的几种方式

    2019-03-18

    #Java

  • 【Java】集合类-集合框架

    2019-03-15

    #Java

  • 【Java】集合类-Set

    2019-03-15

    #Java

  • 【Java】集合类-List

    2019-03-15

    #Java

  • 【Java】集合类-Iterable接口的Fail-Fast机制

    2019-03-15

    #Java

  • 【Java】集合类 - HashSet

    2019-03-15

    #Java

  • 【Java】集合类-Queue

    2019-03-15

    #Java

  • 【Java】集合类-TreeSet

    2019-03-15

    #Java

  • 【Java】集合类-HashMap的并发问题

    2019-03-14

    #Java

  • 【Java】集合类 - HashMap

    2019-03-14

    #Java

  • 【Java】集合类-Collection接口的三种遍历方法

    2019-03-14

    #Java

  • 【Java】集合类-HashSet、HashMap 和 HashTable

    2019-03-13

    #Java

  • 【Java】==与equals()

    2019-03-12

    #Java

  • 【Java】String - String,StringBuilder 和 StringBuffer

    2019-03-11

    #Java

  • 【Java】装箱(Boxing)与拆箱(Unboxing)

    2019-03-11

    #Java

  • 【Java】String - String 类和常量池

    2019-03-11

    #Java

  • 【Java】多线程-Callable、Future 和 FutureTask

    2019-03-08

    #Java

  • 【Java】JVM-双亲委派模型(Parents Delegation model)

    2019-03-07

    #Java

  • 【Java】JVM-自定义类加载器

    2019-03-07

    #Java

  • 【Java】JVM - 对象访问

    2019-03-06

    #Java

  • 【Java】JVM - JVM 内存区域

    2019-03-06

    #Java

  • 【Java】JVM-类加载机制(ClassLoad Mechanism)

    2019-03-06

    #Java

  • 【Java】JVM-类加载器(Class Loader)

    2019-03-06

    #Java

  • 【Java】JVM 入门

    2019-03-06

    #Java

  • 【Java】JVM - HotSpot VM

    2019-03-05

    #Java

  • 【Java】JVM - Java 对象头(Header)

    2019-03-04

    #Java

  • 【Java】锁 - JVM 对内部锁的优化

    2019-03-04

    #Java

  • 【Java】I/O - I/O 模型与服务端编程

    2019-03-04

    #Java#Network Programming

  • 【Java】I/O - NIO 使用

    2019-03-04

    #Java

  • 【Java】字符(char)

    2019-03-03

    #Java

  • 【Java】 I/O - I/O 基本操作

    2019-03-03

    #Java

  • 【Java】 字符(串)编码与解码

    2019-03-02

    #Java

  • 【Java】多线程-线程间通信工具CountDownLatch、CyclicBarrier 和 Phaser 类

    2019-03-01

    #Java

  • 【Lock】锁的几种特性

    2019-03-01

    #Java#Lock

  • 【Java】锁 - AQS

    2019-02-28

    #Java

  • 【Java】锁 - ReentrantLock 类

    2019-02-28

    #Java

  • 【Java】多线程-Java 锁的演化

    2019-02-28

    #Java

  • 【Java】多线程-Java 保证原子性、有序性、可见性

    2019-02-28

    #Java

  • 【Java】多线程 - 原子类(Atomic Classes)

    2019-02-27

    #Java

  • 【Java】锁 - CAS 无锁算法

    2019-02-27

    #Java

  • 【Java】多线程 - Happens-before 原则

    2019-02-27

    #Java

  • 【Java】多线程 - 线程安全(Thread Safety)

    2019-02-27

    #Java

  • 【Java】多线程 - ThreadLocal

    2019-02-27

    #Java

  • 【Java】多线程 - 守护线程(Daemon Thread)

    2019-02-26

    #Java

  • 【Network】两种高性能I/O设计模式(Reactor/Proactor)

    2019-02-26

    #Network#Network Programming

  • 【Java】多线程 - 线程状态切换函数

    2019-02-25

    #Java

  • 【Java】多线程 - 线程池(Thread Pool)

    2019-02-25

    #Java

  • 【Operating System】进程 - 协程(Coroutines)

    2019-02-25

    #Operating System

  • 【Java】JVM - Java 内存模型(Java Memory Model)

    2019-02-25

    #Java

  • 【Lock】锁的可重入性(Reentrancy)

    2019-02-25

    #Lock

  • 【Java】Java关键字 - volatile 关键字

    2019-02-25

    #Java

  • 【Operating System】文件描述符(File Descriptor)

    2019-02-22

    #Operating System

  • 【Database】两阶段锁(Two-phase locking)

    2019-02-21

    #Database

  • 【Programming】并发编程(Concurrent Programming)

    2019-02-19

    #Programming

  • 【并发控制】乐观并发控制(Optimistic Concurrency Control)与悲观并发控制(Pessimistic Concurrency Control)

    2019-02-17

    #Operating System

  • 【Operating System】进程 - 进程与线程

    2019-02-14

    #Operating System

  • 【Operating System】系统调用

    2019-02-14

    #Operating System

  • 【Operating System】进程 - 进程/线程间通信

    2019-02-13

    #Operating System

  • 【Operating System】进程 - 进程/线程调度

    2019-02-10

    #Operating Systems

  • 【Linux】iptables防火墙

    2019-02-02

    #Linux

  • 【Java】多线程-线程优先级

    2019-02-01

    #Java

  • 【Java】Java关键字 - synchronized关键字

    2019-01-31

    #Java

  • 【Java】多线程-线程基础

    2019-01-31

    #Java

  • 【Java】多线程 - Java中的线程状态及状态切换

    2019-01-31

    #Java

  • 【Linux】SSH登录与管理

    2019-01-31

    #Linux

  • 【Linux】命令 - scp 命令

    2019-01-30

    #Linux

  • 【Linux】命令 - dig 命令

    2019-01-30

    #Linux

  • 【Network】dnsmasq初学

    2019-01-30

    #Network

  • 【Linux】定时任务

    2019-01-30

    #Linux

  • 【Network】Shadowsocks + OpenWRT + dnsmasq-full + ipset + gfwList 实现路由器(小米路由器mini)自动翻墙

    2019-01-30

    #Network

  • 【OpenWrt】小米路由器mini刷OpenWRT

    2019-01-30

    #OpenWrt

  • 【Network】C10K问题与高性能网络编程入门

    2019-01-20

    #Network#Network Programming

  • 【Linux】Linux中的I/O轮询技术

    2019-01-19

    #Linux#Operating System

  • 【Java】Java关键字 - finally关键字

    2019-01-18

    #Java

  • 【Architecture】Nginx学习

    2019-01-18

    #Architecture#Nginx

  • 【Node.js】Node的模块定义和使用

    2019-01-17

    #Node.js

  • 【Linux】硬链接与软链接

    2019-01-10

    #Linux

  • 【Distributed System】分布式系统的数据一致性(Data Consistency)

    2019-01-09

    #Distributed System

  • 【Distributed System】分布式事务 - 三阶段提交

    2019-01-09

    #Distributed System

  • 【Distributed System】分布式事务 - 两阶段提交

    2019-01-09

    #Distributed System

  • 【Distributed System】分布式理论 - BASE理论

    2019-01-08

    #Distributed System

  • 【Distributed System】分布式理论 - CAP理论

    2019-01-08

    #Distributed System

  • 【OOP】对象的深拷贝(Deep Copy)与浅拷贝(Shallow Copy)

    2019-01-07

    #OOP

  • 【Distributed System】远程过程调用(Remote Procedure Call,RPC)

    2019-01-07

    #Distributed System

  • 【Network】GFW学习

    2019-01-06

    #Network

  • 【Redis】Redis 入门

    2019-01-06

    #Cache System#Redis

  • 【WordPress】WordPress安全性设置

    2018-11-12

    #WordPress

  • 【Docker】Docker 的基本使用

    2018-11-12

    #Docker

  • 【Java】macOS下编译JDK8

    2018-11-12

    #Java

  • 【Node.js】Node.js 应用性能监测与分析

    2018-11-12

    #Node.js

  • 【Node.js】Node.js中的单线程模型与多线程/进程

    2018-11-12

    #Node.js

  • 【Linux】Shell 脚本

    2018-11-12

    #Linux

  • 【Architectural Pattern】MVVM与数据绑定

    2018-11-12

    #Architectural Pattern

  • 【Design Pattern】结构类模式 -- 模板方法模式 (Template Method Pattern)

    2018-11-12

    #Design Pattern

  • 【Design Pattern】结构类模式 -- 组合模式 (Composite Pattern)

    2018-11-12

    #Design Pattern

  • 【Design Pattern】结构类模式 -- 适配器模式 (Adapter Pattern)

    2018-11-12

    #Design Pattern

  • 【Design Pattern】结构类模式 -- 享元模式 (Flyweight Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】行为类模式 -- 观察者模式 (Obsever Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】行为类模式 -- 策略模式 (Strategy Pattern)

    2018-11-11

    #Design Pattern

  • 【Architectural Pattern】Model – View – Controller (MVC)

    2018-11-11

    #Architectural Pattern

  • 【Java】 Intellij调试程序断点进入JDK源码

    2018-11-11

    #Java

  • 【Java】Java程序的编译与运行

    2018-11-11

    #Java

  • 【JavaScript】JavaScript 单线程与异步

    2018-11-11

    #JavaScript

  • 【Python】Python调试技巧

    2018-11-11

    #Python

  • 【iOS】 iOS内存管理

    2018-11-11

    #iOS

  • 【Design Pattern】行为类模式 -- 备忘者模式(Memento Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】创建类模式 -- 单例模式 (Singleton Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】创建类模式 -- 建造者模式 (Builder Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】创建类模式 -- 工厂模式 (Factory Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】行为类模式 -- 状态模式 (State Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】设计模式概念

    2018-11-11

    #Design Pattern

  • 【Markdown】Markdown中的数学符号与公式

    2018-11-10

    #Markdown

  • 【Linux】命令 - time命令

    2018-11-06

    #Linux

  • 【Operating System】I/O - 同步、异步与阻塞、非阻塞I/O问题

    2018-11-06

    #Operating System

  • 【Node.js】Node.js 的 Event Loop 与异步 I/O

    2018-11-06

    #Node.js

  • 【Linux】chmod/chown - Linux 文件/文件夹 权限

    2018-11-05

    #Linux

  • 【SQL】SQLite 命令

    2018-02-24

    #SQL

  • 【SQL】SQL中几个关键字

    2018-02-24

    #SQL

  • 【WordPress】WordPress安装插件时提示输入FTP账号信息

    2018-02-24

    #WordPress

  • 【WordPress】WordPress修改管理员用户名名称

    2018-02-24

    #WordPress

  • 【OOP】依赖反转原则(The Dependency Inversion Principle)、控制反转(Inversion of Control)与依赖注入 (Dependency Injection)

    2018-02-24

    #OOP

  • 【MySQL】MySQL 常用命令

    2018-02-23

    #MySQL

  • 【MySQL】Mac 下安装 MySQL

    2018-02-23

    #MySQL

  • 【Java】JavaBean、POJO和EJB

    2018-02-23

    #Java

  • 【macOS】 macOS下查看端口被哪个程序占用

    2018-02-23

    #macOS

  • 【Java】 集合类-Java中List的基本使用

    2018-02-23

    #Java

  • 【Security】用户验证及密码加密存储

    2018-02-23

    #Security

  • 【OOP】SOLID 原则

    2018-02-23

    #OOP

  • 【Operating System】换行符

    2018-02-23

    #Operating System

  • 【C#】 C# 委托

    2018-02-23

    #C#

  • 【C#】 C# 匿名函数

    2018-02-23

    #C#

  • 【Programming】函数式编程(Functional Programming)

    2018-02-23

    #Programming

  • 【Software Testing】软件测试的种类

    2018-02-23

    #Software Testing

  • 【iOS】通过Xcode任意指定iPhone/iPad的地理位置

    2017-09-27

    #iOS

  • 【Linux】Linux(CentOS 7)安全策略设置

    2017-09-27

    #Linux

  • 【Linux】命令 - curl 的使用

    2017-09-26

    #Linux

  • 【Linux】查看占用端口的进程

    2017-09-08

    #Linux

  • 【Nginx】Nginx 配置文件的语法检测与路径获取

    2017-09-08

    #Nginx

  • 【Java】javap(Java Class文件分解工具)

    2017-06-08

    #Java

  • 【Windows】Windows 10下在Cmder中使用Linux Bash

    2017-06-08

    #Windows

  • 【Java】Java反编译工具

    2017-06-04

    #Java

  • 【Network】Wireshark常用过滤命令

    2017-06-04

    #Network

  • 【Network】单播(Unicast)、多播(Multicast)与广播(Broadcast)

    2017-06-04

    #Network

  • 【Network】DHCP 介绍与工作原理

    2017-06-04

    #Network

  • 【Java】Java 开发环境配置及踩的坑

    2017-06-04

    #Java

  • 【iOS】 iOS不同操作系统兼容问题

    2017-05-15

    #iOS

  • 【Hardware】i386、x86和x64的故事

    2017-04-30

    #Hardware

  • 【iOS】 Apple移动设备处理器指令集与Xcode指令集相关设置

    2017-04-30

    #iOS

  • 【Linux】时间同步问题与Linux NTP

    2017-04-25

    #Linux

  • 【Linux】CentOS7/RedHat7 NTP服务无法开机自启动

    2017-04-25

    #Linux

  • 【Linux】查看Linux系统版本

    2017-04-24

    #Linux

  • 【VMware】 VMware中安装CentOS7

    2017-04-13

    #VMware

  • 【Linux】 Linux 包管理器

    2017-04-13

    #Linux

  • 【VMware】 VMware Workstation 与 Device/Credential Guard 不兼容

    2017-04-13

    #VMware

  • 【JavaScript】 JavaScript 单元测试框架:Jasmine

    2017-04-09

    #JavaScript#Software Testing

  • 【Operating System】环境变量(Environmental Variables)

    2017-04-09

    #Linux

  • 【Node.js】 Node.js 与 NPM 的模块版本管理

    2017-04-09

    #Node.js#npm

  • 【Network】DNS原理分析

    2017-04-04

    #Network

  • 【C#】Visual Studio 2017 一边Debug,一边修改代码

    2017-04-03

    #C##Debug#Visual Studio

  • 【Git】 Git之忽略文件(gitignore)

    2017-04-03

    #Git#Version Control

  • 【Software Testing】 持续集成(Continuous integration)之粗浅理解

    2017-04-02

    #Software Testing

  • 【Data Format】JSON

    2017-04-01

    #JavaScript#Data Format

  • 【JavaScript】 JavaScript定时器深入解析

    2017-03-31

    #JavaScript

  • 【HTTP】URL总结

    2017-03-31

    #HTTP

  • 【VMware】 VMware12中安装macOS Sierra 10.12.3

    2017-03-13

    #macOS#VMware

  • 【SQL】 SQL 通配符使用

    2017-03-12

    #SQL

  • 【Node.js】 Node.js与NPM入门

    2017-03-11

    #Node.js#NPM

  • 【Browser】 浏览器中的缓存机制

    2017-03-02

    #Frontend#Cache#Browser

  • 【TypeScript】 TypeScript动态调试方法总结

    2017-03-02

    #Debug#TypeScript

  • My English Blog
  • My OJ Blog
  • 西维蜀黍的健身 Blog