9 nogos

尚未进行身份认证

我要认证

I can do it

等级
TA的排名 1w+

Golang 协程调度

一、线程模型N:1模型,N个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快但是无法利用多核系统的优点。1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。(POSIX线程模型(pthread),Java)M:N模型, 每个用户线程对应多个内核空间线程,同时也可以一个内核空间线程对应多个用...

2020-03-22 19:55:04

Epoll的本质(内部实现原理)

从事服务端开发,少不了要接触网络编程。epoll作为linux下高性能网络服务器的必备技术至关重要,nginx、redis、skynet和大部分游戏服务器都使用到这一多路复用技术。

2020-03-22 14:54:45

golang读写锁实现与核心原理分析

读写锁的特点  读写锁区别与互斥锁的主要区别就是读锁之间是共享的,多个goroutine可以同时加读锁,但是写锁与写锁、写锁与读锁之间则是互斥的写锁饥饿问题  因为读锁是共享的,所以如果当前已经有读锁,那后续goroutine继续加读锁正常情况下是可以加锁成功,但是如果一直有读锁进行加锁,那尝试加写锁的goroutine则可能会长期获取不到锁,这就是因为读锁而导致的写锁饥饿问题golang...

2020-03-10 18:41:01

golang mutex源码详细解析

  目前golang的版本是1.12,其中的mutex是增加了普通模式和饥饿模式切换的优化版本,为了便于理解,这里先从上一个版本1.7版本的mutex开始分析,以后再对优化版本进行说明。1.7版本Mutex实现Mutex定义// mutex是互斥锁// mutex的零值是没有加锁的//在使用之后不能被拷贝type Mutex struct { state int32 //状态...

2020-03-10 18:14:39

GO 互斥锁实现原理剖析

前言  互斥锁是并发程序中对共享资源进行访问控制的主要手段,对此Go语言提供了非常简单易用的Mutex,Mutex为一结构体类型,对外暴露两个方法Lock()和Unlock()分别用于加锁和解锁。  Mutex使用起来非常方便,但其内部实现却复杂得多,这包括Mutex的几种状态。另外,我们也想探究一下Mutex重复解锁引起panic的原因。  按照惯例,本节内容从源码入手,提取出实现原理,又...

2020-03-10 17:08:42

Golang 限流器 time/rate 使用介绍

  本主题为系列文章,分上下两篇。本文主要介绍 time/rate 的具体使用方法,另外一篇文章 《Golang 限流器 time/rate 实现剖析》 则着重介绍其内部实现原理。  限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket 等。  其实 golang 标准库...

2020-01-26 21:52:19

幂等

什么是幂等  简单说来,如果一个操作多次执行所产生的影响等价于执行一次的影响,我们就称之为幂等。  实际系统中,幂等是一个极为重要的概念。无论是在大型互联网应用还是企业级架构中,我们都见到REST API被越来越多的采用。而正确实现幂等,往往是API中最难的技术点之一。为什么重要,举一个简单易懂的例子。  比如,你要处理一次电商网站收款或者付款的交易。当你给微信支付发送这个付款请求后,一个理...

2019-11-28 23:58:22

微服务架构实现最终一致性的三种模式

  根据CAP理论,必须在可用性(Availability)和一致性(Consistency)之间做出选择。如果选择提供一致性,则需要付出在满足一致性之前阻塞其他并发访问的代价。这可能持续一段不确定的时间,尤其是系统已经表现出高延迟或者由于网络故障而失去连接时。  依据目前的成功经验,选择可用性一般更有利于微服务架构的构建,但是在服务和数据库之间维护数据一致性是非常根本的需求,在微服务架构中应该...

2019-11-24 12:56:23

Serverless概述

概念  我们把 Serverless 拆解为 server 和 less 两个单词,从字面上推断词意即为“少服务器的,亦或是无服务器的”。当然这并非指应用架构中是没有服务器资源的,而是通过 Serverless 这种服务形态,用户在使用对应的服务时,不需要关心或较少关心服务器的硬件资源、软件资源、稳定性等等,这些通常已经由云计算厂商提供设施、服务和 SLA 保障,完全托管给云计算厂商。而用户只需...

2019-11-19 16:56:32

