自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 golang map部分原理源码个人走读-附个人理解过程图解

近期再写map的demo时出现了下面一段报错,于是带着疑惑去看了一下源码。

2024-05-30 01:24:32 1021 2

原创 docker安装minio附带图片

访问你的ip:19000/bucket名称/文件名称。访问:你部署的ip:9090/login。用户名:minioadmin。密码:minioadmin。勾选中刚才创建的用户。

2024-05-15 19:55:00 360 1

原创 ubuntu下使用docker安装es和kibana以及ik分词器还有logstash

友情提醒:es和kibana的版本最好一致。

2024-05-13 19:53:50 234 2

原创 ubuntu下使用docker安装kafka

【代码】ubuntu下使用docker安装kafka。

2024-05-13 16:24:03 223 1

原创 go使用nacos作为配置中心时遇到的一个错误

主要原因是因为调用 configClient.GetConfig方法的时候会访问grpc服务,nacos2添加了grpc通信方式,所以需要把grpc的端口也打开。使用的版本:官方推荐的v2。

2024-05-10 21:21:09 336

原创 golang grpc的resolver原理解析借鉴

gRPC 源码分析之 Resolver 篇 - 熊喵君的博客 | PANDAYCHENgrpc进阶篇之resolver_grpc resolver-CSDN博客基于 etcd 实现 grpc 服务注册与发现 - 知乎

2024-03-14 00:58:24 450

原创 golang依赖版本太高或者太低使用指定版本解决

之前因为go get的时候获取的版本是最新的,导致获取的版本太高(1.61.0),想要降低grpc的版本,于是重新go get指定版本后发现还是会使用1.61.0版本,解决方法: 在go.mod文件里面修改。

2024-03-12 20:27:47 327

原创 ubuntu下使用docker安装mysql-借鉴

在Ubuntu20.04以Docker方式安装Mysql详细教程(支持外部连接,数据映射到物理磁盘,备份数据,导出数据,恢复数据)-腾讯云开发者社区-腾讯云

2024-03-04 20:02:33 125

原创 Golang的channel底层实现个人走读

channel用于Goroutine之间的通信,它提供了一种在不同协程之间传递数据的机制。channel是一种类型安全、阻塞的、先进先出(FIFO)的数据结构,确保发送的数据按照发送的顺序接收。Go语言提供通过通信来共享内存,而不是通过共享内存来通信.(个人理解就是我跟你用的是同样的东西,但是这个东西你有一份,我也有一份,也可以理解是我把要通信的东西拷贝了一份)

2023-11-17 00:55:35 233 1

原创 Golang 1.21.4 GMP调度器底层实现个人走读

在现代的操作系统中,为了提高并发处理任务的能力,一个CPU核上通常会运行多个线程,多个线程的创建、切换使用、销毁开销通常较大:(1)一个线程的大小通常达到4M,因为需要分配内存来存放用户栈和内核栈的数据(2)一个线程执行系统调用(发生IO时间如网络请求或者读写请求)不占用CPU时,需要及时让出CPU,交给其他线程执行,这是会发生线程之间的切换(3)线程在CPU上进行切换时,需要保持当前线程的上下文,将待执行的线程的上下文恢复到寄存器中,还需要向操作系统内核申请资源。

2023-11-14 23:47:22 418

原创 raft算法原理个人解读

领导者是写请求的正真处理的统一入口,收到来自客户端的写请求,会开启“两阶段提交”的流程:(1)广播proposal,向所有节点同步这一请求;(2)当请求得到多数派的赞同后,才会提交这一请求leader还需要周期性的向集群中所有节点发送自己的心跳,告知自己的健康状况,用途主要有:(1)重置follower的选举检测定时器,避免其切换成candidate发起竞选取代自己leader的身份。

2023-11-01 23:01:50 227 1

原创 etcd的raft实现部分个人解读

etcd是一个具有强一致性的分布式键值对存储系统,底层基于raft协议保证分布式系统数据的一致性和可用性。我看的版本是tag:v3.1.10。

2023-10-27 18:38:18 347

原创 etcd实现的分布式锁源码个人解读

主动轮询型:该模型有点类似go的sync.Mutex中主动轮询+cas乐观锁模型,取锁方会持续对分布式锁发出尝试取锁的动作,如果锁已经被占用则会不停地发起重试,直到取锁成功watch回调型:在取锁方发现锁被他人占用时,会创建watcher监视器订阅锁的施放事件,随后不在发起主动取锁的尝试,当锁被释放后,取锁方能通过之前创建的watcher感知到这一个变化,然后在重新发起取锁的尝试动作个人看法:在分布式场景下,我比较偏向watch回调型的实现策略。

2023-10-15 02:03:22 208

原创 基于context实现go的单机锁带过期时间

给终止异步协程函数stop赋值,启动异步协程,达到指定时间后执行解锁操作。context原理可以看。

2023-10-14 15:23:31 136

原创 go的context原理

