实现Raft协议:Part 2 - 指令和日志复制

翻译自Eli Bendersky的系列博客,已获得原作者授权。 本文是系列文章中的第一部分,本系列文章旨在介绍Raft分布式一致性协议及其Go语言实现。文章的完整列表如下: 序言:介绍 第一部分:选主 第二部分:指令和日志复制(本文) 第三部分:持久性和优化 在这一部分,我们会大幅强化Raft的实现,做到能够实际处理客户端提交的指令,并在Raft集群中复制它们。代码结构与第一部分相同,会有一些新的结构体和函数定义,对旧代码也会有一些改动——我会对这些做简短的解释。 本部分的所有代码都在这个目录。...阅读全文

掘金 2020年05月04日 GuoYaxiang

go语言项目优化(经验之谈)

简介:我的课题主要分为以下三章,斗鱼在GO的应用场景,GO在业务中如何优化,我们在GO中踩过了哪些坑。 1 Go的应用场景 在斗鱼我们将GO的应用场景分为以下三类,缓存类型数据,实时类型数据,CPU密集型任务。这三类应用场景都有着各自的特点。 ● 缓存类型数据在斗鱼的案例就是我们的首页,列表页,这些页面和接口的特点是不同用户在同一段时间得到的数据都是一样的,通常这些缓存类型数据的包都比较大,并且这些数据没有用户态,具有一定价值,很容易被爬虫爬取。 ● 实时类型数据在斗鱼的案例就是视频流,关注数据...阅读全文

Segmentfault 2020-05-10 16:32:34 阿里技术

golang 锁