1.3万亿条数据查询如何做到毫秒级响应?

  知乎,在古典中文中意为“你知道吗?”,它是中国的 Quora,一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织。  作为中国最大的知识共享平台,我们目前拥有 2.2 亿注册用户,3000 万个问题,网站答案超过 1.3 亿。随着用户群的增长,我们的应用程序的数据大小无法实现。我们的 Moneta 应用程序中存储了大约 1.3 万亿行数据(存储用户已经阅读过的帖子)。  由于每月...

2019-11-18 17:25:40

架构师必须了解的30条设计原则

众所周知,架构师的角色,更偏向于策划、而非指挥,塑造、而非支配,其存在的意义,在于引导大家讨论、而非自己主宰一切。但是,具体应该如何执行呢?本文作者整理了 30 个公认的架构原则,来帮助大家解决此问题。也许有的原则,你从未听说,但你看完就能快速学会。相信你学会了,工作起来也会事半功倍,或许还可帮你避免很多无用的加班!在 WSO2,我参与架构评审的时间已长达八年之久。WSO2 的产品非常丰富,...

2019-11-18 16:07:45

压测模型及其优缺点

压测模型抽象压测模型可以被抽象为如图所示的模型该模型主要包含如下三个部分:压测环境准备环境准备是压测的基础,主要包括1、压力机资源2、被压测系统3、依赖资源压测任务准备压测任务准备主要是为了梳理压测目标,确定压测方案,可以细化为如下几个方面:压测目标:比如期望达到的QPS、稳定性要求。压测场景:业务场景的选取、组合压测策略:逐步加压,增大脉冲,并发量等。压测执行闭环压...

2019-11-12 23:48:28

物化视图

Oracle物化视图  Oracle的物化视图是包括一个查询结果的数据库对像。将一些大的耗时的表连接用物化视图实现,会提高查询的效率。  物化视图在某种意义上说就是一个 物理表,物化视图会占用数据库磁盘空间,甚至可以创建索引。数据生成模式Build Immediate  创建物化视图的时候就生成数据 。Build Deferred(默认)  在创建时不生成数据,以后根据需要在生成数据...

2019-10-13 12:30:47

分库分表

  互联网行业中,由于有庞大的用户量存在,所以会产生海量的请求。这些请求产生的交易数据和信息都需要存储在关系型数据库中。由于数据量很大,单个数据库已经难以容纳所有数据,所以产生了分库分表的需求。分库分表,顾名思义,就是使用多个库和多个表甚至多个数据库实例来存储海量的数据。什么是分库分表  数据拆分是对数据分而治之的通用概念,在数据库存储方面是通过分库分表来实现数据拆分的,对数据的拆分主要体现在...

2019-10-09 21:03:47

什么是分布式锁?

单机多线程并发分布式集群环境下的多线程并发分布式锁的实现1 Memcached分布式锁利用Memcached的add命令。此命令是原子性操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。2 Redis分布式锁和Memcached的方式类似,利用Redis的setnx命令。此命令同样是原子性操作,只有在key不存在的情况下,才能set成功。(setn...

2019-08-12 13:20:10

pprof (golang 性能监控与分析)

参考文章https://blog.wolfogre.com/posts/go-ppof-practice/https://xguox.me/go-profiling-optimizing.html/https://segmentfault.com/a/1190000016412013https://github.com/google/pprof示例代码package mainimp...

2019-06-27 14:01:25

golang 深入理解map引用类型

理解指针什么是指针?指针是一种特殊的类型,指针变量的值是一个地址,该地址指向一个“指针类型”的变量指针声明var 指针变量名 *指针类型示例package mainimport( "fmt")func main() { var int_value = 10 var int_ptr = &int_value fmt.Printf("The ...

2019-05-28 13:07:35

TiDB 单机安装

官方地址: https://github.com/pingcap/docs-cn1 下载压缩包# 下载Tidb[root@admxj-core ~]# wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz# 下载Tidb校验文件wget http://download.pingcap.org/tidb-latest...

2019-05-22 16:58:19

缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。我不知道为什么这么多人用的都是这个逻辑...

2019-05-10 21:10:27

go面向对象 vs c++面向对象

面向对象的四大特性抽象—数据抽象(属性)和过程抽象(方法)封装—限定对外方法,控制数据访问继承—数据共享、代码重用多态—派生对象就是父对象c++ 抽象和封装#include <iostream>using namespace std;class rect {private: int length; //长度 int width; //宽度pu...

2019-04-11 17:28:06

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。