context是goland中的经典工具,主要在异步场景中实现并发协调以及对goroutine的生命周期的控制,除此之外,context还兼有一定的数据储存能力。主要内容有一个接口context,四个实现类emptyCtx,cancelCtx,timerCtx,valueCtx,六个方法Background、TODO、WithCancel、WithDeadline、WithTimeout、WithValue。

2023-10-13 16:16:11 135

原创 基于go和redis实现分布式锁

CAP理论的核心在于,C,A,P三者不可得兼,最多只能满足其二。在执行redis分布式锁加锁操作的同时,使用的是redis的SetNEX指令,其中;设置的key对应的是分布式锁的唯一标识键,value对应的是使用方的身份标识token。在使用redis分布式锁时,为避免持有锁的使用方因为异常状况导致无法正常解锁,进而引发死锁问题,我们可以使用到redis的数据过期时间expire机制,redis走的是AP流派,为了保障服务的可用性和吞吐量,redis在进行数据的主从同步时,redis用的是异步执行机制。

2023-10-11 21:47:09 865

原创 go+vue2搭建并发直播聊天室

后端go功能内容hub结构体client结构体主要功能流程介绍图。

2023-09-22 22:33:02 81

原创 Go的sync包下Mutex和RWMutex源码个人解读

简单一点的理解锁就是一个状态值,比如0表示未加锁,1表示已加锁。上锁操作就是把状态值从0改成1,解锁操作就是把状态值从1改成0。如果修改失败就表明锁的掌控权不在你手上。一个优秀的工具需要具备探测并适应环境,从而采取不同的对策因地制宜的能力。现在有两种策略:优势:无需阻塞协程,短期来看操作较轻劣势:长时间争而不得会浪费CPU时间片适用场景:并发竞争强度低的场景优势:精准打击,不浪费CPU时间片劣势:需要挂起协程,进行上下文切换,操作较重适用场景:并发竞争激烈场景sync.Mutex结合两种方案的使用场景,制定

2023-09-21 02:09:10 126 1

原创 livego使用

https://blog.csdn.net/Hey_JC/article/details/120719150

2023-09-17 01:38:16 76

原创 Redis常见类型指令

Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的key-value数据库提供了丰富的数据结构,例如String、Hash、List、Set、Sorted等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。

2023-09-13 01:46:31 24

原创 Mysql的全局锁、表级锁、行锁

首先,执行select 和update 会生成MDL共享读写锁,但是执行上面修改表结构的语句会生成一个MDL排他锁,跟DML共享读写锁互斥,所以上面两条语句会一直阻塞知道线程1释放锁。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录家的锁。3.临键锁(Next-key lock):行锁和间隙锁的结合,同时锁住数据,并锁住数据前面的间隙Gap.在RR隔离级别下支持。其典型的使用场景是全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

2023-09-12 01:30:21 37

原创 Mysql的RR隔离级别下加锁规则

mysql版本8.0.32,隔离级别RR等值查询规则如下:原则2:查找过程中访问到的对象才会加锁。优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化成行锁。优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化成间隙锁。范围查询规则如下:如果使用了倒序排序(order by xx desc)唯一索引和非唯一索引判断规则都一样,先把数据按照倒序排序,检索范围的右边多加一个next-key lock区间,哪个范围方向还有命中的等值判断,再

2023-09-11 17:42:23 234

原创 Mysql解决幻读

Next-key lock锁的是索引,而不是数据本身,所以如果update语句的where条件没有用到索引,那么就会全表扫描,在一行行扫描的过程中,不仅给行加上了锁,还给两边的间隙也加上了间隙锁,相当于锁住整个表,然后直到事务结束才会释放锁。要避免这种情况出现,要么就不要混用快照读和当前读,要么就在事务开启的时候马上执行select ... for update 这类当前读的语句,因为它会对记录加next-key lock,从而避免其他事务插入一条新的纪录。具体看Next_key lock加锁规则。

2023-09-08 23:07:01 323

原创 Mysql的幻读问题--个人看法

"幻读"是ANSI SQL 标准提出的概念,如下所示翻译:P2(“幻读”):事务 T1 读取了满足特定搜索条件的记录行集合 N,然后事务 T2 又生成了一条或多条满足事务 T1 所使用的搜索条件的记录。如果事务 T1 用相同的搜索条件重复第一次读取,则会得到不同的记录行集合。

2023-09-07 23:40:32 78 2

原创 mysql的事务原理

在mysql中的事务是由存储引擎实现的。支持事务的引擎主要为innodb。事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。

2023-09-05 20:35:08 22

原创 mysql的mvcc原理

因为此时系统活跃的事务由100和200都未提交,所以生成的readview事务列表m_ids=[100,200],然后根据版本比对规则,300>max_trx_id(200),证明此版本数据对当前事务不可见,然后根据回滚指针找到上一个版本接着比对,直到找到数据刘德华。mvcc是一种用来解决读写冲突的无锁并发控制,也就是未事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。用处:配合undo log进行版本链对比,比对出当前事务可见的版本数据。

2023-09-04 19:36:47 108 1

原创 mysql索引介绍

