NET-E

Thoughts, stories and ideas.

基于 golang 从零到一实现时间轮算法

0 前言近期计划攻坚一个新的专题系列——如何基于 golang 从零到一实现 redis. 这里选择的学习素材是 hdt3213 大佬于 github 上开源的 godis 项目. 在大佬的实现中,充分利用了 golang 的特性,将 redis 存储层由单线程模型转为并发模型,其中在实现数据的 expire 机制时,采用的是单机时间轮模型进行过期数据的删除操作. godis 项目开源地址:http://github.com/HDT3213/godis godis 时间轮代码:http://github.com/HDT3213/godis/blob/master/lib/timewheel/timewheel.go 实际上,在我之前分享个人项目——分布式定时器 xtimer 中也有到了时间轮算法,这部分内容具有一定共性.

Linux文本三剑客超详细教程---grep、sed、awk

awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。 1、grep1.1 什么是grep和egrepLinux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。 grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。 egrep = grep -E:扩展的正则表达式 (除了\< , \> , \b

万字解析 go 语言分布式消息队列 NSQ

0 前言本期和大家一起探讨一款完全基于 go 语言实现的分布式消息队列——nsq. 有关于消息队列 Message Queue 的概念及作用,大家可以参考我之前发表的文章——万字长文解析如何基于Redis实现消息队列,这些基础知识本文不再赘述. nsq 是一款基于 go 语言开发实现的分布式消息队列组件,在 golang 世界中拥有着很高的认可度和流行性,截止今日在 github 上的 stars 数已高达 23 k. 本期会涉及大量对 nsq 的源码走读环节,主要包含: nsq 客户端:https://github.com/nsqio/go-nsq . 本文走读源码版本为:v1.1.0.nsq 服务端:https://github.com/nsqio/nsq . 本文走读源码版本为:v1.

用 Go 创建一个简易负载均衡器

负载均衡器在 Web 架构中扮演了很关键的角色。它们能在一组后端机器分配负载。这使得服务扩展性更好。因为配置了很多的后端机器,服务也因此能在某次请求失败后找到正常运行的服务器而变得高可用。 在使用了像 NGINX 等专业的负载均衡器后,我自己也尝试着用 Golang 创建了一个简易负载均衡器。Go 是一种现代语言,第一特性是支持并发。Go 有丰富的标准库,使用这些库你可以用更少的代码写出高性能的应用程序。对每一个发行版本它都有静态链接库。 我们的简易负载均衡器工作原理负载均衡器有不同的策略用来在一组后端机器中分摊负载。 例如: 轮询 平等分摊,认为后端的所有机器处理能力相同加权轮询 基于后端机器不同的处理能力,为其加上不同的权重最少连接数 负载被分流到活跃连接最少的服务器至于我们的简易负载均衡器,我们会实现这里边最简单的方式 轮询。 轮询选择轮询无疑是很简单的。它轮流给每个 worker 相同的执行任务的机会。 上图已经说明了,负载均衡器周期性地选择某台服务器。但是我们不能直接使用它,不是吗? 如果后端机器宕机了怎么办?恐怕我们不会希望流量被路由到挂掉的机器上去。因此除非我们添加一些条件,否则不能直接使用这个算法。我们需要把流量只路由到没有挂掉且正常运行的后端机器上。 定义几个结构体修正思路后,现在我们清楚我们是想要一种能跟踪后端机器状态信息的方法。我们需要检查机器是否存活,也需要跟踪 Url。 我们可以简单地定义一个下面的结构体来维护我们的后端机器。 type

深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发

Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分。由于 Go 协程相对于传统操作系统中的线程 (thread) 是非常轻量级的,因此对于一个典型的 Go 应用来说,有数以千计的 Go 协程并发运行的情形是十分常见的。并发可以显著地提升应用的运行速度,并且可以帮助我们编写关注点分离(Separation of concerns,Soc)的代码。 什么是 Go 协程?我们也许在理论上已经知晓 Go 协程是如何工作的,但是在代码层级上,go 协程何许物也?其实,go 协程看起来只是一个与其他众 Go 协程并发运行的一个简单函数或者方法,但是我们并不能想当然地从函数或者方法中的定义来确定一个 Go 协程,go 协程的确定还是要取决于我们如何去调用。 Go 中提供了一个关键字 go 来让我们创建一个 Go

Go 中基于 IP 地址的 HTTP 请求限流

如果你在运行 HTTP 服务并且想对 endpoints 进行限速,你可以使用维护良好的工具,例如 github.com/didip/tollbooth。但是如果你在构建一些非常简单的东西,自己实现并不困难。 我们可以使用已经存在的试验性的 Go 包 x/time/rate。 在本教程中,我们将创建一个基于用户 IP 地址进行速率限制的简单的中间件。 「干净的」HTTP 服务让我们从构建一个简单的 HTTP 服务开始,该服务具有非常简单的 endpiont。这可能是个非常「重」的 endpoint,因此我们想在这里添加速率限制。 package main import ( "log" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", okHandler) if

深入底层:Go语言从零构建区块链(二):PoW工作证明机制

Build Blockchain from Scratch with Golang DirectoryDirectory 前言 项目重构 共识机制 添加Nonce PoW实现 调试带PoW的区块链系统 总结 前言在上一章中我们了解了区块是什么以及区块与区块链之间的关系。在这一章中我们将拓宽区块的头部信息,并讲解区块如何合法的被添加进区块链中。 项目重构在上一章中,我们所有的代码都写在了main.go中,这显然不利于我们继续构建项目。我们希望main.go只用于最后启动我们的区块链系统,为此我们需要将设计的区块与区块链移植其它文件夹中,这也会帮你go语言的代码管理机制。 首先我们在goblockchain文件夹下建立一个新的文件夹blockchain,在blockchain下分别创建block.go,blockchain.go,之后我们会将相关结构体与函数放入其中。创建utils文件夹,在其下创建util.go用以存放一些龙套函数。创建constcoe文件夹在其下创建constcoe.go用于储存一些全局常量。 打开utils.go,引入以下包。 //util.go package utils import ( "bytes" "encoding/binary" "log" )然后构建一个简单的错误处理函数。 //util.

深入底层:Go语言从零构建区块链(一): Hello, Blockchain

Build Blockchain from Scratch with Golang DirectoryDirectory 前言 创建项目 区块与区块链 哈希 区块创建与创始区块 运行区块链系统 总结 前言有时觉得前言什么的可以省略,但作为一个教程还是应该在最开始的时候说两句。 这个系列的教程目的是使用Golang由浅入深地还原PoW共识机制最基础区块链系统(参照比特币),适合想要快速入门区块链核心技术的读者,当然也适合刚学完Go基础语法希望练手的读者。相较于网络上其它Go语言实现区块链的教程,本系列教程以最终建立一个可以分布式运行的区块链系统为目标,使用新版本的Golang(v1.17)及相关包,在还原的过程中会尽量说明一些常规教程忽视的细节,给出所有的代码。 大部分人对于区块链技术的学习常常停留在表象,了解了UTXO模型,共识机制,P2P网络后,总是迫不及待地就想用区块链往所有涉及隐私与安全的问题里套。我始终持有的观点是,可以允许区块链在各种应用场景中试错,但不应该过于推崇区块链,它不是万能的,要学习区块链就应该了解其本质,从事物的两面性去研究它。举个例子,如果我们把区块链当作一个分布式的数据库看待,那么它的性能无疑是拉跨的,但是如果充分理解区块链的本质,就能够明白比特币为什么仅仅用一段代码就能够在全球没有第三方机构的参与下实现资产信息的长久保存,稳定运行超过五年,感叹其精妙之处。 如果想要了解区块链技术的本质,了解区块链技术的优缺点以及可能的研究方向,最直接的办法无疑是阅读比特币源码。但是比特币源码使用C进行编写,

京ICP备19016179号-1