稻草人技术博客

Keep Calm and Carry On
私信 关注
Shower稻草人
码龄7年

Keep calm and carry on

  • 1,047,258
    被访问量
  • 163
    原创文章
  • 4,831
    作者排名
  • 231
    粉丝数量
  • 于 2014-01-14 加入CSDN
获得成就
  • 获得196次点赞
  • 内容获得69次评论
  • 获得449次收藏
荣誉勋章
TA的专栏
  • Golang
    86篇
  • 分布式
    1篇
  • Python
    21篇
  • PHP
    126篇
  • MySQL
    47篇
  • RPC
    9篇
  • Algorithm
    65篇
  • Architecture
    33篇
  • Kafka
    2篇
  • Linux
    31篇
  • Web
    29篇
  • Nginx
    18篇
  • DataStructure
    14篇
  • Redis
    23篇
  • Memcached
    3篇
  • Laravel
    4篇
  • HTML/CSS
    6篇
  • JavaScript
    20篇
  • jQuery
    18篇
  • Smarty
    3篇
  • Git
    6篇
  • SVN
    2篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

分布式系统一致性问题与Raft算法

什么是分布式一致性问题首先,什么是分布式系统一致性问题?分布式系统这个词应该不用多解释,简单地说就是由多个节点(一个节点即一台物理机器或一个进程),异步得通过网络通讯而组成的系统。而一致性(Consistency),这个词在不同的场景下有不同的含义,比方说大家比较熟的应该是在关系型数据库中事务的一致性。但在分布式系统中,一致性的基本含义是对进行进行一个或多个操作指令之后,系统内的其他成员对这些操作指令的结果能够达成共识,也就是对结果的看法是一致的。举个例子,比方说有多个客户端,这些客户端出于某种原因,
转载
115阅读
0评论
0点赞
发布博客于 3 月前

sarama 源码学习

ConsumerGroupKafka 消费的过程似乎大致上可以分为 ConsumerGroup 的 Rebalance 协议和 Partition 消费协议两部分,这里先看 ConsumerGroup 部分。ConsumerGroup 的 Rebalance 是 Kafka 消费侧扩展性的体现,通过将 Partition 分配给 Consumer 实现扩展消费能力,在增加 Consumer 时执行 Rebalance,将 Partition 重新均摊给新加入的 Consumer,是一个 pre-shar
转载
239阅读
1评论
0点赞
发布博客于 3 月前

Go 函数选项模式

Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?有很多可能的方法可以做到这一点, 但是大
转载
55阅读
0评论
0点赞
发布博客于 4 月前

如何实现一个延迟队列

前言延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案。前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因此我也在网上调研了一系列不同的延迟队列的实现方案,在此进行了一个总结并且给大家进行分享。延迟队列定义首先,队列这种数据结构相信大家都不陌生,它是一种先进先出的数据结构。普通队列中的元素是有序的,先进入队列中的元素会被优先取出进行消费;延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在
转载
103阅读
0评论
0点赞
发布博客于 4 月前

Go中json.Unmarshal对数字类型的处理

JSON的规范中,对于数字类型,并不区分是整型还是浮点型。对于如下JSON文本:{ "name": "ethancai", "fansCount": 9223372036854775807}如果反序列化的时候指定明确的结构体和变量类型package mainimport ( "encoding/json" "fmt")type User struct { Name string FansCount int64}func m
转载
394阅读
0评论
0点赞
发布博客于 4 月前

Go context 超时控制

常见方法context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) // 指定时长超时结束context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) // 手动结束context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) // 指定时间结束
转载
163阅读
0评论
0点赞
发布博客于 5 月前

Go 在orm中使用反射

