自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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性能优化的一些记录:pprof工具的使用

分析 CPU 和内存资源占用高的原因。

2024-12-27 21:27:26 309

原创 go 交替打印数字和字母

交替打印使用chan 或者可以使用sync.Mutex 我比较懒 就用这一种吧。

2024-12-26 21:43:30 170

原创 反转字符串II

记录:这里其实最重要的是边界的判断 一次走2k 步 剩余长度 等于走的长度i +需要处理的长度k。

2024-05-15 16:04:54 178

原创 反转字符串GO语言实现

记录:这道题比较简单啊 双指针 一前一后 秒了。

2024-05-15 11:07:49 270

原创 买票股票最佳时机GO语言实现

记录:比较简单 直接上代码 一看就懂。

2024-05-14 21:28:43 493

原创 四数之和GO语言实现

记录:比三数之和多加一个循环。

2024-05-14 20:01:14 167

原创 三数之和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

原创 四数相加IIGO语言实现

记录:使用哈希 其实并不难 方法很巧妙。

2024-05-14 17:17:43 252

原创 全排列GO语言实现

总结下:其实只是需要一个book变量来做记录 一个path 来做临时变量 res来做变量 做递归即可 大家不懂的去看视频吧 感觉更容易理解。记录:这道题比较难啊感觉脑细胞要没了。

2024-05-13 22:22:21 273

原创 快乐数GO语言实现

记录:这道题很巧妙 将快乐数转换为链表是否有环的问题了 代码直接上了 理解了就秒了。

2024-05-13 19:55:16 159

原创 两数之和GO语言算法实现

记录:两数之和 用了个双循环 当然也可以使用map来做。

2024-05-13 19:34:00 226

原创 两个数组交集GO语言实现

第二个就是使用双指针指向两个数据头部,先排序,然后哪个小哪个移动。记录:这题不难 思路有两个 第一个就是使用Map 先存 再找。

2024-05-13 19:20:40 222

原创 有效的字母异位词GO语言实现

记录:使用哈希来判断 两个字符串是否相同 第一个字符串写入hash 第二个字符串减去出现的次数。

2024-05-12 22:10:22 212 1

原创 两两交换链表中的节点GO语言实现

记录:这里其实挺乱的 需要认真思考。

2024-05-11 22:42:56 239 2

原创 环形链表IIGO语言实现

记录:知道原理就很简单了 看看视频就可以写出来。

2024-05-11 22:24:55 193 2

原创 链表相交GO语言实现

记录:明白原理很简单了 直接秒。

2024-05-11 21:32:53 181 2

原创 删除链表的倒数第N个节点GO语言实现

记录:这个其实很简单 双指针思路就可以了。

2024-05-11 21:19:01 234 1

原创 设计链表GO语言实现

记录:这个比较简单 只是代码比较多。

2024-05-10 21:58:15 160 1

原创 反转链表GO语言实现

记录:这个比较简单 直接秒了。

2024-05-10 21:56:22 873 1

原创 移除链表元素GO语言实现

记录:这道题直接秒了 废话不多说 上代码 当然双指针也可以哦。

2024-05-10 21:04:01 577 1

原创 螺旋矩阵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语言实现

记录:看到这道题 第一反应就是双指针 首先是快慢针 但是没想到居然是合并针。脑子是个好东西 可惜我没有啊。

2024-05-08 22:11:31 97 1

原创 数组中移除元素GO语言实现

这里是原地覆盖了数组 但是其实就是把slow当成了新的数组 而fast就是寻找新数组里的数据 只要不是val目标值 那么我们就需要将其放入到新的数组 也就是slow里。看了视频讲解后才理解是不能中断 一下就想到了双指针的思想来处理问题。思路:第一眼看到这到题以为就是直接循环然后查找删除,但是想应该不能这么简单吧。其实这里最大的问题就是需要思考的这段判断代码 我反复观看视频才想明白。

2024-05-07 23:06:08 435

原创 二分查找GO语言实现

自己觉得比较难的点:right left 与mid 加减的关系 这里其实可以画图解决。

2024-05-07 22:18:30 585

空空如也

空空如也

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

TA关注的人

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