自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(184)
  • 收藏
  • 关注

原创 微服务中的注册中心、微服务网关、api网关

微服务网关:提供前端业务访问后端微服务的能力,将一个服务暴露给前端,服务请求到微服务网关之后去注册中心获取服务地址。(可以把微服务地址写入到nginx中,通过nginx的代理和流量转发能力代替微服务网关+注册中心,但是这样做就失去了注册中心心跳检测、负载均衡服务发现等能力)api网关:是一个上层的中心化网关,以更细的颗粒度(具体的api接口)详细的管理每一个api接口(安全日志、限流熔断等各种治理管控能力)。注册中心:服务间的接口调用,配合微服务网关把微服务能力暴露给前端,将服务去中心化。

2024-05-23 17:32:57 16

原创 高并发秒杀系统

缓存库存,减少mysql压力,redis的incr方法是原子性的,可以通过该方法来扣减库存。(incr用来更新数据,只能保证原子写,想要保证原子读写,可以通过加锁的方式来实现,同样的性能会有损耗)同时,设置一个过期时间,以防止锁一直被持有而无法释放。缓存穿透:加布隆过滤器过滤无效请求,但是要保证布隆过滤器的数据与缓存数据一致,只适合缓存读多写少的情形,可以把不存在的商品id也缓存起来;redis setnx命令加锁,但是加锁和设置过期时间不是原子的,可能会导致锁的过期时间设置失败,造成死锁等问题。

2024-04-09 19:40:22 413

原创 IM系统

平时使用qq,或许大伙都有类似的体验,弹出一个对话框“因为网络原因,消息发送失败,是否要重发”,此时,有可能是对方没有收到消息(发送方网络不好,msg:N丢失),也可能已经收到了消息(接收方网络不好,反复重传后,ack:N依然丢失),出现这个提示时,大伙不妨和对端确认一下,看是哪种情况。加入应用层的确认机制,要想让发送方client-A确保接收方client-B收到了消息,必须让接收方client-B给一个消息的确认,这个应用层的确认的流程,(如果某个im系统不包含这6个报文,不要谈什么消息的可靠性)。

2024-03-27 11:39:09 756

原创 kafka

数据分片(每个topic会把数据切分为多个partition,每个partition有自己对应的副本保证可靠性,但是副本在leader partition down掉前不会提供服务)可以横向扩容。公有云:第三方云厂商所拥有和运营,用户通过互联网使用这些服务;kafka虽然跑在jvm上但是使用堆外内存(内核缓冲区内存)pagecache,所以不需要做内存回收。私有云:企业自己建设并为内部提供服务,企业可以更严格地控制访问权限和数据管理。dma拷贝:io到内核的拷贝。虚拟内存:内存地址映射。

2024-03-27 11:37:59 631

原创 kafka常见问题

这里说的系统复杂度和系统耦合性是不一样的,比如以前只有:系统A、系统B和系统C 这三个系统,现在引入mq之后,你除了需要关注前面三个系统之外,还需要关注mq服务,需要关注的点越多,系统的复杂度越高。如果出现请求峰值的情况,由于消费者的消费能力有限,会按照自己的节奏来消费消息,多的请求不处理,保留在mq的队列中,不会对系统的稳定性造成影响。如果对消息顺序要求不高的场景,可以使用这种方式。如果重复消息不做正确的处理,会对业务造成很大的影响,产生重复的数据,或者导致数据异常,比如会员系统多开通了一个月的会员。

2023-06-26 14:34:18 1587 1

原创 golang 函数调用栈笔记

call指令 ——> sp指针向下移动,分配足够大栈帧空间 ——> 将调用者栈基bp复制入栈(为区分记为bp1)——>将bp1存到寄存器——>执行函数——>将寄存器的值恢复为bp——>释放栈帧——> ret指令。

2023-05-17 10:14:58 500

原创 golang在函数中对slice进行append操作不影响外部的值

golang在函数中对slice进行append操作不影响外部的值

