- 博客(36)
- 收藏
- 关注
原创 Kubernetes:基础的架构
负责容器的编排工作,检查节点的资源状态,把pod调度到合适的节点来运行,因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得。是 Node 节点的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,负责Node节点的运行维护。组件是k8s的核心功能的特性,而插件是一些附件的功能,是一些锦上添花的作用。apiserver 获得节点状态,监控异常情况。
2025-01-16 21:50:20
511
原创 GO:GO程序如何处理缓存加载和大数据缓存
为了防止数据不能及时的更新,我们可以使用消息通知的方式来进行数据的增量同步。采用分配集群的策略,将数据按一定规则拆分成多份,并放入不同的服务集群中,上游服务根据规则将请求路由到相应的集群,这就是所谓的分片集群策略。如果我们会在程序启动时,需要加载所有数据,最简单的方式就是程序启动,通过轮训从数据库拉取所有数据,并写入到本地缓存中。canal 可以伪装成数据库的从库 ,通过binlog 来同步数据库更新和插入的数据。可以使用对用户id进行取模,或者根据用户的城市、国家进行划分。
2025-01-14 22:00:58
303
原创 Redis :redis的大Key问题
首先我们想到的就是对数据进行压缩,比如string类型 我们通常使用json ,我们可以对其进行压缩,比如使用Protocol Buffers 进行序列号存储,可以减少百分之50的空间使用。请求处理过程中,如果涉及到的键或键关联的值数据量很大,Redis 针对这个请求的 I/O 操作耗时以及整体处理时间都将显著增加。这样就会出现一个问题,一旦队列前面的命令请求处理时间过程,那么后续执行命令就会被迫的等待。对大KEY进行拆分,拆成多个不同的字符串 ,存入不同的redis ,再取出数据进行拼接。
2025-01-13 21:58:19
406
原创 GO随记:不使用主键id 如何分表与mysql大表
计算过程如下: a. 非叶子节点的数据页(每个页的大小是16k),去掉每页的head和tail信息,有15k的空间,用来存放索引指针信息;4. 叶子节点存放的真实数据,假如一行数据的大小按1k,一个数据页,可以存15行数据;5. 设B+树的层树为x,则叶子节点的数量有: 1280 ** (x - 1) *15 [1280的x-1次方,在乘以15]当单表数据量过大,导致查询性能变差时,我们可以将这个大的数据表,按照一定的规则拆分成多个较小的数据表,从而提升表数据查询的性能。2 :使用hash 方式进行分表。
2025-01-09 21:52:32
330
原创 GO:map GC 优化
它们的底层就是使用分段锁加 map 类型来实现数据存储的,同时,它们也利用了刚刚讲过的 map 的 key-value 特性,来避免 GC 扫描。第二,key-value 除了需要满足非指针这个条件,key/value 的大小也不能超过 128 字节,如果超过 128 字节,key-value 就会退化成指针,导致被 GC 扫描。绕过 GC 要满足下面两个条件。因为 GC 在做对象扫描标记时,需要扫描标记 map 里面的全量 key-value 对象,数据越多,需要扫描的对象越多,GC 时间也就越长。
2025-01-08 21:51:50
355
原创 GO:sync.Map
同时,每次 read 读不到,从 dirty map 中读时,它会调用 missLocked 方法,这个方法用于将 map 的 misses 字段加 1,misses 字段用于表示 read 读未命中次数,如果 misses 值比较大,说明 read map 的数据可能比 dirty map 少了很多。2 更适用于读多写少的场景,当由于写比较多或者本地缓存没有全量数据时,会导致读 map 经常读不到数据,而需要加锁再读一次,从而导致读性能退化。1 由于有两个 map,因此占用内存会比较高。
2025-01-08 21:20:56
634
原创 GO随记:并发安全 不同并发场景选择合适的锁
所谓原子操作,是指对数据的一个操作,如果分成多个步骤,这些步骤对外会表现成不可分割的整体,要么完整地执行,要么就根本不执行,外界不会看到它们只执行到一半的状态。它的核心是下面两个方法。而当读写锁处于写模式锁定时,只有一个协程能进行写操作,并且在写模式锁定时,读操作会被阻塞。RLock 方法,用于获取读锁,当写锁没被占用时,可以获取到读锁,否则阻塞直到写锁被释放。Lock 方法,用于获取写锁,如果读锁或写锁已经被占用,则阻塞直到写锁可用。Lock 方法,用于加锁,当锁已经被占用时,调用协程会阻塞直到锁可用。
2025-01-08 20:37:45
446
原创 GO随想:GO的并发等待
3. Group类型的Go方法用于传入具有错误返回值的函数类型,Wait方法会阻塞等待所有传入Go方法的函数全部运行完毕,并且在任务完成后能够对错误进行处理。5. errgroup包还可以限制同时并发运行的最大协程数,通过SetLimit方法设置可同时运行的最大协程数,达到最大协程数时会阻塞创建新协程运行任务。第一个是 Add 方法,在任务运行之前,需要调用 Add 方法,用于设置需要等待完成的任务数,Add 方法传进去的数值之和,需要和任务数相等。特别需要注意的是,这些传入的函数必须将错误返回。
2025-01-06 21:29:09
453
原创 GO:复用对象和协程资源
等下次要用的时候,就直接从池子里取出来用。这样一来,就不用每次都从堆里重新分配,而且 GC 需要扫描的临时对象也会减少,这就是对象池的思想。在 Golang 中,每次创建一个协程,默认都得分配 2KB 的内存空间,而且还要进行初始化。要是临时对象很多,那在进行垃圾收集的时候,就需要耗费更多的 CPU 资源去扫描这些对象,看看哪些没用了,然后清理掉。从 CPU 资源消耗来看,不使用对象池,单次函数调用要 232.2ns,而使用对象池的方式,只要 32.81ns,节约了 86% 左右的 CPU 资源。
2025-01-03 20:36:38
260
原创 GO性能优化的一些记录:trace工具的使用
可以使用 trace 功能,程序便会对下面的一系列事件进行详细记录,并且会依据所搜集到的这些信息,生成能够以可视化方式查看的 trace 视图。协程运行时间、同步阻塞时间、系统调用阻塞时间、调度延迟时间、查看处理器的使用状况、垃圾回收(GC)占比。2 深入了解协程具体如何运营的详细信息(运行时长,或者什么原因导致了协程运行受阻)2 协程由于系统调用、通道操作、锁的使用等情况而出现被阻塞的现象。1 协程的创建过程、开始运行的时刻以及结束运行的时间点。3 网络 IO 相关的操作情况。1 分析协程阻塞情况。
2024-12-30 21:58:52
359
原创 三数之和GO语言实现
头:nums[i] == nums[i-1] left:nums[left] == nums[left+1] right: nums[right] == nums[right-1]1 使用三个指针 头 头+1 (left) 尾指针(right) 有点滑动窗口的意思。记录:看起来比较复杂 其实看看视频很容易理解并写出正确代码。2 对元素相同的进行去重。
2024-05-14 19:56:57
347
原创 赎金信GO语言实现
GO语言记录这里字符串比较麻烦需要使用map[v-'a'] 这样来记录。记录:这道题其实比较简单使用哈希或者使用暴力双循环都能解决。
2024-05-14 17:22:26
212
原创 全排列GO语言实现
总结下:其实只是需要一个book变量来做记录 一个path 来做临时变量 res来做变量 做递归即可 大家不懂的去看视频吧 感觉更容易理解。记录:这道题比较难啊感觉脑细胞要没了。
2024-05-13 22:22:21
273
原创 两个数组交集GO语言实现
第二个就是使用双指针指向两个数据头部,先排序,然后哪个小哪个移动。记录:这题不难 思路有两个 第一个就是使用Map 先存 再找。
2024-05-13 19:20:40
222
原创 螺旋矩阵II Go语言实现
记录:这道题其实虽然不好看 但是并不难 最难的在于 x y 比如求顶部 其实是用y的个数来看key为x的值到底有多少。
2024-05-09 21:46:50
337
1
原创 长度最小的子数组GO语言实现
记录:想到滑动窗口去做 但是最关键的一点 何时移动第二个指针没想明白 其实这道题就是如果缩短窗口的条件 也就是当大于目标值的时候 再缩小 重点在于记录长度那段。
2024-05-08 22:51:39
114
1
原创 数组中移除元素GO语言实现
这里是原地覆盖了数组 但是其实就是把slow当成了新的数组 而fast就是寻找新数组里的数据 只要不是val目标值 那么我们就需要将其放入到新的数组 也就是slow里。看了视频讲解后才理解是不能中断 一下就想到了双指针的思想来处理问题。思路:第一眼看到这到题以为就是直接循环然后查找删除,但是想应该不能这么简单吧。其实这里最大的问题就是需要思考的这段判断代码 我反复观看视频才想明白。
2024-05-07 23:06:08
435
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人