作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对active_record的强大肯定深有体会(得益于的method_missing和define_method方法,少写了
转载
98阅读
0评论
0点赞
发布博客于 5 月前

Go 语言中Select与for结合使用break

func test(){ i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5{ fmt.Println("break now") break } fmt.Println("i
转载
169阅读
0评论
0点赞
发布博客于 5 月前

Go并发模型:合理退出并发协程

目录说明master:使用stop通道,主动告知goroutine退出stop_channel:和master相同detect_close_channel: 示例可以使用for-range替代for-select,range能检测通道关闭,自动退出detect_close_channel_v2:在前一个基础上,增加了监控功能,必须使用for-select,使用ok方法检测通道关闭,退出协程goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这
转载
184阅读
0评论
0点赞
发布博客于 5 月前

Go并发模型:流水线模型

Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。Golang的并发核心思路Golang并发核心思路是关注数据流动。数据流动的过程交给channel,数据处理的每个环节都交给goroutine,把这些流程画起来,有始有终形成一条线,那就能构成流水线模型。但
转载
116阅读
0评论
0点赞
发布博客于 5 月前

全面认识高并发

高并发,几乎是每个程序员都想拥有的经验。原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时、CPU load升高、GC频繁、死锁、大数据量存储等等,这些问题能推动我们在技术深度上不断精进。在过往的面试中,如果候选人做过高并发的项目,我通常会让对方谈谈对于高并发的理解,但是能系统性地回答好此问题的人并不多,大概分成这样几类:1、对数据化的指标没有概念:不清楚选择什么样的指标来衡量高并发系统?分不清并发量和QPS,甚至不知道自己系统的总用户量、活跃用户量,平峰和高峰时的QPS和TPS等关键
转载
132阅读
0评论
0点赞
发布博客于 5 月前

Go 依赖注入库dig

简介今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。快速使用第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装:$ go get go.uber.org/dig$ go get gopkg.in/ini.v1$ go get github.
转载
145阅读
0评论
0点赞
发布博客于 5 月前

Golang视角下的设计模式

这篇文章想聊聊Golang语言下的设计模式问题,我觉得这个话题还是比较有意思的。Golang没有像java那样对设计模式疯狂的迷恋,而是摆出了一份“看庭前花开花落,望天空云卷云舒”的姿态。单例模式:Gloang的单例模式该怎么写?随手写一个,不错,立马写出来了。但这个代码有什么问题呢?多个协程同时执行这段代码就会出现问题:instance可能会被赋值多次,这段代码是线程不安全的代码。那么如何保证在多线程下只执行一次呢?条件反射:加锁。。。加锁是可以解决问题。但不是最优的方案,因为如果有1W并发,每一个线
转载
64阅读
0评论
0点赞
发布博客于 5 月前

Elasticsearch理解

生活中的数据搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:结构化数据非结构化数据结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。说明:如果要更细致
转载
85阅读
0评论
0点赞
发布博客于 5 月前

Go context详解

什么是 contextGo 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。context.Context
转载
624阅读
0评论
1点赞
发布博客于 5 月前

Golang test编译使用

创建文件my_test.gopackage testsimport "testing"func TestMy(t *testing.T) { t.Log("TestMy")}通常用法:$ go test -v -run TestMy my_test.go=== RUN TestMy TestMy: my_test.go:6: TestMy--- PASS: TestMy (0.00s)PASSok command-line-arguments 0.619s
原创
304阅读
0评论
0点赞
发布博客于 7 月前

一个秒杀系统的设计思考

前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。整体思考1 秒杀存在的问题对于一个日常平稳的业务系统,如果直接开通秒杀功能...
转载
614阅读
0评论
1点赞
发布博客于 10 月前

TCP 为什么三次握手

参考文章Why do we need a 3-way handshake? Why not just 2-way大部分网络博客的错误解读首先需要声明的是, 百度搜索到的大部分网络博客关于这个问题的解答都是不清晰或者不准确的。 讨论这个问题的大部分博客都会引用《计算机网络》的内容:防止已失效的连接请求又传送到服务器端,因而产生错误不幸的是, 这种解释是不准确的, TCP 采用三次握手的...
转载
160阅读
0评论
0点赞
发布博客于 10 月前

UDP如何实现可靠性传输

1 UDP与TCP的区别TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP是User Datagram Protocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。可靠性由上层应用实现,所以要实现udp可靠性传输,必须通过应用层来实现和控制。2 TCP如何实现可靠性传输?确认机制、...
转载
560阅读
0评论
0点赞
发布博客于 10 月前

TCP和UDP的区别

TCP与UDPTCP与UDP基本区别基于连接与无连接TCP要求系统资源较多,UDP较少;UDP程序结构较简单流模式(TCP)与数据报模式(UDP);TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证UDP应用场景:面向数据报方式网络数据大多为短消息拥有大量Client对数据安全性无特殊要求网络负担非常重,但对响应速度要求高编程时的区别soc...
转载
124阅读
0评论
0点赞
发布博客于 10 月前

tcpdump常用命令

tcpdump 参数-c <number>: 指定抓包个数tcpdump -c 2tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on atcp_veth0, link-type EN10MB (Ethernet), capture size 65535 by...
转载
208阅读
0评论
0点赞
发布博客于 10 月前

Nginx 架构原理

简介Nginx(发音为“engine X”)是由俄罗斯人 Igor Sysoev 编写的一个免费的、开源的、高性能的 HTTP 服务器和反向代理,也是一个电子邮件(IMAP/POP3/SMTP)代理服务器,其特点是占有内存少,并发能力强。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和较低的资源消耗而闻名 。目前 Nginx 已经被 F5 收购。Nginx由内核和一系列模块组成,内核提...
转载
210阅读
0评论
0点赞
发布博客于 10 月前

微服务下实现数据一致性

本人最近学习了一下微服务下数据一致性的特点,总结了下目前的保障微服务下数据一致性的几种实现方式如下,以备后查。此篇文章旨在给大家一个基于微服务的数据一致性实现的大概介绍,并未深入展开,具体的实现方式本人也在继续学习中,如有错误,欢迎大家拍砖。1. 传统应用的事务管理1.1 本地事务再介绍微服务下的数据一致性之前,先简单地介绍一下事务的背景。传统单机应用使用一个RDBMS作为数据源。应用开启事...
转载
128阅读
0评论
0点赞
发布博客于 10 月前

使用 Gomock 进行单元测试

在实际项目中,需要进行单元测试的时候。却往往发现有一大堆依赖项。这时候就是 Gomock 大显身手的时候了Gomock 是 Go 语言的一个 mock 框架,官方的那种。安装$ go get -u github.com/golang/mock/gomock$ go install github.com/golang/mock/mockgen第一步:我们将安装 gomock 第三方库和...
转载
1599阅读
0评论
0点赞
发布博客于 10 月前

什么是真正的架构设计

一. 什么是架构和架构本质在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。Linux有架构,MySQL有架构,JVM也有架构,使用Java开发、MySQL存储、跑在Linux上的业务系统也有架...
转载
234阅读
0评论
0点赞
发布博客于 10 月前

分布式事务解决方案

前言最近很久没有写博客了,一方面是因为公司事情最近比较忙,另外一方面是因为在进行 CAP 的下一阶段的开发工作,不过目前已经告一段落了。接下来还是开始我们今天的话题,说说分布式事务,或者说是我眼中的分布式事务,因为每个人可能对其的理解都不一样。分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事务来简...
转载
102阅读
0评论
0点赞
发布博客于 10 月前

亿级规模的 Feed 流系统设计

简介Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。 在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条咨询或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用户也就可以在移动设备...
转载
182阅读
0评论
0点赞
发布博客于 10 月前

Go调试工具Delve

安装首先你必须有等于或高于1.8版本的Go,我的版本是:userdeMBP:go-learning user$ go versiongo version go1.11.4 darwin/amd64我是用的是Mac,所以使用的是OSX安装方法:然后使用go get 进行安装:go get -u github.com/go-delve/delve/cmd/dlv使用这种方法,你将无法...
转载
464阅读
0评论
0点赞
发布博客于 10 月前

HTTP/2笔记之流和多路复用

前言本部分将讲解HTTP/2协议中对流的定义和使用,其实就是在说HTTP/2是若何做到多路复用的。流和多路复用的关系1. 流的概念流(Stream),服务器和客户端在HTTP/2连接内用于交换帧数据的独立双向序列,逻辑上可看做一个较为完整的交互处理单元,即表达一次完整的资源请求-响应数据交换流程;一个业务处理单元,在一个流内进行处理完毕,这个流生命周期完结。特点如下:一个HTTP/2...
转载
101阅读
0评论
0点赞
发布博客于 10 月前

如何设计一个安全的对外接口

最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。安全措施个人觉得安全措施大体来看主要在两个方面,一方面就是如何保证数据在传输过程中的安全性,另一个方面是数据已经到达服务器端,服务器端如何识别数据,如何不被攻击;下面具体看看都有哪些安全措施。1. 数据加密我们知道数据在传输过程中是很容易被抓...
转载
136阅读
0评论
0点赞
发布博客于 10 月前

Go堆排序

package mainimport "fmt"// Heap 定义堆排序过程中使用的堆结构type Heap struct { arr []int // 用来存储堆的数据 size int // 用来标识堆的大小}// adjustHeap 用于调整堆,保持堆的固有性质func adjustHeap(h Heap, parentNode int) ...
转载
99阅读
0评论
0点赞
发布博客于 10 月前

从源码透析gRPC调用原理

gRPC是如何work的,清楚的理解其调用逻辑,对于我们更好、更深入的使用gRPC很有必要。因此我们必须深度解析下gRPC的实现逻辑,在本文中,将分别从客户端和服务端来说明gRPC的实现原理。准备条件本文将以gRPC Github上helloword代码作为一个完整的项目示例作为介绍的基础,在展开分析之前,简单介绍下作为gRPC的文件结构:greeter_clientgreeter_ser...
转载
256阅读
0评论
0点赞
发布博客于 10 月前

Go遍历二叉树

package main import "fmt"type Node struct { Val int Left *Node Right *Node}// 1// / \// 2 3// / \ / \// 4 5 6 7func main() { head := &No...
原创
93阅读
0评论
0点赞
发布博客于 10 月前

Go单链表反转

package mainimport ( "fmt")type Node struct { Val int Next *Node}func reverse(listNode *Node) *Node { var node *Node head := listNode for head != nil { head.Nex...
原创
258阅读
0评论
1点赞
发布博客于 11 月前

RabbitMQ与Kafka

导言作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别,但是这两种技术在底层实现方面是有许多差异的。不同的场景需要不同的解决方案,选错一个方案能够严重的影响你对软件的设计,开发和维护的能力。这篇文章会先介绍一下基本的异步消...
转载
174阅读
0评论
1点赞
发布博客于 11 月前

Golang调用so文件示例

测试动态库test_so.hint test_so_func(int a,int b);test_so.c#include "test_so.h"int test_so_func(int a,int b){ return a*b;}生成sogcc -shared ./test_so.c -o test_so.so复制so文件到Go项目目录Go项目目录load...
转载
1698阅读
2评论
0点赞
发布博客于 11 月前

Golang跟踪剖析trace的使用

单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PProf 是很难分析出来的,但如果你又想知道上述的答案的话,你可以用本文的主角 go tool trace 来打开新世界的大门。...
转载
1779阅读
0评论
1点赞
发布博客于 11 月前

Go优雅的重启服务

知识点信号量的了解。应用热更新。本文目标在前面编写案例代码时,我相信你会想到,每次更新完代码,更新完配置文件后,就直接这么 ctrl+c 真的没问题吗,ctrl+c到底做了些什么事情呢?在这一节中我们简单讲述 ctrl+c 背后的信号以及如何在Gin中优雅的重启服务,也就是对 HTTP 服务进行热更新。ctrl + c内核在某些情况下发送信号,比如在进程往一个已经关闭的管道写数...
转载
863阅读
0评论
0点赞
发布博客于 1 年前

Go Modules 入门

Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。而 Go1.14,在近期也终于正式发布,Go 官方亲自 “喊” 你来用:因此在今天这篇文章中,我...
转载
315阅读
0评论
1点赞
发布博客于 1 年前

gRPC及相关介绍

项目地址:https://github.com/EDDYCJY/go-grpc-example作为开篇章,将会介绍 gRPC 相关的一些知识。简单来讲 gRPC 是一个 基于 HTTP/2 协议设计的 RPC 框架,它采用了 Protobuf 作为 IDL你是否有过疑惑,它们都是些什么?本文将会介绍一些常用的知识和概念,更详细的会给出手册地址去深入一、RPC什么是 RPCRPC 代指远程...
转载
134阅读
0评论
0点赞
发布博客于 1 年前

浅谈gRPC

简述gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、...
转载
836阅读
0评论
2点赞
发布博客于 1 年前

PHP数组的底层结构

PHP数组数组是PHP中非常强大、灵活的一种数据类型,它的底层实现为散列表(HashTable,也称作:哈希表),除了我们熟悉的PHP用户空间的Array类型之外,内核中也随处用到散列表,比如函数、类、常量、已include文件的索引表、全局符号表等都用的HashTable存储。散列表是根据关键码值(Key value)而直接进行访问的数据结构,它的key - value之间存在一个映射函数,...
转载
591阅读
0评论
0点赞
发布博客于 1 年前

PHP变量的底层结构

PHP变量变量是一个语言实现的基础,变量有两个组成部分:变量名、变量值,PHP中可以将其对应为:zval、zend_value,这两个概念一定要区分开,PHP中变量的内存是通过引用计数进行管理的,而且PHP7中引用计数是在zend_value而不是zval上,变量之间的传递、赋值通常也是针对zend_value。PHP中可以通过关键词定义一个变量:关键词定义一个变量:关键词定义一个变量:a;,...
转载
181阅读
0评论
1点赞
发布博客于 1 年前

SOLID 设计原则

SOLID 原则基本概念:程序设计领域, SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的重要组...
转载
63阅读
0评论
0点赞
发布博客于 1 年前

Go二分查找

package mainimport "fmt"func main() { data := []int{1,2,3,4,5,8,10} fmt.Println(binFind(data,8)) fmt.Println(binFind(data,9))}func binFind(data []int, item int) int { if len(dat...
原创
125阅读
0评论
1点赞
发布博客于 1 年前

Protobuf简介

Protobuf简介1、Protobuf简介Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,protobuf更小、更快、更便捷。protobuf是跨语言的,并且自带一个编译器(protoc),只需要用protoc进行编译,就可以编译成Java、Python...
转载
178阅读
0评论
0点赞
发布博客于 1 年前

RPC框架原理简介

什么是RPC框架?RPC,全称为Remote Procedure Call,即远程过程调用,是一种计算机通信协议。比如现在有两台机器:A机器和B机器,并且分别部署了应用A和应用B。假设此时位于A机器上的A应用想要调用位于B机器上的B应用提供的函数或是方法,由于A应用和B应用不在一个内存空间里面,所以不能直接调用,此时就需要通过网络来表达调用的方式和传输调用的数据。也即所谓的远程调用。RPC ...
转载
352阅读
0评论
1点赞
发布博客于 1 年前

HTTP/2 核心特性

HTTP/1.1服役的这二十余年,互联网发生了翻天覆地的变化,由于各种业务场景的复杂度今非昔比,HTTP/1.1越来越容易遭受“嫌弃”,此时HTTP/2闪亮登场,本文主要列举描述其核心特性。基于HTTPS虽然RFC规范并没有约束HTTP/2必须基于HTTPS才能使用,但业界浏览器实现都依赖HTTPS前提条件,如果要升级到HTTP/2,第一步是升级到HTTPS。二进制分帧在HTTP/2之前,...
转载
111阅读
0评论
0点赞
发布博客于 1 年前

大型互联网公司微服务架构进化史

一、微服务架构介绍微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。概念:把一个大型的单个应用程序和服务拆分为数个甚...
转载
364阅读
0评论
1点赞
发布博客于 1 年前

HTTP/2 简介

前言HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540...
转载
219阅读
0评论
0点赞
发布博客于 1 年前

高性能短链服务设计

前言今天,我们来谈谈如何设计一个高性能短链系统,短链系统设计看起来很简单,但每个点都能展开很多知识点,也是在面试中非常适合考察侯选人的一道设计题,本文将会结合我们生产上稳定运行两年之久的高性能短链系统给大家简单介绍下设计这套系统所涉及的一些思路,希望对大家能有一些帮助。本文将会从以下几个方面来讲解,每个点包含的信息量都不少,相信大家看完肯定有收获短链有啥好处,用长链不香吗短链跳转的基本原...
转载
223阅读
0评论
0点赞
发布博客于 1 年前

从单体架构到微服务的发展历程

架构的演变过程:单体架构——>垂直架构——>soa面向服务架构——>微服务架构单体架构:特点:所有功能集中在一个项目中所有功能都要达成war包部署到服务器通过集群(session共享集群)来提高服务器的性能优点:项目架构简单,前期开发的成本低,周期短,小型企业首先.缺点:全部的功能都集中在一个项目中完成,对于大型项目来说,开发难度高,不容易开发及扩...
转载
353阅读
0评论
0点赞
发布博客于 1 年前

微服务系统架构演变

系统架构演变随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此也不断的演进、升级、迭代。从单一应用,到垂直拆分,到分布式服务,到SOA,以及现在火热的微服务架构,还有在Google带领下来势汹涌的Service Mesh。我们到底是该乘坐微服务的船只驶向远方,还是偏安一隅得过且过?其实生活不止眼前的苟且,还有诗和远方。所以我们今天就回顾历史,看一看系统架...
转载
111阅读
0评论
0点赞
发布博客于 1 年前

RPC和HTTP的区别

http是指从客户端到服务器端的请求消息,rpc是远程过程调用协议,它们之间有什么区别呢,下面是小编整理的相关内容,希望对大家有所帮助!RPC和HTTP的区别是什么rpc和http的存在重大不同的是:http请求是使用具有标准语义的通用的接口定向到资源的,这些语义能够被中间组件和提供服务的来源机器进行解释。结果是使得一个应用支持分层的转换(layers of transformation)和间...
转载
239阅读
0评论
0点赞
发布博客于 1 年前

操作系统中的进程调度策略

先来先服务调度算法:先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行...
转载
192阅读
0评论
0点赞
发布博客于 1 年前

如何保证缓存与数据库的双写一致性

问题如何保证缓存与数据库的双写一致性?心理分析你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?问题剖析一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。串行化可以保证...
转载
66阅读
0评论
1点赞
发布博客于 1 年前

MapReduce的工作原理

我们知道MapReduce诞生与搜索邻域,主要解决的是海量数据处理扩展性差的问题。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。它们的主要思想,都是从函数式编程语言里借来的。每次一个步骤方法会产生一个状态,这个状态会直接当参数传进下一步中。而不是使用全局变量。MapReduce框架MapReduce将复杂的,运行大规模集群上的并行计算过程高度地抽象两个函数:M...
转载
156阅读
0评论
0点赞
发布博客于 1 年前

IO多路复用的三种机制Select、Poll、Epoll

I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。相信大家都了解了Unix五种IO模型,不了解的可以 => 查看这里blocking IO - 阻塞...
转载
227阅读
0评论
0点赞
发布博客于 1 年前

秒杀系统设计参考

每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会。尤其是春节期间,大家不仅使用12306,还会考虑“智行”和其他的抢票软件,全国上下几亿人在这段时间都在抢票。“12306服务”承受着这个世界上任何秒杀系统都无法超越的QPS,上百万的并发再正常不过了!笔者专门研究了一下“12306”的服...
转载
245阅读
1评论
0点赞
发布博客于 1 年前

Redis的事务功能

MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项:Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 > 在一个Redis事务中,Re...
转载
35阅读
0评论
1点赞
发布博客于 1 年前

分布式事务方案

文章纲要此次分享的缘由目前分布式事务问题是怎么解决的行业中有什么解决方案这些解决方案分别有什么优缺点别人是怎么做的我们可以怎么来做此次分享的缘由支付重构考虑支付重构的时候,自然想到原本属于一个本地事务中的处理,现在要跨应用了要怎么处理。拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服务拆分,拆分成订单服务,账户服务。原本收到充值回调后,可以将修改订...
转载
45阅读
0评论
0点赞
发布博客于 1 年前

经典的 Top K 问题

什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这个问题也是十分经典的算法问题,不论是面试中还是实际开发中,都非常典型。而这个问题其实也有很多种做法,你真的都懂了么?一. 立刻就能想到的解法既然是要前 K 大的数,那么最直接的当然就是排序了,通过如快排等效率较高的排序算法,可以在平均 O(nlogn)的时间复杂度找到结果。这种方式在数据量不...
转载
44阅读
0评论
0点赞
发布博客于 1 年前

Redis主从复制原理

主从复制过程和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。全量同步Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份...
转载
52阅读
0评论
0点赞
发布博客于 1 年前

布隆过滤器的详解与应用

一、什么是Bloom FilterBloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思想...
转载
68阅读
0评论
0点赞
发布博客于 1 年前

分布式文件系统设计

分布式文件系统是分布式领域的一个基础应用,其中最著名的毫无疑问是 HDFS/GFS。如今该领域已经趋向于成熟,但了解它的设计要点和思想,对我们将来面临类似场景 / 问题时,具有借鉴意义。并且,分布式文件系统并非只有 HDFS/GFS 这一种形态,在它之外,还有其他形态各异、各有千秋的产品形态,对它们的了解,也对扩展我们的视野有所俾益。本文试图分析和思考,在分布式文件系统领域,我们要解决哪些问题、有...
转载
236阅读
0评论
0点赞
发布博客于 1 年前

基于Redis实现的分布式锁

写在前面现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理。说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了...
转载
111阅读
0评论
0点赞
发布博客于 1 年前

基于MySQL实现的分布式锁

概述在单机时代,虽然不需要分布式锁,但也面临过类似的问题,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就立即对这个资源进行加锁,当使用完资源之后,再解锁,其它线程就可以接着使用了。例如,在JAVA中,甚至专门提供了一些处理锁机制的一些API(synchronize/Lock等)。但是到了分布式系统的时代,这种线程...
转载
1496阅读
0评论
0点赞
发布博客于 1 年前

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如:系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户...
转载
187阅读
0评论
0点赞
发布博客于 1 年前

Redis 性能问题分析

在一些网络服务的系统中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题。比如微博,把热点微博1,最新的用户关系2,都存储在 Redis 中,大量的查询击中 Redis,而不走 MySQL。那么,针对 Redis 服务,我们能做哪些性能优化呢?或者说,应该避免哪些性能浪费呢?Redis 性能的基本面在讨论优化之前,我们需要知道,Redis 服务本身就有一些特性,比如单...
转载
214阅读
0评论
0点赞
发布博客于 1 年前

Hash算法

概述Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。  Hash主要...
转载
80阅读
0评论
0点赞
发布博客于 1 年前

大型分布式网站术语分析

1. I/O优化增加缓存,减少磁盘的访问次数。优化磁盘的管理系统,设计最优的磁盘方式策略,以及磁盘的寻址策略,这是在底层操作系统层面考虑的。设计合理的磁盘存储数据块,以及访问这些数据库的策略,这是在应用层面考虑的。例如,我们可以给存放的数据设计索引,通过寻址引来加快和减少磁盘的访问量,还可以采用异步和非阻塞的方式加快磁盘的访问速度。应用合理的RAID策略提升磁盘I/O。2. Web前...
转载
63阅读
0评论
0点赞
发布博客于 1 年前

Kafka高性能分析

前言在过去的几年里,软件架构领域发生了巨大的变化。人们不再认为所有的系统都应该共享一个数据库。微服务、事件驱动架构和CQRS(命令查询的责任分离 Command Query Responsibility Segregation)是构建当代业务应用程序的主要工具。除此以外,物联网、移动设备和可穿戴设备的普及,进一步对系统的近实时能力提出了挑战。首先让我们对“快”这个词达成共识,这个词是多方面的、...
转载
91阅读
0评论
0点赞
发布博客于 1 年前

Nginx高性能分析

Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快!Nginx 的进程模型Nginx 服务器,正常运行过程中:多进程:一个 Master 进程、多个 Worker 进程。Master 进程:管理 Worke...
转载
77阅读
0评论
1点赞
发布博客于 1 年前

Golang高性能分析

本文主要介绍了 Go 程序为了实现极高的并发性能,其内部调度器的实现架构(G-P-M 模型),以及为了最大限度利用计算资源,Go 调度器是如何处理线程阻塞的场景。怎么让我们的系统更快随着信息技术的迅速发展,单台服务器处理能力越来越强,迫使编程模式由从前的串行模式升级到并发模型。并发模型包含 IO 多路复用、多进程以及多线程,这几种模型都各有优劣,现代复杂的高并发架构大多是几种模型协同使用,不...
转载
192阅读
0评论
2点赞
发布博客于 1 年前

Go归并排序

package mainimport "fmt"func main() { data := []int{8, 9, 5, 7, 1, 2, 5, 7, 6, 3, 5, 4, 8, 1, 8, 5, 3, 5, 8, 4} fmt.Println(data) data = mergeSort(data) fmt.Println(data)}func m...
原创
50阅读
0评论
0点赞
发布博客于 1 年前

Redis的rehash机制

在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的。通过哈希表中的节点保存字典中的键值对。我们知道当HashMap中由于Hash冲突(负载因子)超过某个阈值时,出于链表性能的考虑,会进行Resize的操作。Redis也一样。在redis的具体实现中,使用了一种叫做渐进式哈希(rehashing)的机制来提高字典的缩放效率,避免...
转载
345阅读
0评论
1点赞
发布博客于 1 年前

MySQL主从同步延迟原理及解决方案

概述MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢?MySQL...
转载
147阅读
0评论
0点赞
发布博客于 1 年前

MySQL主从复制详解

为什么需要主从复制?1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。2、做数据的热备3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性...
转载
118阅读
0评论
0点赞
发布博客于 1 年前

短链接算法原理

平时我们在上网的时候,印象最深刻的有一次是短链接的服务。例如:平时在微信上看一个网页的时候,如果我们选择在浏览器打开的时候,会看到很长的URL,我们分享的时候,会看到一个很短URL,这就是本次所说的短链接的应用之一。长链接示例:https://mp.weixin.qq.com/s?__biz=MzAxNzMwOTQ0NA==&mid=2653355437&idx=1&sn...
转载
235阅读
0评论
0点赞
发布博客于 1 年前

关于消息队列

消息队列连环炮项目里怎么样使用 MQ 的?为什么要使用消息队列?消息队列有什么优点和缺点?kafka,activemq,rabbitmq,rocketmq 都有什么去呗?如何保证消息队列高可用?如何保证消息不被重复消费?如何保证消息的可靠性传输?如何保证消息的顺序性?写一个消息队列架构设计?消息队列技术选型解决的问题:解耦异步削峰不用 MQ 系统耦合场景...
转载
39阅读
0评论
0点赞
发布博客于 1 年前

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。一、平滑升级(优雅重启)的一般思路一般情况下,要实现平滑升级,...
转载
119阅读
0评论
1点赞
发布博客于 1 年前

Golang服务平滑重启

服务端代码经常需要升级,对于线上系统的升级常用的做法是,通过前端的负载均衡(如nginx)来保证升级时至少有一个服务可用,依次(灰度)升级。而另一种更方便的方法是在应用上做热重启,直接升级应用而不停服务。原理热重启的原理非常简单,但是涉及到一些系统调用以及父子进程之间文件句柄的传递等等细节比较多。处理过程分为以下几个步骤:监听信号(USR2)收到信号时fork子进程(使用相同的启动命...
转载
1503阅读
0评论
0点赞
发布博客于 1 年前

Goroutine调度机制

一、什么是Goroutine?Goroutine是go中最为关键的一个设计,在go提供的各种基础包中都能看到它的身影,goroutine实际上就是go语言提供的协程,但是此处要注意,这里的协程并不是传统意义上的协程。传统意义上的协程是指用户态线程,但是go所实现的协程实际上是两级线程模型,关于线程模型可以参考(https://blog.csdn.net/gatieme/article/detai...
转载
107阅读
0评论
0点赞
发布博客于 1 年前

单点登录原理与简单实现

一、单系统登录机制1、http无状态协议web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求...
转载
68阅读
0评论
0点赞
发布博客于 1 年前

Goroutine泄漏

概述在Go中,goroutine很轻量级,随便创建成千上万个goroutine不是问题,但要注意,要是这么多的goroutine一致递增,而不退出,不释放资源,可就麻烦了。 本文介绍goroutine泄露的实际场景,并讨论如何解决该问题。产生原因分析产生goroutine leak(协程泄露)的原因可能有以下几种:goroutine由于channel的读/写端退出而一直阻塞,导致goro...
转载
375阅读
0评论
0点赞
发布博客于 1 年前

一致性哈希详解

文章目录一、Redis集群的使用二、为Redis集群使用Hash三、使用Hash的问题四、一致性Hash算法的神秘面纱五、一致性Hash算法的容错性和可扩展性六、Hash环的数据倾斜问题七、一致性体现在哪里一、Redis集群的使用我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Sla...
转载
102阅读
0评论
0点赞
发布博客于 1 年前

Golang functional options

当我们定义了一个对象时,一般会创建一个方法方便外部初始化一个实例。如下面的例子:type Client struct { timeout int64 dialFunc func() error healthCheck func() bool} func NewClient(timeout int64, dialFunc func() error, healthChec...
转载
118阅读
0评论
0点赞
发布博客于 1 年前

Uber Go 语言编程规范

文章目录1. 介绍2. 编程指南2.1 指向 Interface 的指针2.2 Receiver 和 Interface2.3 mutex 默认 0 值是合法的2.4 拷贝 Slice 和 Map2.5 使用 defer 做资源清理2.6 channel 的 size 最好是 1 或者是 unbuffered2.7 枚举变量应该从 1 开始2.8 Error 类型2.9 Error Wrappin...
转载
96阅读
0评论
0点赞
发布博客于 1 年前

MySQL InnoDB事务隔离级别和锁机制

文章目录1.基础知识1.索引1.聚集索引2.辅助索引2.锁机制1.记录锁2.范围锁3.多粒度锁3.并发控制协议1.MVCC2.LBCC4.并发问题1.脏读2.不可重复读3.幻读2.事务隔离级别1.read uncommitted2.read committed3.repeatable read4.seraliable3.SQL加锁分析1.id列是主键,RC隔离级别2.id列是辅助唯一索引,RC隔离...
转载
172阅读
1评论
1点赞
发布博客于 1 年前

Redis五种数据类型的底层实现

简介Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大对象的底层数据编码可以用命令OBJECT ENCODING来...
转载
561阅读
0评论
0点赞
发布博客于 1 年前

缓存在大型分布式系统中的最佳应用

文章目录缓存概述缓存的原理缓存分类缓存媒介缓存设计CDN缓存CDN原理CDN优缺点CDN架构参考CDN技术实践反向代理缓存缓存原理Squid示例代理缓存比较分布式缓存MemcacheRedis本地缓存硬盘缓存内存缓存缓存架构示例缓存常见问题数据一致性缓存高可用缓存雪崩缓存穿透缓存概述缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。...
转载
149阅读
0评论
0点赞
发布博客于 1 年前

PHP-FPM 多进程模型

PHP-FPM 提供了更好的 PHP 进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。那么当我们谈论 PHP-FPM 多进程模型的时候,作为 PHPer 的你了解多少呢?首先,让我们一起看几个问题:①:PHP-FPM 启动进程的方式主要有哪几种,区别是什么?②:PHP-FPM,是主进程接收请求转给子进程,还是子进程单独接收请求并处理,如何验证?③:为何在 PHP-FPM 模式...
转载
450阅读
0评论
0点赞
发布博客于 1 年前

Nginx进程模型的理解

nginx模型有两种进程,master进程和worker进程。master进程主要用来管理worker进程,管理包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程...
转载
105阅读
0评论
0点赞
发布博客于 1 年前

MySQL视图的作用

MySQL视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,MySQL视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限...
转载
57阅读
0评论
0点赞
发布博客于 1 年前

MySQL视图

视图概述视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的操作。视图的概念视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据...
转载
27阅读
0评论
0点赞
发布博客于 1 年前

MySQL中Innodb的聚簇索引和非聚簇索引

聚簇索引数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种。Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中,中间的节点页保存指向下一层页面的指针。“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种。一般来说,将通过主键作为聚簇索引...
转载
105阅读
0评论
0点赞
发布博客于 1 年前

B树和B+树的区别

B树b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的...
转载
243阅读
0评论
0点赞
发布博客于 1 年前

LevelDB实现原理

LevelDb 101说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat。这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二。Jeff Dean其人:http://research.google.com/people/jeff/index.htm...
转载
78阅读
0评论
0点赞
发布博客于 1 年前

Gitflow工作流程

在工作场合实施Git的时候,有很多种工作流程可供选择,此时反而会让你手足无措。本文罗列了企业团队最常用的一些git工作流程,包括Centralized Workflow、Feature Branch Workflow、Gitflow Workflow、Forking Workflow。愿以此文抛砖引玉。在你开始阅读之前,请记住:这些流程应被视作为指导方针,而非“铁律”。我们只是想告诉你可能的做法...
转载
77阅读
0评论
0点赞
发布博客于 1 年前

Go实现简单快速排序

package mainimport "fmt"func main() { l := []int{5,6,3,2,7,9,8,1} fmt.Println(l) fmt.Println(quickSort(l))}func quickSort(list []int) []int { l := len(list) if l == 0 { ...
原创
63阅读
0评论
0点赞
发布博客于 1 年前