03 2022 档案
摘要:redis高可用 谈到redis的高可用,如何保证备份机器是原始服务器的完整备份呢,需要使用哨兵和复制 哨兵(sentinel):可以管理多个redis服务器,它提供了监控、提醒、故障转移的功能 复制(replication):则是负责让一个redis服务器可以配备多个备份服务器 redis正是利用
阅读全文
摘要:缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查询数据库 导致数据库CPU和内存负载过高,甚至数据库服务器挂掉 如何预防缓存雪崩 缓存的高可用性 缓存降级: 缓存降级指的是缓存失效或者缓存服务器挂掉的情况下,不去访问数据库,直接返回默认数据或者服务的内存数据 降级一
阅读全文
摘要:redis的高并发和快速的原因 redis是基于内存的,内存的读写速度极快 redis是单线程的,省去了很多上下文切换线程的时间 redis采用的多路复用技术,可以处理并发的连接,非阻塞IO内部实现采用epoll 为什么redis是单线程的 官方答案:因为redis是基于内存的,CPU不是redis
阅读全文
摘要:redis缓存和mysql数据一致性方案详解 方案1:延时双删策略 方案2:异步更新缓存(基于订阅binlog的同步机制) 需求起因 在高并发的业务场景下,数据库访问成为用户并发最薄弱的环节,所以就需要redis做一个缓冲操作, 让请求先访问到redis,而不是直接访问mysql数据库 读取redi
阅读全文
摘要:redis内存回收机制 redis的内存回收主要围绕一下两个方面 redis过期策略:删除过期时间的key值 redis淘汰策略:内存使用达到maxmemory上限时会触发内存淘汰数据 redis的过期策略和内存淘汰策略不是一回事 过期策略通常有以下3种 定时过期:为每个设置过期时间的key都需要创
阅读全文
摘要:方法1:半同步复制 介于异步复制和同步复制之间,主库在执行完客户端提交的事务后不会立即返回给客户端, 而是至少要等到一个从库接收并写到redo log中,才会返回给客户端,相对于异步复制,半同步复制提高了数据的安全性 半同步复制原理 事务在主库写完binlog后,需要从库返回一个已接收,才能返回给客
阅读全文
摘要:mysql 60题和答案 1. mysql中有哪几种锁? 表锁:开销小,加锁快,不会产生死锁,锁的粒度大,发生锁冲突的概率最高,并发度最低 行锁:开销大,加锁慢,会产生死锁,锁的粒度最小,发生锁冲突的概率最低,并发度最高 页面锁,开销和加锁时间介于表锁和行锁之间,会产生死锁,锁的粒度介于表锁和行锁之
阅读全文
摘要:1. 数据库动起来之后,会发生什么? 数据库日志 客户端之间因为锁而互相影响 总结,数据库动起来之后会产生一些列性能问题 需要理解日志、锁、事务的底层原理,才能应对问题 2. 什么日志不是给人看的 mysql日志体系 mysql为了满足主从复制,事务等, 有复杂的日志体系 server层产生的bin
阅读全文
摘要:怎么查询速度更快 where查询太慢怎么办 覆盖索引 覆盖索引指的是:查询语句从执行到返回结果均使用的是同一个索引 覆盖索引可以有效减少回表 using index在查询计划里面就叫索引覆盖 是否会使用覆盖索引,看下面的例子: 第一个会使用,第二个不会使用 explain select invent
阅读全文
摘要:goroutine调度器的 Q&A go栈和用户栈如何切换 goroutine如何退出 main goroutine执行完毕后整个进程退出,其它子goroutine也就结束了 goroutine调度时机有哪些 goroutine和线程的区别 从三个角度比较goroutine和tread的区别:内存消
阅读全文
摘要:一个sql语句如何执行? mysql软件架构是怎么样的? mysql常用的存储引擎 Innodb MyISAM Memory Archive Innodb是目前最流行的存储引擎,适合各种互联网业务 查询效率非常高的业务可以考虑MyISAM 日志信息归档可以考虑Archive,因为有压缩,磁盘利用率非
阅读全文
摘要:为什么需要分布式配置中心 不使用配置中心存在的问题 使用配置中心的方便 配置中心的选型 命名空间的作用:可以隔离配置集,将某些配置集放到某一个命名空间下,命名空间我们一般用来区分微服务 DataId: 配置集,一般一个配置集就是一个配置文件,实际上可以更灵活 组:抛出一个问题,现在确实能够隔离微服务
阅读全文
摘要:GC的认识 Q&A 什么是GC,有什么作用? GC全称garbage collection, 即垃圾回收,是一种自动内存管理的机制 当程序向操作系统申请的内存不在需要时,垃圾回收主动将其回收并供其它代码申请内存时复用,或者归还给操作系统 这种针对内存级别资源的自动回收过程,称为垃圾回收,而负责垃圾回
阅读全文
摘要:go中逃逸分析是怎么进行的 变量逃逸的基本原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸 简单来说编译器会分析代码的特征和代码的生命周期,go中的变量只有在编译器可以证明函数返回后不会再被引用的, 才会被分配到栈上,其它情况都分配到堆上 go语言中没有一个关键字或者函数可以直接让变量被
阅读全文
摘要:反射的 Q&A 概念 在go语言中,reflect可以用来在运行期间获取对象的类型信息和内存结构,reflect操作所需的全部信息都来自接口变量 接口变量除了保存自身的类型以外,还会保存实际对象的类型数据,reflect通过TypeOf函数和ValueOf函数, 将任何传入的对象都转换为接口类型 使
阅读全文
摘要:数组与切片 的 Q&A 切片作为函数参数 type slice struct { array unsafe.Pointer len int cap int } slice其实是一个结构体,包含三个成员,len、map、array,分别表示长度、容量和底层数组的地址 当slice作为函数参数时,就是一
阅读全文
摘要:案例1: func main() { slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s1 := slice[2:5] // s1=[2, 3, 4], len=3, cap=8 s2 := s1[2:6:7] // s2=[4, 5, 6, 7], len
阅读全文
摘要:什么是负载均衡,负载均衡策略有哪些? 什么是负载均衡 负载均衡的策略 集中式load balance 进程内load balance 优缺点: 独立进程负载均衡 总结:用的最多的是第二种,进程内负载均衡 常用的负载均衡算法 grpc的负载均衡策略 grpc从consul中同步服务信息,并进行负载均衡
阅读全文
摘要:go动态获取可用端口 func GetFreePort() (int, error) { // 动态获取可用端口 addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0") if err != nil { return 0, err } fmt.Pri
阅读全文
摘要:标准库 unsafe 的 Q&A go指针和 unsafe.Pointer有什么区别? 1. go语言的作者ken thompson也是c语言的作者,所以go可以看做c系语言,它的很多特性和c类似, 指针就是其中之一,然而go语言的指针相比c语言的指针又很多限制,当然也是为了安全考虑, 相比于c语言
阅读全文
摘要:标准库 context Q&A 参考文档 context如何被取消 1. context.Context讲解 type Context interface { // 返回context是否会被取消,以及自动取消时间 Deadline() (deadline time.Time, ok bool) /
阅读全文
摘要:interface Q&A Go接口与C++接口有何异同? 1. 接口定义了一种规范,描述了类的行为和功能,而不做具体实现 2. C++定义的接口称为侵入式,而go中的接口为非侵入式,不需要显示声明,只需要实现接口定义的函数,编译器会自动识别 案例 type Animal interface { R
阅读全文
摘要:什么是服务注册和发现及技术选型 服务注册和发现 基于配置文件的微服务弊端 当系统并发过高的时候,我们新增加了一个用户服务,那么其它需要调用用户服务的服务都需要重新部署,非常的麻烦,而且容易出错 注册中心 稳定性、一致性、是不是分布式 服务注册与发现流程图 服务注册与发现的技术选型 consul的安装
阅读全文
摘要:go-redis库的使用 安装go-redis库 go get github.com/go-redis/redis/v8 github链接 创建redis客户端并设置值 // 短信验证码发送成功,将验证码保存到redis rdb := redis.NewClient(&redis.Options{
阅读全文
摘要:下载依赖 go get -u github.com/alibabacloud-go/dysmsapi-20170525/v2 go get -u github.com/alibabacloud-go/darabonba-openapi go get -u github.com/alibabaclou
阅读全文
摘要:map的Q&A 非常重要的一点:makemap()函数返回的是*hmap, makeslice()函数返回的是slice map是线程安全的吗?(map可以并发写入吗) 1. go语言中内置的map不是并发安全的 2. 大量goroutine并发写入map就会报错:fatal error: conc
阅读全文
摘要:channel Q&A 什么是CSP? 不要通过共享内存来实现通信,而要通过通信实现共享内存 CSP通常被认为go在并发上成功的关键因素 go一开始就把CSP的思想融入到语言的核心里,所以并发编程称为go的一个独特的优势 大多数编程语言的并发模式是基于线程和内存同步访问控制实现的,Go的并发编程模型
阅读全文