Go语言中文网 为您找到相关结果 233

Golang 互斥锁与读写锁

互斥锁 代码示例 package main import ( "fmt" "sync" "time" ) func main() { //声明 var mutex sync.Mutex fmt.Println("Lock the lock. (G0)") //加锁mutex mutex.Lock() fmt.Println("The lock is locked.(G0)") for i := 1; i < 4; i++ { go func(i int) { fmt.Printf("----Lock the lock. (G%d)\n", i) mutex.Lock() fmt.Printf("++++The lock is locked. (G%d)\n", i) }(i) } //休息一...阅读全文

博文 2019-03-30 02:34:40 Rnben

子操作&普通锁&读写锁

一:原子操作CAS(compare-and-swap) 原子操作分三步:读取addr的值,和old进行比较,如果相等,则将new赋值给*addr,他能保证这三步一起执行完成,叫原子操作也就是说它不能再分了,当有一个CPU在访问这块内容addr时,其他CPU就不能访问 func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool) TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25 MOVD addr+0(FP), R3 MOVD old+8(FP), R4 MOVD new+16(FP), R5 SYNC LDAR (R3), R6 CMP R6, R4 BNE 7(PC) STD...阅读全文

博文 2019-01-17 20:15:13 hlxs

Bytom DAPP 开发流程

从目前已经发布的DAPP来看,DAPP架构大致可以分成3种类型:插件钱包模式、全节点钱包模式和兼容模式。 插件钱包模式是借助封装了钱包的浏览器插件通过RPC协议与区块链节点通信,插件在运行时会将Web3框架注入到DAPP前端页面中,然后DApp通过Web3来与区块链节点通信。 全节点钱包模式需要项目方同步并持有一个区块链节点,并对外提供一个浏览器环境与用户进行交互。 兼容模式可以在插件钱包和全节点钱包下同时使用,即上述两种方式可以自由切换,安全性能相对较高。 接下来介绍的比原链DAPP的架构模式跟账户模型DAPP的插件钱包模式有些相似,都是由DAPP前端、插件钱包和合约程序共同组成,其中插件钱包需要连接去中心化的区块链服务器blockcenter,该服务器主要是为了管理插件钱包的相关信息。此...阅读全文

博文 2019-07-18 10:32:43 比原链Bytom

不得不知道Golang之sync.Map源码分析

sync.Map源码分析 背景 众所周知,go普通的map是不支持并发的,换而言之,不是线程(goroutine)安全的。博主是从golang 1.4开始使用的,那时候map的并发读是没有支持,但是并发写会出现脏数据。golang 1.6之后,并发地读写会直接panic: fatal error: concurrent map read and map write package main func main() { m := make(map[int]int) go func() { for { _ = m[1] } }() go func() { for { m[2] = 2 } }() select {} } 所以需要支持对map的并发读写时候,博主使用两种方法: 第三方类库 conc...阅读全文

博文 2018-07-02 16:55:54 梦朝思夕

图解Go select语句原理

Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。 还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。 以上说法都正确。 I/O多路复用 我们来回顾一下是什么是I/O多路复用。 普通多线程(或进程)I/O image 每来一个进程,都会建立连接,然后阻塞,直到接收到数据返回响应。 普通这种方式的缺点其实很明显:系统需要创建和维护额外的线程或进程。因为大多数时候,大部分阻塞的线程或进程是处于等待状态,只有少部分会接收并处理响应,而其...阅读全文

博文 2019-04-03 15:34:43 RyuGou

Go小技巧之互斥锁、随机数、time、List

// code_026_go_antic_package project main.go