2023-03-06 15:28:57 402

原创 go 协程经典问答题

go 协程经典问答题

2023-02-06 16:39:28 128

原创 Golang 回调函数&&闭包&&接口函数

Golang 回调函数&&闭包&&接口函数

2022-11-14 15:32:47 718

原创 Golang for循环作用域问题

go for循环作用域导致的问题

2022-11-14 14:27:16 263

原创 go进阶笔记

wrap errors 会把底层的所有错误(包括根源错误以及堆栈信息)打包,在顶层一次性打印出来。这样我们就不用在每一层都做日志输出和错误处理,也保证了一次错误只打印一次错误日志。%v 和%+v%v 只输出字段的value%+v 会以键值对的形式输出字段的key和valuewrap errors一般在程序代码(自己项目)中才调用才用wrap errors,在基础库中不会不会调用wrap errors,避免用户也使用wrap errors造成日志的双倍打印。......

2022-08-28 22:44:08 262

原创 git学习笔记

1.初始化仓库git init初始化一个git仓库git config --global user.name "yourname"git config --global user.email "youremail" //要能够接收信息的有效邮箱配置git的用户信息,global表示这台机器上所有的Git仓库都会使用这个配置。2.git常用命令git add .把全部已修改文件添加到暂存区git log显示全部提交(暂存区->仓库)历史git diff 文件名 /...

2022-01-23 12:16:11 306

原创 操作系统总结

冯诺伊曼模型输入设备 输出设备 内存 中央处理器(CPU) 总线内存存储的数据单位是二进制位(bit) 随机存取,存取速度一致中央处理器(CPU)32位的操作系统cpu每次计算4byte 64位的操作系统cpu每次计算8byte 32/64位 指的是cpu带宽,位数越大计算数值越大。 CPU里有控制单元和逻辑运算单元以及寄存器 CPU距离内存太远,所以在离cpu较近的寄存器存储cpu要处理的数据 寄存器分为通用寄存器(寄存函数的参数)、指令寄存器...

2021-11-22 17:43:52 1018

原创 linux 复习杂笔

whereis 及 locate 都是基于系统内建的数据库进行搜索,因此效率很高,而find和which则是遍历硬盘查找文件。 which 查看可执行文件的位置。whereis 查看程序文件的位置。locate 配合数据库查看文件位置。 ​​​​​​​find 实际搜寻硬盘查询文件名称。 df 命令 (Disk free 空余硬盘)ln 命令(Link files 链接文件)功能是为文件在另外一个位置建立一个同步的链接,当在不同目录需要该问题时,就不需要为每一个目..

2021-11-22 17:32:23 745

原创 2021-09-02

