go的context 在context中存储数据 使用context来管理协程 context的本质 123456type Context interface { Deadline() (time.Time, bool) Err() error value(key any) any Done() <-chan struct{}} emptyContext 1234 2024-02-29
go的锁 并发操作对数据结果产生影响的本质 cas 正常状态 自旋多次,自旋获取锁失败后进入阻塞状态 锁饥饿 当前协程等待锁的时间超过1ms,切换为饥饿模式 饥饿模式下,不自旋,新来的协程直接sema休眠 被唤醒的协程直接获取锁 没有协程在队列中等待的时候,恢复为正常状态 2024-02-29 #锁
常见的排序方法 冒泡排序12345678910111213141516func bubbleSort(arr []int) { flage := false for i := range arr { for j := 0; j < len(arr)-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] 2024-02-28 #sort
松鼠AI面经 一面 2024.2.27 自我介绍 能实习多久 项目拷打 转链 转链接的项目出发点 技术选型 发号器的实现 62进制的实现 特殊词屏蔽的实现 缓存穿透、缓存击穿、缓存雪崩的区别。如何解决 singleflight的原理 如何使用efk收集ngix的access 日志 efk的介绍 canal的使用 es拷打 论坛 JWT的原理和优缺点(refresh token 和 黑名单) session和 2024-02-27 #面经
布隆过滤器 布隆过滤器(Bloom Filter)的原理和实现 - cpselvis - 博客园 (cnblogs.com) 6.2 分布式锁 · Go语言高级编程 (studygolang.com) 优点: 有良好的空间利用率和查询效率 缺点: 假阳性误判问题 删除困难 工程实践 基于 murmur hash + redis的bitmap 实现bloomFilter Forrest-Tao/ 2024-02-26
短链接项目总结 模块拆分长链接转短链接 相同的长链接转为同一个短链接 生成的短链接长度短 长链接本身可达 避免生成带有特殊含义的词汇 避免循环转链 存储 存储长链接与短链接的对应关系 短链接转长连接 单独部署一个微服务 根据短链接查询到长连接后重定向相应 通过access.log 收集统计各个链接的 UV(unique visit) 2024-02-26 #转链服务总结
go的GC Go的协程栈的位置 Go的协程栈位于Go的堆内存上 Go堆内存位于操作系统的虚拟内存上 协程栈记录了协程的执行现场 协程栈负责记录局部变量,传递参数和返回值 Go使用参数拷贝传递 逃逸分析逃逸分析是编译器在编译阶段对变量的生命周期进行分析,判断变量是在栈上还是堆上分配空间。逃逸分析的主要目的是优化内存的分配和减少垃圾回收的压力 栈帧回收后,需要继续使用的变量 变量太大了,栈里面放不 2024-02-25 #GC
基于用户投票的排名算法 基于用户投票的排名算法(一):Delicious和Hacker News - 阮一峰的网络日志 (ruanyifeng.com) 其中, P表示帖子的得票数,减去1是为了忽略发帖人的投票。 T表示距离发帖的时间(单位为小时),加上2是为了防止最新的帖子导致分母过小(之所以选择2,可能是因为从原始文章出现在其他网站,到转贴至Hacker News,平均需要两个小时)。 G表示”重力因子 2024-02-25
SnowflakeID 什么是SnowFlakeID SnowFlakeID是twitter公司内部分布式项目采用的ID生成算法 SnowFlakeID的最大的特性就是天然去中心化,通过时间戳、工作机器编号两个变量进行配置后,通过SnowFlake算法会生成唯一的递增ID。在任何机器上,只要保证工作机器编号不同,就可以确保生成的ID唯一,且整体趋势是递增的 分布式自增ID的广泛选择 结构10 - 00000000 2024-02-25 #SnowflakeID
JWT的介绍 JWT组成JSON Web Tokens 的组成: header.payload.signature headerHeader 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。 1234{ "alg": "HS256", "typ": "JWT"} 上面代码中,alg属 2024-02-25 #-[JWT]
http状态码 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071// HTTP status codes as registered with IANA.// See: https://www.ia 2024-02-25 #http状态码
go的多路IO socket 客户端 服务端:bind accept IO多路复用 多路是指 多个socket网络连接 复用是指使用一个线程来检查多个网络的连接的就绪状态 好处:解决了单线程处理多个IO操作时的阻塞问题。在需要处理大量并发IO的情况下,考研提升程序性能和相应速度。 IO模型IO模型指同时操作Socket的方案 阻塞IO 同步读写Socket时,线程陷入内核态 当读写完成后,切换回用 2024-02-24
go的channel 经验 不使用共享内存来通信 使用通信来共享内存 channel的优点 避免协程的竞争和数据冲突的问题 更高级的抽象,降低开发的难度,增加程序的可读性 模块间容易解耦,增强扩展性和可维护性 1234567891011121314func watch(ch chan int) { if <-ch == 1 { fmt.Println("get 1") 2024-02-24
go的GMP 进程&线程&协程进程 os中的 程序运行的实例。资源分配的基本单位。 进程占用内存空间 线程 CPU调度的基本单位 每个进程可以拥有多个线程 线程占用CPU的时间 线程使用系统分配给进程的内存,线程之间共享内存 线程的问题 线程本身占用资源大 线程切换开销大 线程的操作开销大 协程将一段程序的运行状态打包,可以在线程之间调度 协程的优点 资源利用 快速调度 超 2024-02-24