- 博客(70)
- 收藏
- 关注

原创 ICE/TURN/STUN/Coturn服务器搭建
当我们想要实现在公网环境下的语音/视频通话功能时,就需要用到ICE交互式连接建立。ICE不是一种协议,整合了 STUN 和 TURN 两种协议(用于 NAT 穿透)的框架。ICE的主要目标是解决NAT(网络地址转换)穿越问题,使得即使在复杂的网络环境下,如防火墙和NAT路由器后面,两个对等体也能够发现彼此并建立连接。
2024-10-09 21:55:23
2479
3

原创 go.uber.org/ratelimit 源码分析
go 提供了一用来接口限流的包。其中包正是基于漏桶算法实现的。指的是每秒平均多少次,在运行程序后,并不会严格按照官方给的样例输出。
2024-08-28 11:14:02
930
1

原创 gin接口限制请求频率
参与的业务模块今天被安全的同学玩坏了。一直疯狂掉用接口,然后服务器就挂了。涉及的接口需要处理大量的数据,并且需要处理很多条件。有限流和缓存两种解决方案。考虑到正常业务下数据的访问量并不高,而且筛选条件较多,所以选用限流的方式解决。(我让你测)
2024-05-17 21:12:53
966
原创 MySQL最左匹配原则是什么
MySQL 索引的最左匹配原则是指在使用联合索引的过程中,查询条件必须从索引的最左侧开始匹配。如果联合索引包含多个列,查询条件必须包含第一个列,然后是第二个列,以此类推。:联合索局部有序。比如建立联合索引 (a,b),b只在a为确定值时有序,在全局则乱序。
2024-12-25 23:38:55
554
原创 MySQL三层B+树能存多少条数据
非叶子节点存放索引键和指向子节点的指针,假设子节点指针的大小为6字节,索引键(一般为bigint)为8字节,那么一个非叶子节点可以指向:16KB * 1024 ÷ (6+8)≈ 1170 个叶子节点。叶子节点上存放的是完整的数据行,假设数据行的大小为1KB(实际根据数据行大小波动),那么一个叶子节点可以存放:16KB ÷ 1KB = 16 条数据。第二层每个非叶子节点可以指向1170个叶子节点。根叶子节点可以指向 1170 个子节点。每个叶子节点可以存放16条数据。
2024-12-25 23:34:33
567
原创 go-bindata
在项目中引用了静态资源时,项目打包后,需要保证包与静态资源的相对目录不变。bindata可以将静态资源生成.go文件,在打包时会嵌入到包中,非常好用。
2024-11-15 19:26:31
691
原创 go template 模板字符串
如果想要实现如上格式的Markdown格式的stirng,我们需要对body的最小list进行循环的处理。这样可以在一定程度上解决无法直观的看到文本的格式问题,但是当需要循环的处理某段数据时,这种方式写出的代码并不雅观。这里只做一些简单的说明,除此 template包还提供了很多好用的方法,感兴趣的可以自行查阅。template可以直观的看到字符串预期的格式,并且可以更优雅的处理循环传入参数的操作。可行,但是无法直观的看到文本的格式。可以采用反引号 `` 的方式来解决。表示根对象,比如上面的示例传入的是。
2024-11-10 14:37:14
604
原创 MySQL是如何实现数据排序的
MySQL实现数据排序主要依赖于其内部的排序和索引机制。当执行包含ORDER BY子句的SQL查询时,MySQL会采用以下一种或多种策略来对数据进行排序。
2024-08-01 22:04:12
619
原创 Nginx加权轮询算法
之前面试被问过如何实现有权重的Map,当时没有做出来。后面听到朋友说Nginx权重分配算法,当时以为是通过权重Map解决的,学习后发现并不是。不能白学,记录一下。
2024-08-01 11:15:37
880
原创 gorm存储json
如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。每次进行类似的操作都需要进行转换,十分的繁琐。序列化方法将需要存储的对象转化为json字符串,然后再存入mysql中。在一些存储配置文件的场景下,我们需要在mysql中存储json。这是我们在使用时直接操控Config即可完成操作,不需要再将数据进行转换。Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。以上面的操作为例,我们可以为其添加钩子函数,并修改结构体。gorm提供了钩子函数,可以很好的解决这个问题。
2024-06-21 19:03:44
483
原创 docker部署go项目
当服务器上没有go环境,又不想配置的时候,可以通过拉取go相关的镜像,运行项目当然你可以通过本地打包,上传至服务器,直接运行二进制文件。
2024-05-03 15:50:07
598
2
原创 Go —— GMP面试题
Go —— 协程0)G:协程,M:系统线程,P:协程调度器1)通过go func() 生成一个 G2)G会优先放到P的本地队列,如果P的队列已满,则会放入全局队列中3)G需要在M中执行,G通过P进行调度,M与P的关系是1:1对应的,如果P的本地队列为空,则会优先从全局队列中获取G,其次从其他MP组合中窃取G4)M执行G的过程是一个循环的过程5)如果M发生系统调度,则会释放P,P会找一个空闲的M进行执行,如果没有空闲的M,则会唤醒或者新建一个M。
2024-04-09 21:14:30
884
1
原创 Go —— channel (二)
出现这种情况可能与GMP调度模型有关系,当我们继续增大数据量后(比如增加到10000),会发现每个协程读取chan的次数其实差不多。关闭的管道仍然可以读取数据,向关闭的管道写数据会触发panic。在我多次测试后发现前四个数会被每个协程消费一次,随后会出现大片数据被同一协程消费的情况。ps:如果有哪位老哥知道为什么会出现一个协程连续输出的情况,欢迎在评论区讨论。执行程序,会发现按照某种固定的顺序输出,这时完全符合上图的读的过程的。按照上面协程读取消息的过程会发生什么呢?向一个管道中写数据的简单过程如下。
2024-04-09 21:06:58
835
1
原创 Go —— defer
defer 语句用于延迟函数的调用,常用于关闭文件描述符、释放锁等资源释放场景。但 defer 关键字只能作用于函数或函数调用。
2024-03-28 15:05:39
1044
2
原创 IM系统设计之websocket消息转发
上周面试被面试官问到:“在分布式IM系统中,如何实现多个websocket集群之间的通信”。我在思考了良久后回答:“不会”。随着我的回答,我和面试官的故事也到此完结了…
2024-03-23 21:20:45
1664
原创 IM系统设计之消息存储
消息持久库和离线消息存储库我分别使用的是:MySQL、Redis。众所周知,Redis是基于内存的,那么当Redis宕机后,离线消息就会丢失。这里有两种解决思路,两种思路都需要记录消息持久库里面记录消息的已读状态。如果有更好的方法,欢迎大家在评论区讨论。当Redis宕机后,管理员手动拉取。当用户A向用户B发送一条消息时。消息存储结构如下图所示。
2024-03-23 21:19:42
743
原创 Go —— 逃逸分析
逃逸分析是指由编译器决定内存分配的位置,不需要程序员指定。有了逃逸分析,返回函数局部变量变得可能。除此之外,逃逸分析还跟闭包息息相关,了解哪些场景下对象会逃逸至关重要。
2024-03-16 21:54:12
968
1
原创 goctl生成protoc报错:Import “google/protobuf/timestamp.proto“ was not found or had errors.
这是我的user.proto 文件,位于在目录下执行。
2024-03-10 17:19:41
1493
原创 计算机网络 —— 运输层
运输层的主要任务是,如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP。
2024-03-10 17:19:21
1008
原创 GoLand/Idea 项目目录缺失
问题是这么个问题。进入项目后只剩下了go.mod、go.sum 文件。之前用idea的时候也出现过这个问题。不愧是一家公司(看来这是遗传病)
2024-02-02 15:35:30
710
1
原创 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘
使用 go-zero时,执行api命令报错。报错信息提醒文件55行有错,但是源文件55行没有问题。
2024-02-02 15:33:54
959
原创 linux安装docker-compose
今天安装docker-compose的时候,找了很多教程,但是本地一直报错,记录一下解决过程。其实菜鸟教程上的这篇已经很好了,其中很贴心的给出了两种下载方法。但是我用下载,服务器说,我用下载,又给我提醒文件错误。正常的情况下执行后应该返回的是当时我觉得是我哪里操作的问题,又是又试了几遍,最后我得出结论。查找资料后了解到这可能是docker-compose文件被下载但内容不正确造成的。既然知道了原因,那么只需要在本机下载然后传到服务器就可以正常安装了。
2024-01-28 17:13:12
544
原创 MySQL的执行流程
MySQL架构分为Server层、存储引擎,其中Server层又分为连接器、查询缓存、分析器、优化器执行器五个部分。当客户端发送请求后依次需要经过 处理请求、查询缓存、语法解析、查询优化、存储引擎部分。
2024-01-21 22:04:09
527
原创 计算机网络 —— 数据链路层
数据链路层把网络层交下来的数据构成帧发送到链路上,以及把收到的帧数据取出并上交给网络层。链路层属于计算机网络的底层。点对点通信。广播通信。
2024-01-13 18:10:22
1168
原创 计算机网络 —— 物理层
调制的目的是将数字信号转换为适合在信道中传播的连续波形。物理层为数据链路层屏蔽了各种传输媒体的差异,使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络具体的传输媒体是什么。编码是将数字信息转换为特定格式的过程,以便在通信系统中进行传输或存储。因为频率和相位是相关的,即频率是相位随时间的变化率。奈氏准则:在假定的理想条件下,为了避免码间串扰,码元传输速率是有上限的。异步传输:数据块以字节为独立单位,字节之间的时间间隔不是固定的。同步传输:数据块以稳定的比特流的形式传输,字节之间没有间隙。
2024-01-08 15:35:32
1480
原创 计算机网络—— 概述
网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)。因特网(Internet)是世界上最大的互联网络internet和Internet的区别internet(互联网或互连网)是一个通用名词,它泛指由多个计算机网络互连而成的网络。在这些网络之间的通信协议可以是任意的。
2024-01-08 15:31:29
1423
2
原创 go sort.Search()
因为二分查找相比普通依次遍历而言,速度能有巨幅提升。就好比你查字典的时候,你是会从头往后一页一页的翻,还是会直接翻开中间某页,再翻开中间的中间的某页。二分查找相比于依次遍历查找而言,通过二分法查找,找到已经排序好的数组[0,n)中第一个使f为true的索引,如果没有找到返回n。位运算,将i、j的和转化为二进制右移(删除)一位,等价于(i+j)/ 2。有效索引范围为[0,n),当 i >= j 时结束。比如十进制5经过 >> 1 结果为 2。为什么要用二分查找?源码位于sort包下。
2023-12-09 22:39:20
283
JavaWeb+Mysql实现简易商城系统
2023-01-30
Java小游戏-坦克大战
2023-01-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人