官方介绍:在关系数据库中,索引是一种单独的,物理的数对数据库表中一列或多列的值进行排序的存储结构,他是某个表中一列或若干列值的结合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。其实把索引理解为图书目录就非常好理解了。数据库索引就好比是一本书的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存放在内存中,因此索引往往是存储在磁盘上的文件中(可能存储在单独的索引文件中-myisam,也可能和数据一起存储在数据文件中-innodb)。

2023-08-30 23:35:09 19 1

原创 雪花算法-用go实现-附带三种解决时钟回拨的方案以及代码

用go编写雪花算法-附带三种解决时钟回拨的方案代码

2023-08-24 22:52:14 919 1

原创 docker安装redis

Docker安装Redis!!!(含每一步详细图解)实战_redis_宁在春_InfoQ写作社区

2023-08-16 16:28:26 22 1

原创 docker打包go的exe文件简单示例

【代码】docker打包go的exe文件简单示例。

2023-07-28 00:47:01 133 1

原创 go实现连接池

连接池是一组连接组成的一个池子(集合),成为连接池。

2023-06-16 01:57:43 449

原创 go的定时器------time.Ticker

【代码】go的定时器------time.Ticker。

2023-06-04 16:50:17 96

原创 go的sync包-----WaitGroup

常见场景是我们会把任务拆分给多个goroutine并行完成。在完成之后需要合并这些任务的结果,或者需要等到所有小任务都完成才能进入下一步。WaitGroup 适用于同步多个goroutine之间的工作的。WaitGroup是用于同步多个goroutine之间工作的。1.加多了导致Wait一直阻塞,引起goroutine泄露。1.要再开启goroutine之前先加1。3.调用Wait方法来等待所有子任务完成。2.每一个小任务完成就减1。2.减多了直接就panic。

2023-06-02 00:52:46 45

原创 go的sync.pool

sync.Pool是用来保存可以被重复使用的临时对象,一边在以后的同类操作中可以重复使用,从而避免了反复创建和销毁临时对象带来的消耗以及对GC造成的压力。常用池化技术来提高程序的性能,例如连接池,线程池等。sync.Pool是并发安全的,可以在多个goroutine中并发调用sync.Pool存取对象.但是需要注意的是,sync.Pool保存的对象随时可能在不发出通知的情况下被清除,因此不能使用sync.Pool存储需要持久化的对象。

2023-06-01 22:52:35 248

原创 go的sync.Mutex

借鉴。

2023-05-31 22:59:02 44 1

原创 go语言的context使用

context是一个用于跨函数、跨goroutine传递请求范围数据、取消信号以及超时处理的包。context主要用来做两件事:1.安全传递数据:是指在请求执行上下文中线程安全地传递数据,依赖于WithValue方法。2.控制链路。

2023-05-31 00:17:59 280 1

原创 建造者模式-使用go实现

构造者模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

2023-05-30 01:15:50 47 1

原创 go的切片共享问题

【代码】go的切片共享问题。

2023-05-12 15:26:56 84

原创 nuxt2 使用PM2 部署

安装PM2部署服务。

2023-05-08 02:01:25 319 1

原创 在windows下编译linux的可执行文件 goland,上传服务器需要赋予权限才能运行

1.切记,要用cmd进入项目的src目录,别用goland或者vscode的终端弄,那样会生成失败的(别问为什么,错了好久都不知道,你想试试也行)这里还需要注意,需要给与权限才能直接执行 - chmod 777 main。cmd进入项目目录,然后输入指令。然后就可以看到指定文件了。最后上传main到服务器。

2023-04-21 01:46:25 251 1

基于go微服务架构的直播平台服务.zip

基于go微服务架构的直播平台服务.zip

2024-06-29

go利用context实现过期单机锁

go简单的利用context实现一款带过期时间的单价锁

2023-10-14

基于go和redis实现分布式锁

基于go和redis实现分布式锁,使用了看门狗和红锁

2023-10-14

go+vue2搭建的高并发直播聊天室

go+vue2搭建的高并发直播聊天室,go主要使用管道,协程,websocket,vue2主要负责页面以及使用websocket连接后端发送消息 ,。代码为前端页面

2023-04-23

go+vue2并发直播聊天室

go主要使用管道,协程,websocket,vue2主要负责页面以及使用websocket连接后端发送消息 工作流程: 1. 用户在输入框输入消息并回车或点击发送 2. Vue通过WebSocket连接发送消息到服务器 3. 服务器接收到消息并推送给Hub 4. Hub将消息广播给所有客户端连接,包括原发送消息的客户端 5. 客户端接收到服务器推送的消息,并更新本地消息列表,实现聊天室效果。 6. 以上步骤循环,实现持续不断的消息发送和接收。 这是一个并发聊天室的简单示例,后端使用Go语言实现高并发和消息广播,前端使用Vue.js通过WebSocket与后端实时通信。理解这种前后端分离但又需要实时交互的Web架构和实现方式,对于我们编写跨平台Web应用很有帮助。

2023-04-22

空空如也

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

TA关注的人

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