package main import ( "container/list" "fmt" "math/rand" //备注2:随机数的包 "sync" //备注1:异步任务的包 "time" ) type INFO struct { lock sync.Mutex //备注1:异步锁 Name string Time int64 } var List *list.List = list.New() //备注3:初始化List变量 func main() { var Info INFO go func() { for i := 0; i < 5...阅读全文

博文 2018-10-06 17:35:09 ck_god

Golang Cond源码分析

cond的主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放频率,适用于在并发环境下goroutine的等待和通知。 针对Golang 1.9的sync.Cond,与Golang 1.10一样。 源代码位置:sync\cond.go。 结构体 type Cond struct { noCopy noCopy // noCopy可以嵌入到结构中,在第一次使用后不可复制,使用go vet作为检测使用 // 根据需求初始化不同的锁,如*Mutex 和 *RWMutex L Locker notify notifyList // 通知列表,调用Wait()方法的goroutine会被放入list中,每次唤醒,从这里取出 checker copy...阅读全文

博文 2018-07-02 14:42:30 梦朝思夕

golang-101-hacks(1)——创建开发环境

注:本文是对golang-101-hacks中文翻译,本文的原文地址 创建Go开发环境是非常容易的,以Linux系统为例,你只需要从https://golang.org/dl/ 下载和你系统匹配的二进制包,然后解压包文件就OK了。(注意作者原文的下载的包文件版本有点旧 ,建议下载最新版本,目前最新版本是1.12了) # wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz # tar -C /usr/local/ -xzf go1.6.2.linux-amd64.tar.gz 返回将解压的包文件放在/usr/local目录下,就结束安装了,但然还有一些收尾工作需要做: 1 为了直接运行Go工具类命令(go,...阅读全文

博文 2019-05-20 18:34:46 羊羽share

AQS抽象队列同步器

模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 Lock接口及其实现 中,DemoReentrantLock 和 DemoReadWriteLock 代码相似度很高。DemoReentrantLock 中的加解锁完全可以用DemoReadWriteLock中代替,即可实现加解锁。 优化两个锁的代码-采用模板方法模式 CommonMask实现两个锁共有的方法 import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurr...阅读全文

博文 2020-01-19 01:32:42 依弗布德甘

白话比原链跨链技术

随着Bystack的主侧链架构的推出,主侧链之间的跨链问题也成为比原链团队的主要攻克工程难题,当前比原链已经推出了两种跨链的机制,各有不同的侧重点,可能因为本身的跨链技术比较晦涩,本篇想以较为通俗的方式向社区介绍比原链最新的跨链技术。 一些预备知识 跨链简单的来说就是解决如何让一条链上的token转移到另一条链上,本质是将一条链上的价值转移到另一条链,跨链需要保证以下几点: 1. 确保已跨链的资产的妥善保管,不能在原链上能够继续流通,要防止被窃取或者挪用; 2. 确保两条链上转移的资产是等同的,不能A链上减少了100价值的资产,而B链上只增加了50价值的资产; 3. 转移的资产能够安全的再转移回原链上,不能价值只是单向转移,或者转移过去无法转移回来; 基于这些要求,诞生出很多不同的跨链方案,...阅读全文

博文 2019-09-19 10:02:48 比原链Bytom

2020教你深入理解Golang之channel

前言Golang在并发编程上有两大利器,分别是channel和goroutine,这篇文章我们先聊聊channel。熟悉Golang的人都知道一句名言:“使用通信来共享内存,而不是通过共享内存来通信”。这句话有两层意思,Go语言确实在sync包中提供了传统的锁机制,但更推荐使用channel来解决并发问题。这篇文章会先从channel的用法、channel的原理两部分对channel做一个较为深入的探究。channel用法什么是channel从字面上看,channel的意思大概就是管道的意思。channel是一种go协程用以接收或发送消息的安全的消息队列,channel就像两个go协程之间的导管,来实现各种资源的同步。可以用下图示意: channel的用法很简单: func main() {...阅读全文

博文 2020-02-17 20:32:48 即将秃头的Java程序员

Go RWMutex 源码学习

概述 上一篇文章我们看go了互斥锁的具体实现。但是如果业务逻辑是读多写少,如果每次读写都使用互斥锁那么整个效率就会变得很低。其实如果只是读的话并不需要互斥锁来锁住数据。只有写操作的时候需要互斥锁,但是如果有人读那么写操作也应该被锁住。在Go语言中提供了读写锁:RWMutex,并且提供了4个方法 读锁、读解锁、写锁、写解锁。其中读锁不是互斥,但是读锁和写锁是互斥的。简单来说是可以有多个读同时加锁,但是一旦有人想要获取写锁则会被阻塞。 简单使用 我们可以看到读锁可以获取多个,但是读锁还剩下一个的时候想要获取写锁则会被阻塞。等待3秒之后读锁被全部解开之后,会唤醒之前阻塞的写锁。别忘记最后需要解开写锁。还有一个比较常见的问题是,如果给没有读锁或者写锁的情况下解锁被抛出错误。 package main...阅读全文

博文 2019-08-01 11:32:40 大二小的宝

Go Mutex 源码学习

概述 互斥锁是并发程序中对共享资源进行访问控制的主要手段,Mutex是go语言提供的简单易用的互斥锁。Mutex的结构很简单,暴露的方法也只有2个,一个加锁 一个解锁。那么我们每天用的Mutex互斥锁是如何实现的呢?其实使用的是go语言automic包中的院子操作,具体如何使用可以参考之前写的文章。在Mutex中的state是状态码,在mutex中把state分成4段。如下图: Locked:表示是否上锁 上锁为1 未上锁为0 Woken:表示是否被唤醒,唤醒为1 未唤醒为0 Starving:表示是否为饥饿模式,饥饿模式为1 非饥饿模式为0 waiter:剩余的29位则为等待的goroutine数量 互斥锁的实现其实就是争夺Locked,当goroutineA 抢到了锁之后,第二个Goro...阅读全文

博文 2019-07-31 14:32:40 大二小的宝

RSCHA认证第六讲管理用户密码

RH124系列课程的目标: 1、获得 Redhat 或者 centos 上执行核心系统管理任务所需的足够技能。 2、掌握 RHCSA 认证红帽企业 Linux 系统管理员所需的基本技能。 本章的目标:管理用户密码。 手动锁定帐户,或者通过定义在阴影密码文件中设置密码过期策略来锁定。 阴影密码和密码策略 在遥远的过去,加密的密码存储在全局可读的/etc/passwd 文件中。这曾被认为具有合理的安全性,直到对加密密码的字典式攻击变得常见。在那时,加密密码或“密码哈希”移到更加安全的/etc/shadow 文件中。这种新文件也允许实施密码期限和到期功能。 现代密码哈希中的存储三段信息: $6$8k9dc5/aS415T 6: 哈希算法。数字1表示MD5哈希。使用SHA-512哈希时会出现数字6 ...阅读全文

博文 2019-08-10 02:32:43 多多北漂悟道之路

golang基础--细说defer

defer 匿名函数特性 执行方式类似其它语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行 //执行顺序相反 package main import "fmt" func main() { fmt.Println("a") defer fmt.Println("b") defer fmt.Println("c") } /*输出 a c b */ 即使函数发生严重的错误也会执行,类似于try...except 常用于 资源清理,文件关闭,解锁以及记录时间等操作 支持匿名函数的调用 通过于匿名函数配合可在return之后修改函数计算的结果 -如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则 则时引用某个变量的地址 //支持匿名函数 ...阅读全文

博文 2018-07-12 13:30:31 failymao

EOS Cleos 命令使用指南

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 命令参考操作 语法 例子 获取所有命令 $ cleos 例子 获取所有子命令 $ cleos ${command} 例子 链接节点 $ cleos --url ${node}:${port} 例子 查询区块链状态 $ cleos get info 例子 通过transaction_id获取交易 $ cleos get transaction ${transaction_id} 例子 通过帐户获取交易 $ cleos get transaction ${account} 例子 转账EOS $ cleos transfer ${from_account} ${to_account} ${quantity} 例子 钱包...阅读全文

博文 2019-09-16 12:32:38 链客

深入理解Go-sync.Map原理剖析

Map is like a Go map[interface{}]interface{} but is safe for concurrent use by multiple goroutines without additional locking or coordination. Loads, stores, and deletes run in amortized constant time. 上面一段是官方对sync.Map 的描述,从描述中看,sync.Map 跟map 很像,sync.Map 的底层实现也是依靠了map,但是sync.Map 相对于 map 来说,是并发安全的。 1. 结构概览 1.1. sync.Map sync.Map的结构体了 type Map struct...阅读全文

博文 2019-09-09 01:04:19 tyloafer

Golang sync.Cond源码分析

cond的主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放频率,适用于在并发环境下goroutine的等待和通知。 针对Golang 1.9的sync.Cond,与Golang 1.10一样。 源代码位置:sync\cond.go。 结构体 type Cond struct { noCopy noCopy // noCopy可以嵌入到结构中,在第一次使用后不可复制,使用go vet作为检测使用 // 根据需求初始化不同的锁,如*Mutex 和 *RWMutex L Locker notify notifyList // 通知列表,调用Wait()方法的goroutine会被放入list中,每次唤醒,从这里取出 checker copy...阅读全文

博文 2018-04-23 15:33:13 梦朝思夕

Bytom猜谜合约使用指南

准备工作: 1、安装全节点钱包V1.0.5以上并同步完成; 2、已经发行一种资产,发行资产的方法具体见文章《如何在Bytom上发布资产?》 3、准备好一些BTM作为手续费; 设置谜语(锁定资产): 1、打开钱包,点击Equity合约按钮; 2、进入Equity合约页面,点击加载模板,可以看见猜谜合约; 3、点击猜谜合约,进入猜谜合约模板; 4、在锁定资产页面中,选择我们要奖励给猜对答案的资产奖励(当前不支持直接锁定BTM,所以我们需要新建一种资产进行锁定); 设置锁定GOLD资产,选择想要的数量(注意:1=1诺=0.00000001单位,所以你如果想给别人发1单位的资产,需要填入100000000),填入密码以及Gas费用(合约建议固定给0.4btm); 5、设置猜谜的谜底(正确答案),比如...阅读全文

博文 2018-09-12 10:34:39 比原链Bytom

Golang 读写锁RWMutex 互斥锁Mutex 源码详解

前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现。 引子问题 我一般喜欢带着问题去看源码。那么对于读写锁,你是否有这样的问题,为什么可以有多个读锁?有没有可能出现有协程一直无法获取到写锁的情况?带着你的疑问来往下看看,具体这个锁是如何实现的。 如果你自己想看,我给出阅读的一个思路,可以先看读写锁,因为读写锁的实现依赖于互斥锁,并且读写锁比较简单一些,然后整理思路之后再去想一下实际的应用场景,然后再去看互斥锁。 下面我就会按照这个思路一步步往下走。 基础知识点 知识点1:信号量 信号量是 Edsger Dijkstra 发明的数据结构(没错就是那个最短路径算法那个牛人),在解决...阅读全文

博文 2019-06-10 17:33:26 LinkinStar

golang源码学习之mutex

老实说呢,Mutex源码我看了好多遍,依旧没完全看懂。各种状态逻辑很难理解。(golang 1.12.7) 先来看看Mutex的核心注释 // Mutex fairness. // // Mutex can be in 2 modes of operations: normal and starvation. // In normal mode waiters are queued in FIFO order, but a woken up waiter // does not own the mutex and competes with new arriving goroutines over // the ownership. New arriving goroutines have ...阅读全文

《Go语言四十二章经》第二十三章 锁

《Go语言四十二章经》第二十三章 锁 作者:李骁 ## 23.1 同步锁 Go语言包中的sync包提供了两种锁类型:sync.Mutex和sync.RWMutex,前者是互斥锁,后者是读写锁。 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段,在Go中,似乎更推崇由channel来实现资源共享和通信。它由标准库代码包sync中的Mutex结构体类型代表。只有两个公开方法:调用Lock()获得锁,调用unlock()释放锁。 * 使用Lock()加锁后,不能再继续对其加锁(同一个goroutine中,即:同步调用),否则会panic。只有在unlock()之后才能再次Lock()。异步调用Lock(),是正当的锁竞争,当然不会有panic了。适用于读写不确定场景,即读写次数没有明显的区别...阅读全文

博文 2018-10-12 20:28:08 roteman

Golang学习笔记-sync

Mutex sync.Mutex为互斥锁,同一时间只能有一个goroutine获得互斥锁。 使用Lock()加锁,Unlock()解锁,加锁前不能解锁,加锁后不能继续加锁。 已经锁定的 Mutex 并不与特定的 goroutine 相关联,可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁。 适用于同一时间只能有一个goroutine访问资源的场景。 下面的代码如果不使用Mutex,输出的会是1 1 2 2 3 3而不是1 2 3 1 2 3。 package main import ( "fmt" "sync" "time" ) var ( mutex sync.Mutex ) func print123(){ mutex.Lock() defer mut...阅读全文

博文 2019-12-18 05:32:40 土豆吞噬者

Go36-27,28-条件变量

条件变量 条件变量(conditional variable),和互斥锁一样,也是一个同步工具。我们常常会把条件变量与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。 作用 条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程。 使用条件变量的最大优势就是在效率方面的提升。当共享资源的状态不满足条件的时候,想操作它的线程再也不用循环往复的做检查了,只要等待通知就好了。 使用条件变量 条件变量需要与互斥锁配合使用。条件变量的初始化需要互斥锁,并且它的方法有的也是基于互斥锁的。 条件变量提供的方法有三个: 等待通知(wait) 单发通知(signal) 广播通知(br...阅读全文

博文 2019-01-27 07:35:12 骑士救兵

golang 每日一包之sync.cond

该包结构如下: sync包结构 1:Cond类型其结构如下:Locker 的传入类型可以为*Mutex 或 *RWMutex cond结构 其主要方法如下:1. 构造方法 该方法用于初始化一个cond实例2. 广播 该方法用于唤醒所有因条件等待的协程3. 单个通知 该方法用于通知获得锁的单个协程4. 等待阻塞 等待 c.L 解锁并挂起 goroutine,在稍后恢复执行后,Wait 返回前锁定 c.L,只有当被 Broadcast 和 Signal 唤醒,Wait 才能返...阅读全文

博文 2020-03-23 15:33:20 Orain

用Go学UNIX环境编程 - 记录锁

本文参考《Unix环境高级编程》,Mac下实验结果可能会和书上有所不同(因为书上是以freeBSD进行实验),希望读者可以在不同的系统下进行实验,如果文章有错误的地方,还请提出,我会及时修正。 一、背景: 试想一下当两个人同时编辑一个文件时,其后果是什么样的呢?在unix系统中,文件的状态取决于写该文件的最后一个进程,比如数据库系统,需要保证多个进程写文件,依旧保持正确性。因此unix提供了记录锁的机制,作用是当一个进程正在读或者写一个文件时可以阻止另一个进程对同一个区域进行保护避免冲突。 在go语言里提供了两个接口来实现记录锁 syscall.Flock:支持整个文件记录锁 syscall.FcntlFlock: 支持字节范围记录锁 二、文件记录锁 2.1: 说明 syscall: Flo...阅读全文

博文 2019-10-13 18:32:43 jiangjincc

go-channel初识

了解过go的都知道,go最为突出的优点就是它天然支持高并发,但是所有高并发情况都面临着一个很明显的问题,就是并发的多线程或多协程之间如何通信,而channel就是go中goroutine通信的‘管道’。 channel在go中时如何使用的 package main import ( "fmt" "os" "os/signal" "syscall" "time" ) var exit = make(chan string, 1) func main() { go dealSignal() exited := make(chan struct{}, 1) go channel1(exited) count := 0 t := time.Tick(time.Second) Loop: for { ...阅读全文

博文 2020-03-17 05:32:45 GGBond_8488

golang面试基础系列-解锁deadlock(四)

在 go 中经常会使用 channel,进行并发执行子任务,提高执行效率。但一不小心就会踩到 deadlock 的坑,本文就来解析一下常见的死锁形式和解决方式。 1. 直接读取空 chan 产生死锁 package main import ( "fmt" ) func main() { ch := make(chan int, 3) <-ch } 输出结果: fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /home/work/code/golang/src/interview/go/deadlock/test.go:9 +0x56 Process finis...阅读全文

博文 2019-07-28 20:32:37 热爱coding的稻草

Go语言学习 - Sync.Pool

Introduction 直接说吧, 这个东西为什么存在, 为了解决什么问题: 假设我们需要频繁申请内存用于存放你的结构体, 而这个结构体本身是短命的, 可能这个请求过去你就不用了. 申请了这么多内存, 对于GC来说就是一种压力了. 针对这个问题, 如果我们能产生一个池子, 用于存放这些短命内存, 理想情况中下次请求来了, 直接从池子中拿就好了, 那么GC的时候我们直接清理池子就完事了, 算是一种GC的优化套路. 你天天用(于debug)的fmt就使用了这个东西, fmt总是需要很多[]byte对象, 但是用一次就申请一次内存显然是不现实的, 于是就整了个它, 每次需要[]byte就从ppFree池中拿一个出来 fmt.Println() 调用 -> fmt.Fprintln() 调用 ->...阅读全文

博文 2020-01-05 11:34:15 xiaohan.liang?

Golang Mutex 源码翻译

翻译自 Go 源码文件 sync/mutex.go。 // sync 包提供了基本的 **同步原语** (synchronization primitives) 例如 **互斥锁**(mutual exclusion locks)。 // 除了 Once 和 WaitGroup 类型,很多是为了低级库的常规使用。 // 高级别的同步最好用通道(channels)和通信(communications)来做。 // // 在这个包下定义的变量或类型不应该被复制使用。 package sync import ( "internal/race" "sync/atomic" "unsafe" ) func throw(string) // 在 runtime 包下提供了此方法 // 一个 Mutex ...阅读全文

博文 2020-01-09 23:32:40 Robin92

Bytom Dapp 开发笔记(三):Dapp Demo前端源码分析

本章内容会针对比原官方提供的dapp-demo,分析里面的前端源码,分析清楚整个demo的流程,然后针对里面开发过程遇到的坑,添加一下个人的见解还有解决的方案。 储蓄分红合约简述 为了方便理解,这里简单说说储蓄分红合约的内容,具体可以查看储蓄分红合约详细说明,储蓄分红,顾名思义就是储蓄之后,当达到一定的时间,按照比例返回本息这样的意思,所以demo中拆分成saving(储蓄)与profit(提现)两个页面,本章内容是针对合约交易的提交,所以只针对储蓄页面说明。 比原官方Dapp-demo使用说明 比原官方demo地址 1)访问的前提需要用chrome打开比原官方demo地址,同时安装bycoin插件,在应用商店搜索就行; 2)安装完bycoin,需要初始化用户信息,新建或者导入备份文件去恢复...阅读全文

博文 2019-08-28 11:02:41 比原链Bytom

golang面试基础系列-解锁deadlock(四)

在 go 中经常会使用 channel,进行并发执行子任务,提高执行效率。但一不小心就会踩到 deadlock 的坑,本文就来解析一下常见的死锁形式和解决方式。 1. 直接读取空 chan 产生死锁 package main import ( "fmt" ) func main() { ch := make(chan int, 3) <-ch } 输出结果: fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /home/work/code/golang/src/interview/go/deadlock/test.go:9 +0x56 Process finis...阅读全文

博文 2019-07-28 20:32:39 热爱coding的稻草

groupchace 源码系列二 sigleflight

参考 golang防缓存击穿利器--singleflight protobuf、LRU、sigleflight groupcache源码分析(四)-- singleflight 一、缓存击穿 给缓存加一个过期时间,下次未命中缓存时再去从数据源获取结果写入新的缓存,这个是后端开发人员再熟悉不过的基操。本人之前在做直播平台活动业务的时候,当时带着这份再熟练不过的自信,把复杂的数据库链表语句写好,各种微服务之间调用捞数据最后算好的结果,丢进了缓存然后设了一个过期时间,当时噼里啪啦两下写完代码觉得稳如铁蛋,结果在活动快结束之前,数据库很友好的挂掉了。当时回去查看监控后发现,是在活动快结束前,大量用户都在疯狂的刷活动页,导致缓存过期的瞬间有大量未命中缓存的请求直接打到数据库上所导致的,所以这个经典的问...阅读全文

博文 2019-03-14 22:34:42 懒皮