1.go中goroutine是如何调度的(go MPG模型)M代表一个内核线程,也可以称为一个工作线程。goroutine就是跑在M之上的。(两个M如果运行在一个CPU上就是并发,如果运行在不同CPU就是并行。)P 代表着处理器,或是程序执行上下文,将等待执行的G与M对接。Go的运行时系统会适时地让P与不同的M建立或断开关联,以使P中的那些可运行的G能够及时获得运行时机;G代表协程(是一个轻量级的执行线程),可以有多个;(go采用了基于消息并发模型的方式。它将基于CSP模型的并发编程内置到了

2021-11-12 09:36:54 1868

原创 网络基础复习

网络协议所在的层HTTP HTTP2 应用层协议TCP UDP 运输层IP 网络层Ethernet 物理层IP协议主要解决网络路由和寻址问题TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。HTTP与WebSocketHTTPHTTP是单向的,客户端发送请求,服务器发送响应。当客户端向服务器发送请求时,该请求以HTTP或HTTPS的形式发送,在接收到请求后,服务器会将响应发送给客户端..

2021-10-01 16:51:21 712

原创 mysql备份

根据备份接口区分:物理备份:直接复制数据文件,打包归档。简单来说就是对 MySQL 的数据存放路径进行打包。不需要额外工具,直接归档命令即可,但是跨平台能力比较差;如果数据量超过几十个G,则适用于物理备份。逻辑备份:把数据抽取出来保存在 SQL 脚本中,mysqldump 就属于逻辑备份。导入方便,直接读取 SQL 语句即可;逻辑备份恢复时间慢,占用空间大;无法保证浮点数的精度;恢复完数据库后需要重建索引。根据备份时,MySQL 服务是否在线冷备:停掉 MySQL 这个服务,读写

2021-09-27 16:47:40 533

原创 go tcp编程

serverpackage mainimport ( "log" "net" "time")func main() { // Part 1: 端口监听 l, err := net.Listen("tcp", ":8080") if err != nil { log.Fatalf("Error listener returned: %s", err) } defer l.Close() // Part 2: 建立连接。 for { c, err := l.Acc.

2021-09-27 10:06:05 85

原创 docker学习笔记

什么是docker为了解决环境和配置对代码运行的影响,docker应运而生,docker将代码/数据/配置/操作系统一层一层封装到一个容器中,运维只需要拉取镜像就可以在和开发同样的环境下运行代码。优点:1. 上手快2. 开发与运维的逻辑分类更清楚3. 快速高效4. 面向服务的架构(微服务)docker与虚拟机的不同虚拟机: 服务器 本机操作系统 虚拟层硬件(可以虚拟出各种硬件) 虚拟机(虚拟机里包括虚拟操作系统、二进制库、软件)可以虚拟出不同与本机的操作系统每...

2021-09-24 08:37:23 536

原创 数据库主从同步

是什么?主从架构,进行读写分离,让主服务器(Master)处理写请求,从服务器(Slave)处理读请求,这样同样可以提升数据库的并发处理能力。为什么?首先不是所有的应用都需要对数据库进行主从架构的设置,毕竟设置架构本身是有成本的,如果我们的目的在于提升数据库高并发访问的效率,那么首先需要考虑的应该是如何优化你的 SQL 和索引,这种方式简单有效。其次才是采用缓存的策略,比如使用 Redis,通过 Redis 高性能的优势将热点数据保存在内存数据库中,提升读取的效率。最后才是对数据库采用主

2021-09-01 19:38:47 4941

原创 查询优化器如何工作

查询优化器的工作流程一条 SQL 查询语句首先会经过分析器,进行语法分析和语义检查。我们之前讲过语法分析是检查 SQL 拼写和语法是否正确,语义检查是检查 SQL 中的访问对象是否存在。比如我们在写 SELECT 语句的时候,列名写错了,系统就会提示错误。语法检查和语义检查可以保证 SQL 语句没有错误,最终得到一棵语法分析树,然后经过查询优化器得到查询计划,最后交给执行器进行执行。查询优化查询优化器的目标是找到执行 SQL 查询的最佳执行计划,执行计划就是查询树,它由一系列物.

2021-08-31 21:18:37 195

原创 缓存穿透、击穿及雪崩

缓存穿透:在高并发下,查询一个不存在的值(数据库和缓存里都没有的值)时,缓存不会被命中,导致大量请求直接落到数据库上。如何避免:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,设置太长会导致正常情况也没法使用。缓存击穿:在高并发下,对一个特定的值(缓存中没有但数据库中有的数据)进行查询,但是这个时候缓存正好过期了,缓存没有命中,导致大...

2021-08-31 09:18:11 99

原创 Redis学习笔记

Redis是什么:Redis(remote diciionary server) 远程字典服务,支持网络,可基于内存亦可持久化的日志型、Key-Value数据库,提供多种API(多个语言都可以调用redis)、redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现master-slave(主从)同步。Redis用来干什么:1.内存存储、持久化(rdb、aof)2. 速度快,可以用于高速缓存。3. 发布订阅系统4.地图信息分析5. 计时器、计数

2021-08-30 15:03:30 274

原创 InnoDB下的MVCC

MVCC,是采用乐观锁思想的一种方式;在 MySQL 中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,但不能解决幻读问题。如果想要解决幻读问题,就需要采用串行化的方式,也就是将隔离级别提升到最高,但这样一来就会大幅降低数据库的事务并发能力。我们也可以采用MVCC+Next-Key Lock的方式来解决幻读问题。MVCC 是什么MVCC 的英文全称是 Multiversion Concurrency Control,即多版本并发控制技术。MVCC 是通过数据行的多个版本管

2021-08-27 20:33:01 1136

原创 微服务架构学习笔记

什么是微服务一个或者一组相对较小且独立的功能单元,用户可以感知最小功能集。微服务架构一组小的服务 独立的进程 :以进程的方式横向扩展 轻量级通信 :使用轻量级协议 基于业务能力 :基于不同的服务构建 独立部署 : 团队之间不需要协调 无集中式管理 :没有统一的架构团队,可以采用不同的技术栈微服务特点服务间松散耦合服务面向架构有界数据源:每个微服务有不同的数据源微服务本质 微服务本质是系统提供一套基础的架构,这种架构使得微服务可以独立的部署、运行、升级...

2021-08-26 09:00:01 854

原创 数据库相关锁

锁的种类按照锁的粒度划分锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁、页锁和表锁。行锁就是按照行的粒度对数据进行锁定。锁定力度小,发生锁冲突概率低,可以实现的并发度高,但是对于锁的开销比较大,加锁会比较慢,容易出现死锁情况。页锁就是在页的粒度上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录。当我们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页上的数据行。页锁的开销介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间,

2021-08-25 21:14:54 107

原创 从磁盘I/O的角度理解SQL查询

数据库缓冲池磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多。为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请占用内存来作为数据缓冲池,这样做的好处是可以让磁盘活动最小化,从而减少与磁盘直接进行 I/O 的时间。这种策略对提升 SQL 语句的查询性能来说至关重要。如果索引的数据在缓冲池里,那么访问的成本就会降低很多。缓冲池机制缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果

2021-08-24 21:11:04 171

原创 从数据页的角度理解B+树查询

数据库中的存储结构记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次 I/O 操作)只能处理一行数据,效率会非常低。因此在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页。一个页中可以存储多个行记录,同时在数据库中,还存在着区(Extent)、段(Segment)和表空间(Tablespace)。一个表空间包括了一个或多个段,一个段包括了一个或多个区,一个区包括了多个页,而一个页中可以有多行记录。区

2021-08-24 20:50:33 240

原创 SQL索引

索引就是帮助数据库管理系统高效获取数据的数据结构。数据库中的索引,就好比一本书的目录,它可以帮我们快速进行特定值的定位与查找,从而加快数据查询的效率。索引不是万能的,在有些情况下使用索引反而会让效率变低。...

2021-08-20 09:11:52 2903

原创 Vue基础学习笔记

Vue前端框架,面向数据编程<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> .

2021-08-12 20:28:06 212 1

原创 js学习笔记

面向对象的解释型语言,用来实现网页上复杂的交互功能。三种添加JavaScript的方式一般不推荐使用内联var没有作用域,let和const有

2021-08-09 09:54:57 65

原创 css学习笔记

三种添加css的方式一般只使用前两种。css格式可以对任意一个标签使用css修饰,body、head等等也可以,当只修改一部分时,需要使用class 命名。自己命名前要有.多个选择器常用的css设置用图片做背景设置背景图片的平铺样式y是垂直方向,x是水平方向设置图片位置background-attachment 属性只有2个属性值。scroll表示背景图像随对象滚动而滚动,是默认...

2021-08-09 08:57:24 107

原创 html学习笔记

<head></head>用于定义该文档的头部,定义文档的一些属性和信息,包括网页的标题<title>。<body></body> 存放HTML文档的主要内容,bgcolor存放整个body属性,同时也可以用在其他标签内,比如<p>。<h1> - <h6> :<h1></h2>html标题,<h1>定义最大的标题,<h6>是最小的标题。<h>

2021-08-06 19:49:11 568

原创 gin学习笔记

gin的优势简单原则 并发高 分配内存请求路由请求类型:get、put、post等八种资源请求类型 绑定静态文件夹 参数作为URL:多用于Restfu请求中 泛绑定:所有前缀的请求都定向到一个资源中

2021-08-05 09:01:56 661

原创 短网址服务项目心得

1.短网址服务的作用是什么1.节省网址长度,存放更多信息。2. 规避关键词,域名屏蔽手段。3. 隐藏真实地址一般就是发链接的时候,用这种转换成短链接否则长链接占地方还乱,有的评论还限制字数,太长可能都不够。还有就是广告牌上弄二维码的时候,如果是用长链接生成的二维码,那么二维码很碎,扫码的时候不容易识别,短的生成的二维码就简单,容易识别。2.调研已有的短网址服务现有短网址服务:百度短网址、新浪短网址、谷歌短网址3.思考如何实现一个短网址应用将要缩短的网址存到数据库中,借助哈希表

2021-07-27 09:33:16 211

原创 go二次学习笔记

go下main函数不支持传入参数在程序中直接通过os.Args获取命令行参数。类型转化:1. go语言不允许隐式类型转换(强类型语言)2. 别名和原有类型也不能进行隐式类型转换类型预定义值1. math.MaxInt642. math.MaxFloat643. math.MinUint32指针类型1.不支持指针运算2. string是值类型,其默认的初始化值为空字符串,而不是nil算术运算符go语言中没有前置的++或--用==比较数组时,与其他语言比较引用相比,

2021-07-26 20:42:39 1092

原创 语言的类型

强类型与弱类型(类型安全)强类型与弱类型是判断类型安全的一个标准,区别在于是否允许有任意的隐式类型转换。强类型有更强的类型约束,而弱类型中几乎没有什么约束。强类型:语言层面限制函数的实参必须与形参类型相同,不允许有任意的隐式类型转换。弱类型:语言层面不会限制实参的类型(语法上无错,即在编译时不会出错),允许任意的隐式类型转换。弱类型语言问题:1.类型异常的问题要等到运行时才可以发现。2. 类型不明确可能会造成函数功能不明确。强类型语言优势:1. 错误暴露得更早2...

2021-07-26 09:38:59 193

原创 前后端分离

什么是前后端分离: 前后短分离的项目就是前端代码和后端代码是完全独立的不需要在一个项目里面部署(模板不是前后端分离)。前后端分离好处:并行开发,提高效率降低耦合度提高处理复杂业务能力缺点:增大团队沟通成本不利于搜索引擎抓取项目维护成本增高增加繁杂的配置前后端:前后端是根据和用户交互来区分的,直接和用户交互的,管显示效果的就叫前端,前端没有服务器(app严格来说也算前端),存储数据,执行一系列操作,提供其他服务的是后端;前端可以部署很多个,后端也可用部署很多个,是多对多模型。而且前后端

2021-07-21 15:46:32 124

原创 SQL范式设计

数据库范式目前关系型数据库一共有 6 种范式,按照范式级别,从低到高分别是:1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(巴斯 - 科德范式)、4NF(第四范式)和 5NF(第五范式,又叫做完美范式)。...

2021-06-20 20:10:33 284

原创 数据库调优

数据库调优的目标一般lai'sh数据库调优的目的就是要让数据库运行得更快,也就是说响应的时间更快,吞吐量更大。不过随着用户量的不断增加,以及应用程序复杂度的提升,我们很难用“更快”去定义数据库调优的目标,因为用户在不同时间段访问服务器遇到的瓶颈不同,比如双十一促销的时候会带来大规模的并发访问;还有用户在进行不同业务操作的时候,数据库的事务处理和 SQL 查询都会有所不同。因此我们还需要更加精细的定位,去确定调优的目标。...

2021-06-18 22:06:23 4764

异步事件处理案例,仅供学习参考

异步事件处理案例,仅供学习参考

2023-06-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除