手册中有点难懂,自己写个例子。 package main import ( "fmt" "time" ) func main() { // 不想用time sleep // 挂起通道 不让主main退出,我想看结果 //ch := make(chan bool) public := 1 go func() { fmt.Println("执行了1操作") for i := 0; i < 2; i++ { time.Sleep(time.Microsecond * 100) public++ fmt...阅读全文

简书 2020-05-06 11:34:27 蛐蛐儿阳

golang优化日记

内存优化 1.1小对象合并成结构体一次分配,减少内存分配次数 c++里面,小对象在对上频繁申请,会出现内存碎片,导致大的对象时无法申请到连续的内存空间,一般建议使用内存池; go runtime底层使用内存池,但每个span大小为4k,同时维护一个cache;cache分为0到n的list数组,每个单元挂载一个链表,链表上每个节点的内存块大小是相等的;不同链表的大小块是不等的,当cache不够时再向spanalloc申请; 例如:小对象合并为结构体一次分配 for k,v := range m{...阅读全文

简书 2020-05-06 11:34:27 安静的皮蛋

二维码,电脑和手机实现快速互传

从电脑上传送文件到手机上的方法有很多,比如用QQ、微信,但是传输文件大小有限制;用数据线最传统的方式。现在一些手机也自带了文件传送功能,或者第三方软件,但可能面临一个问题,不支持跨平台、跨设备。 今天,要给大家推荐一款利器。电脑传送文件到手机软件「qrcp」免费开源,支持多平台 Windows / Linux / MacOS,传送的文件会生成一张二维码,设备在同「WIFI」局域网内,你手机扫一扫就可以保存下载。Windows版使用从电脑传送文件到手机下载后是一个"qrcp.exe",需要在 CM...阅读全文

简书 2020-05-06 11:34:26 蜡笔小强124

为什么数组要从零开始?

如题,数组第一个元素为什么要从零开始,而不从一开始?感觉这很反人类呀,正常来讲,一个集合的开始,不应该从一吗? 对于这个问题,我觉得可以从以下两方面来考虑。 设计层面 我们先了解一下数组最基本的结构和寻址方式(即实现方式)。 现在市面上无论是C、Java、PHP,还是Go或者其他编程语言,他们数组的实现方式,应该都是一样的:一段连续的内存。 image 数组在分配内存的时候,我们会知道数组的开始地址(PS:在目前下标为零的情况下,也等同于数组的第一个元素的地址); image 因为数组中每个元素...阅读全文

Golang算法

面试题03. 数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入:[2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000阅读全文

简书 2020-05-06 11:32:59 DoneIsBetter

浅谈redis网络模块

redis 是cs架构,网络采用epoll 模型,单线程处理每个请求。 很多同学对单线程有些疑问,简单的解释一下 redis 单线程的意思,redis 服务端虽说是单线程,但是可以同时 持有很多connection,每个connection 都可以同时发请求,只不过在 redis 服务端,一个一个的处理每个connection 发过来的request, 通俗点说就是,很多请求都能发过来,redis 会存下来(其实是存在每个connection socket 内核缓冲区),一个一个处理。 为什么单...阅读全文

简书 2020-05-06 11:32:59 tracy_668

5-6

I sleep very well last night. and my chest pain already be cure I think. I think the running help me. so running is so important. I need to continue. last day I listen one english story. on YouTube. there have a lot of comment. they all sad that stor...阅读全文

简书 2020-05-06 11:32:50 蛐蛐儿阳

13位的时间golang

UnixNano纳秒要转换成毫秒, 进6个位 1 纳秒 = 1000皮秒 1,000 纳秒 = 1微秒 μs 1,000,000 纳秒 = 1毫秒 ms 1,000,000,000 纳秒 = 1秒 s t := strconv.FormatInt(time.Now().UnixNano()/1e6, 10) fmt.Println(len(t)) // 13 fmt.Println(t) // 1588733947147 fmt.Println(fmt.Sprint(1e6)) // 1*10^...阅读全文

简书 2020-05-06 11:32:50 百里江山

让我们一起啃算法----删除排序数组中的重复项

删除排序数组中的重复项(Remove-Duplicates-From-Sorted-Array) 题干如下: 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。示例 2: 给...阅读全文

Segmentfault 2020-05-10 11:32:33 三斤和他的朋友们

golang 容器的学习与实践

golang 提供了几个简单的容器供我们使用,本文在介绍几种Golang 容器的基础上,实现一个基于Golang 容器的LRU算法。 <!--more--> 容器介绍 Golang 容器位于 container 包下,提供了三种包供我们使用,heap、list、ring. 下面我们分别学习。 heap heap 是一个堆的实现。一个堆正常保证了获取/弹出最大(最小)元素的时间为log n、插入元素的时间为log n.golang的堆实现接口如下: // src/container/heap.go...阅读全文

Segmentfault 2020-05-09 23:32:34 搬砖程序员带你飞

从零学习 Go 语言(11):goto 无条件跳转

Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。 **系列导读** [从零学习 Go 语言(01):一文搞定开发环境的搭建](https://studygol...阅读全文

Go语言中文网 2020-05-06 08:35:20 hello_wbm

11. Go 语言流程控制:goto 无条件跳

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime Go里的流程控制方法还是挺丰富,整理了下有如下这么多种: if - else 条件...阅读全文

Segmentfault 2020-05-09 09:32:32 Python编程时光

什么,秒杀系统也有这么多种!

前言 本文结构很简单: 5张图送你5种秒杀系统,再加点骚操作,再顺带些点心里话????‍♀️。 一个简单的秒杀系统 实现原理: 通过redis原子操作减库存 图一 优点 缺点 简单好用 考验redis服务能力 是否公平 公平 先到先得 我们称这类秒杀系统为: 简单秒杀系统 如果刚开始QPS并不高,redis完全抗的下来的情况,完全可以依赖这个「简单秒杀系统」。 一个够用的秒杀系统 实现原理: 服务内存限流算法 + redis原子操作减库存 图二 优点 缺点 简单好用 - 是否公平 不是很公平 相...阅读全文

掘金 2020年05月06日 TIGERB

从精通JS到golang入门 - 基础入门

Go官网 基础入门 1.学习方式 第一种,本地项目学习 如何使用 go 命令来获取、构建并安装包、命令及运行测试 第二种,在线学习工具使用。 第一部分只是简单欢迎引导。 2.欢迎使用Go指南 指南的使用 欢迎来到Go编程语言指南。本指南涵盖了该语言的大部分重要特性,主要包括: 欢迎! 学习如何使用本指南:包括如何在不同的课程之间切换,以及如何运行代码。 复制代码基础 一开始,将学习关于语言的所有基础内容。 定义变量,调用函数,以及在您学习下一课之前所需要了解的全部内容。 包,变量和函数。 学习G...阅读全文

掘金 2020年05月05日 CharlesYu01

探索 Go 中接口的性能

问题 在 Go 中使用接口(interface{})好像有性能问题,但是真的如此吗,或者我们有哪些可以提升的空间,来看一下 golang 的一个 issue。例子中跑了三个 benchmark,一个是接口调用,一个是直接调用,后面我又加了一个接口断言后调用。 import ( "testing" ) type D interface { Append(D) } type Strings []string func (s Strings) Append(d D) {} func Benchmark...阅读全文

掘金 2020年05月05日 咔叽咔叽

如何快速的随机从 map 中返回一个值

前言 本文翻译自 lukechampine.com/hackmap.htm… go 的 map 源码解析都会引用的一片文章。 第一部分:问题 从一个切片中随机的获取一个值是非常简单的,可以使用map.Int(n),这样就可以从[0,n)中随机的返回一个值,从而可以从切片中随机的返回一个元素 func randSliceValue(xs []string) string { return xs[rand.Intn(len(xs))] } 复制代码这个方法是非常好的,因为耗费的时间和内存都是O(1)...阅读全文

掘金 2020年05月05日 胡大海

Go语言sync包的应用详解

在并发编程中同步原语也就是我们通常说的锁的主要作用是保证多个线程或者 goroutine在访问同一片内存时不会出现混乱的问题。Go语言的sync包提供了常见的并发编程同步原语,上一期转载的文章《Golang 并发编程之同步原语》中也详述了 Mutex、RWMutex、WaitGroup、Once 和 Cond 这些同步原语的实现原理。今天的文章里让我们回到应用层,聚焦sync包里这些同步原语的应用场景,同时也会介绍sync包中的Pool和Map的应用场景和使用方法。话不多说,让我们开始吧。 sy...阅读全文

掘金 2020年05月05日 kevinyan

[译]像专家一样使用 panic

作者: Vladimir Kovpak | 发布时间:2018-08-21 (i do it cause i need to...) 预备知识 本文假定你已经熟悉 go 语言及其 panic/recorer 函数、以及任何其他具有异常(try-catch)概念的编程语言。 介绍 你可能已经在《The Little Go Book》中看到诸如这样的句子: Go 处理错误的首选方式是 return values,而不是抛出错误 也许你在 go wiki 上看到过《CodeReviewComments...阅读全文

掘金 2020年05月04日 henry_chen