Raft:一种分布式一致性算法

什么是分布式一致性

分布式一致性(Distributed Consensus)简单来说就是在多个节点组成系统中各个节点的数据保持一致,并且可以承受某些节点数据不一致或操作失败造成的影响。分布式一致性是分布式系统的基石。

Read More

《深入理解程序设计》读书笔记

计算机体系结构

冯诺依曼体系

冯诺依曼计算机体系

当前计算机主要是基于冯诺依曼体系结构设计的,主要由五大部件组成:

  1. 存储器用来存放数据和程序

  2. 运算器主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中

  3. 控制器主要用来控制和指挥程序和数据的输入运行,以及处理运算结果

  4. 输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等

  5. 输出设备可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等

Read More

Golang设计模式系列之简单工厂模式

定义

简单工厂模式是一种创建型设计模式,一般又称为静态工厂方法(Static Factory Method)模式。这种模式通过一个静态方法或者函数来达到隐藏正在创建的实例的创建逻辑目的

客户端仅与工厂方法交互,并告知需要创建的实例类型。工厂方法与相应的具体产品进行交互,并返回正确的产品实例。

Read More

深入了解golang中的defer关键字

golang中的defer关键字是用来声明一个延迟函数,一般称这个函数为defer函数,该函数会在defer语句所在的函数返回之前会执行。通过defer关键字,我们可以修改函数命名返回值,进行资源释放等操作,总的来说defer函数有如下特点和功能:

  • 函数返回之前执行
  • 可以放在函数中任意位置
  • 可以同时设置多个defer函数,多个defer函数执行遵循FILO顺序
  • defer函数的传入参数在定义时就已经明确
  • 可以修改函数中的命名返回值
  • 用于文件资源,锁资源、数据库连接等释放和关闭
  • 和recover一起处理panic

本文将介绍defer上面的几个特性,如果想深入了解defer底层实现机制,可以阅读笔者写的《深入Go语言之旅 - 基础篇 - defer函数》

defer会在函数返回之前执行

当程序执行一个函数时候,会将函数的上下文(输入参数,返回值,输出参数等信息)作为栈帧放在程序内存的栈中,当函数执行完成之后,设置返回值并返回,此函数才真正完成执行。

defer语句函数会在函数返回之前执行,下面程序将会依次输出B A:

1
2
3
4
func main() {
defer fmt.Println("A")
fmt.Println("B")
}

Read More

Golang设计模式系列开篇

抽象是用来处理复杂性的主要工具。一个问题越复杂,就越需要抽象来解决

概念

设计模式这个术语是由Erich Gamma等人在1990年代从建筑设计领域引入到计算机科学的。在《Domain-Driven Terms》一书中,设计模式被描述为:

设计模式是命名、抽象和识别对可重用的面向对象设计有用的的通用设计结构。设计模式确定类和他们的实体、他们的角色和协作、还有他们的责任分配

每一个设计模式都聚焦于一个面向对象的设计难题或问题。它描述了在其它设计的约束下它能否使用,使用它后的后果和得失

Read More

《统计思维》读书笔记之描述性统计量

清明放假三天,闲来无事,拿起角落里吃灰蛮久的《统计思维》一书聊以打发。现把读书笔记结合收集的相关资料内容记录如下。

描述性统计量

描述性统计是一种汇总统计,用于定量描述或总结信息集合的特征。描述性统计又分为集中趋势(Measures of central tendency)和离散趋势(Measures of Dispersion)

均值

均值(Mean),即所有数据相加后的总和除以数据的个数得出的结果, 也称算术平均值。设一组样本数据为x1,x2,…,xn,样本数据的个数为n,则均值为:

均值计算公式

Read More

SQL注入攻击示例与防范措施

注入攻击是OWASP总结的十大web安全风险中排在第一位的攻击形式, 而SQL注入(SQL Injection)攻击是注入攻击中最常见的一种形式。SQL注入漏洞可以从数据库读取敏感数据,修改数据库数据(插入/更新/删除),对数据库执行管理操作(例如关闭DBMS),恢复DBMS文件上存在的给定文件的内容系统,并在某些情况下向操作系统发出命令。

作为开发要防范这些攻击,就需要了解这些攻击方式。现列出Mysql数据库下几种常见SQL注入攻击示例,以作参考。

Read More

ElasticSearch完全使用指南(一)

ElasticSearch完全使用指南

简介

Elasticsearch是基于Apace Lunence构建的开源,分布式,具有高可用性和高拓展性的全文检索引擎。Elasticsearch具有开箱即用的特性,提供RESTful接口,是面向文档的数据库,文档存储格式为JSON,可以水平扩展至数以百计的服务器存储来实现处理PB级别的数据。

Elasticsearch可以快速存储,搜索,分析海量,索引数据速度达到毫秒级(近实时Near Real Time)。Github的代码搜索就是使用Elasticsearch来实现的。Elasticsearch使用场景有:

  1. 网站全文检索,高亮搜索,搜索建议
  2. 电商网站商品搜索,分面搜索(分面是指事物的多维度属性)
  3. 基于用户行为的推荐系统
  4. 支持到PB级别日志数据分析

Read More