缓存和数据库一致性
业务处于起步阶段时,流量非常小,无论是读请求还是写请求,直接操作数据库即可,但是随着业务量的增长,项目请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题。 这个阶段通常的做法是,引入缓存来提高读性能。 我们常用的缓存方案一般是这样的: 写请求依旧只写数据库 读请求先读缓存,如果缓存不存在,则从数据库读取,并重建缓存 同时,写入缓存中的数据,都设置失效时间 ...
业务处于起步阶段时,流量非常小,无论是读请求还是写请求,直接操作数据库即可,但是随着业务量的增长,项目请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题。 这个阶段通常的做法是,引入缓存来提高读性能。 我们常用的缓存方案一般是这样的: 写请求依旧只写数据库 读请求先读缓存,如果缓存不存在,则从数据库读取,并重建缓存 同时,写入缓存中的数据,都设置失效时间 ...
在当今高度并发的数据库环境中,有效的并发控制是至关重要的。MVCC是MySQL中被广泛采用的并发控制机制,它通过版本管理来实现事务的隔离性,允许读写操作同时进行,提高数据库的并发性能和响应能力。 MVCC 介绍 MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,...
网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备……)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现”API First”的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。 协议 API与用户的通信协议,总是使用HTTPs协议。 域...
对于一个大型网站来说,随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须以增加服务器的方式,提高计算机系统的处理能力,计算速度,进而满足当前业务量的需求。那么如何实现服务器之间的协同功能呢?Nginx提供的反向代理和负载均衡功能是一个很好的解决方案。 反向代理 在Nginx服务器中,反向代理的配置非常简单,最主要的指令就是“proxy_pass”,用于设置后...
背景 在具体介绍一致性哈希算法之前,先问一个问题:为什么需要一致性哈希算法?下面我们通过一个案例来回答这个问题。 假设有这么一种场景:我们有三台缓存服务器分别为:node0、node1、node2,有3000万个缓存数据需要存储在这三台服务器组成的集群中,希望可以将这些数据均匀的缓存到三台机器上,你会想到什么方案呢? 我们可能首先想到的方案是:取模算法hash(key)%N,即:对缓存...
拿到一堆数据,去做架构也好,设计也好,可行性分析也好,工程上需要的是严谨。但是也有很多场景,比如即时的问题争辩和讨论,我们往往需要的是快速、直接的估算,这样的数据显然不需要非常精确,甚至可以说它一定会非常粗略,我们的目标往往只停留在 “量级” 的级别,但是我们依然可以对方案有一个具体的、量化的认知,这比像 “海量”、“高吞吐”、“低延迟” 这类感性的、描述性的表述还是要清晰和有力得多。 ...
sync包提供了基本的同步原语,如互斥锁、Once和WaitGroup类型等。 本包的类型的值不应被拷贝。 代码示例 Mutex 互斥锁 Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。 type ConcurrentMap struct { l *sync.Mutex m map[string]...
net/http import "net/http" http包提供了HTTP客户端与服务端的实现 服务端 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) }) http.HandleFunc("/go", func(w ht...
os包是Go语言标准库中的一个重要包,提供了与操作系统交互的功能。它通过封装了一系列系统调用,使得开发者可以在Go程序中访问和操作底层操作系统的资源。os包的实现依赖于不同的操作系统平台,以提供特定平台上可用的功能。 常用方法 os包提供了丰富的方法和函数,用于处理文件、目录、进程、环境变量等操作系统相关的功能。下面是一些常用的方法: 文件和目录操作:Create、Open、Mk...
原生 error 在 Go 的错误处理中,下面的代码占绝大多数: if err != nil { //.... return err } 在满足业务需求的情况下,这种错误处理其实是最推荐的方式,这种直接透传的方式让代码之间的耦合度更低。在很多情况下,如果不关心错误中的具体信息,使用这种方式就可以了。 提前定义好 error 原生的 error 在有些情况下使用起来就不是很...
本篇文章主要想讨论一下,Kubernetes 的 kubectl 命令中的使用到到的一个编程模式 – Visitor(注:其实,kubectl 主要使用到了两个一个是Builder,另一个是Visitor)。本来,Visitor 是面向对象设计模英中一个很重要的设计模款(参看Wikipedia Visitor Pattern词条),这个模式是一种将算法与操作对象的结构分离的一种方法。这种分离...
简单示例 我们先来看一个示例: package main import "fmt" func decorator(f func(s string)) func(s string) { return func(s string) { fmt.Println("Started") f(s) fmt.Println("Done") ...
在本篇文章中,我们学习一下函数式编程的中非常重要的Map、Reduce、Filter的三种操作,这三种操作可以让我们非常方便灵活地进行一些数据处理——我们的程序中大多数情况下都是在到倒腾数据,尤其对于一些需要统计的业务场景,Map/Reduce/Filter是非常通用的玩法。下面先来看几个例子: 基本示例 Map示例 下面的程序代码中,我们写了两个Map函数,这两个函数需要两个参数, ...
反转控制 IoC – Inversion of Control 是一种软件设计的方法,其主要的思想是把控制逻辑与业务逻辑分享,不要在业务逻辑里写控制逻辑,这样会让控制逻辑依赖于业务逻辑,而是反过来,让业务逻辑依赖控制逻辑。在《IoC/DIP其实是一种管理思想》中的那个开关和电灯的示例一样,开关是控制逻辑,电器是业务逻辑,不要在电器中实现开关,而是把开关抽象成一种协议,让电器都依赖之。这样的编...
在本篇文章中,我们来讨论一下 Functional Options这个编程模式。这是一个函数式编程的应用案例,编程技巧也很好,是目前在 Go 语言中最流行的一种编程模式。但是,在我们正式讨论这个模式之前,我们需要先来看看要解决什么样的问题。 配置选项问题 在我们编程中,我们会经常性的需要对一个对象(或是业务实体)进行相关的配置。比如下面这个业务实体(注意,这仅只是一个示例): type ...