自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 项目架构记录

2023-10-25 11:59:51 222

原创 数据库一致性问题以及解决方案

就是数据库之间数据不一致。

2023-06-21 15:52:02 843

原创 三种Resis 集群方案

Redis 集群是 Redis 分布式架构的一种实现方式,它可以将多个 Redis 节点组成一个集群,提供高可用、高吞吐量和负载均衡等特性。

2023-06-19 18:01:35 896

原创 【Web】go管理配置神器 viper库

viper适用与go应用程序中处理多种格式的配置文件(如 YAML、JSON、TOML 等)它支持:- 设置默认值- 从 JSON、TOML、YAML、HCL、envfile 和 Java 属性配置文件中读取- 实时观看和重新读取配置文件(可选)- 从环境变量读取- 从远程配置系统(etcd 或 Consul)读取,并观察更改- 从命令行标志读取- 从缓冲区读取- 设置显式值Viper 可以被认为是满足所有应用程序配置需求的注册表。

2023-06-15 21:34:45 446

原创 【Web】go后端自动生成文档神器 gin - swagger gin 中间件自动生成 RESTful API 文档。

官方的解释很清晰,我这里翻译一下[官方github](

2023-06-15 20:42:35 487 2

原创 【Web】HTTP代理和反向代理

就是从客户端直接访问服务端,相当于我直接去厂家买可乐,没有中间商赚差价。

2023-05-29 18:04:19 826

原创 【Web】JWT(JSON Web Token)验证是什么?和SWT,SMAL的区别

JWT(JSON Web Token)是一种轻量级的安全传输方式,可以用于在不同的系统之间传递安全可靠的信息,例如用户身份验证、授权和信息交换等。JWT采用JSON格式对信息进行编码和传输,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用算法)或使用的公钥/私钥对进行签名。

2023-05-28 21:35:26 1121

原创 【go】interface接口是什么?底层结构体源码

控制平面 : 管理集群中的和节点 : 一组工作机器,称为节点,每个集群至少有一个节点pod:节点会托管podpod是所有业务类型的基础,也是K8S管理的最小单位级,!接下来我们细说一下其中的控制平面中的组件。

2023-05-17 14:50:09 295

原创 【k8s】Kubernetes 组件概述

控制平面 : 管理集群中的和节点 : 一组工作机器,称为节点,每个集群至少有一个节点pod:节点会托管podpod是所有业务类型的基础,也是K8S管理的最小单位级,!接下来我们细说一下其中的控制平面中的组件。

2023-05-14 14:32:38 446

原创 【k8s】 Kubernetes是什么?应用部署方式回顾

这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。的工作负载和服务,可促进声明式配置和自动化。说白了就是管理容器的工具。Kubernetes 是一个可移植、可扩展的开源平台,用于。

2023-05-14 11:39:03 356

原创 【go】defer作用,使用场景,注意事项以及源码分析

## defer 结构体 ```gotype _defer struct { sp uintptr //函数栈指针 pc uintptr //程序计数器 fn *funcval //函数地址 link *_defer //指向自身结构的指针,用于链接多个defer}```

2023-05-12 20:17:23 554

原创 【go】context作用以及源码分析

}Deadline方法用于获取Context的截止时间,如果没有设置截止时间则返回false。Done方法用于获取一个只读的channel,当Context被取消或者到达截止时间时,该channel会被关闭。Err方法用于获取Context的错误信息,如果Context未被取消则返回nil。Value方法用于获取Context中指定键的值,如果键不存在则返回nil。

2023-05-04 17:22:29 552

原创 go 内存管理-从TCMalloc到go内存管理

GO中把对象分为小对象和大对象(>32KB),而小对象分为tiny对象(1Byte~16Byte),和其他小对象。从large span set选择合适数量的页面组成span。TCMalloc 把对象分为3种,小对象大小:0。与mcentral向mheap申请内存的相同。直接在PageHeap选择。,大对象大小:>1MB。

2023-05-04 16:36:43 636

原创 对象关系映射ORM是什么?有什么优缺点?go语言中ORM的实现-gorm

在上面的代码中,我们使用了 GORM 中的一些 API,例如 Create()、Find()、First()、Save() 和 Delete() 等。这些 API 可以帮助我们进行数据库操作,而不需要直接编写 SQL 语句。ORM 工具通常提供了一组 API 和查询语言,使得开发者可以使用面向对象的方式进行数据库操作,而不需要了解底层数据库的细节。ORM 工具可以自动生成 SQL 语句。可以将 Go 语言中的结构体映射到关系型数据库中的表格,从而简化了与数据库的交互。

2023-05-01 17:34:16 187

原创 操作系统上下文切换

在上下文切换的过程中,操作系统会保存当前进程或线程的运行状态(也称为上下文),并将其恢复到下一个要执行的进程或线程中。上下文切换是指操作系统从。

2023-04-30 17:19:44 230

原创 如何使用MySQL,Redis,ZooKeeper 实现分布式锁,什么是分布式锁

其中,lock_key是锁的名称,unique_value是一个唯一的值,可以使用UUID等方式生成,NX表示仅在键不存在时进行设置,PX表示设置过期时间为30秒(30000毫秒)。由于Redis是单线程的,所以设置键值对的操作是原子性的,客户端在获取锁时可以采用重试机制,如果获取锁失败,则等待一段时间后再次尝试获取。客户端在获取锁时可以设置超时时间,如果在超时时间内无法获取到锁,则放弃获取。客户端在获取锁时可以采用重试机制,如果获取锁失败,则。,如果在超时时间内无法获取到锁,则放弃获取。

2023-04-30 16:50:38 734

原创 LInux硬链接和软连接的区别

是指创建一个指向原始文件的指针,它类似于Windows中的快捷方式。软链接包含了原始文件的路径信息,当打开软链接时,系统会自动跳转到原始文件所在的位置。软链接可以跨越不同的文件系统,也可以链接目录。,因此它们共享相同的文件内容。硬链接只能在同一个文件系统中创建,且不能链接目录。当原始文件被删除时,硬链接仍然可以访问相同的数据。是指在文件系统中创建一个与原始文件相同的新文件,它们具有。

2023-04-29 21:52:36 318

原创 【go】channel结构体源码和读写和关闭过程

当一个 goroutine 要向 channel 中发送数据时,它会执行。当一个 goroutine 要从 channel 中接收数据时,它会执行。当一个 goroutine 要关闭 channel 时,它会执行。

2023-04-28 09:37:02 744

原创 【go】 如何保证并发安全

Go 提供了一些原子操作,如 atomic.AddInt32、atomic.LoadInt32、atomic.StoreInt32 等,可以在不使用锁的情况下对共享资源进行原子操作,从而保证并发安全。使用 context 包可以对协程进行控制,比如可以通过 context.WithTimeout、context.WithCancel 等方法设置超时时间、取消协程等操作,从而保证协程的安全退出。当需要等待多个协程执行完毕后再进行下一步操作时,可以使用 sync.WaitGroup 进行协程同步。

2023-04-27 21:39:57 244

原创 【go】三色标记-垃圾回收机制

该算法是一种基于标记-清除(Mark and Sweep)算法的改进版本,采用**三种不同的颜色(白色、灰色和黑色)**来表示对象的不同状态。这个阶段的操作通常是从堆的起始位置开始,对于每一个对象,都会检查它是否被标记,如果没有被标记,就将其释放掉。,这样就会出现在扫描结束后,栈上仍存在引用白色对象的情况,这时的栈是灰色的,不满足三色不变式,所以需要对。通常,这个阶段会从根对象开始遍历,对于所有可达的对象,都会打上标记。,标记不再使用的对象,然后释放它们所占用的内存空间。使其变黑,完成剩余对象的标记,

2023-04-27 10:35:24 493

原创 【C++】dynamic_cast 进行类型转换步骤以及底层实现

dynamic_cast 能够进行安全的向下转型,即将一个基类指针或引用转换为派生类指针或引用。,如果无效,返回 NULL 或抛出 std::bad_cast 异常。例如,在向下转型时,如果源指针或引用指向的对象不是目标类型的对象,或者源指针或引用不是指向多态类型的指针或引用,转换就是无效的。,如果不兼容,直接返回 NULL 或抛出 std::bad_cast 异常。** 检查源指针或引用是否为 NULL**,如果是,直接返回 NULL 或抛出 std::bad_cast 异常。

2023-04-25 21:30:42 1007

原创 Redis Cluster 原理和优缺点

Redis Cluster 是 Redis 的集群化解决方案之一,它可以将多个 Redis 节点组成一个分布式集群,实现数据的分布式存储和处理。Redis Cluster 的集群模式采用了分片技术,将所有的键值对分散存储在多个节点中,并通过哈希槽将每个键值对映射到一个固定数量的哈希槽中。每个节点负责维护一部分哈希槽,并在这些哈希槽上存储对应的键值对。当客户端对 Redis Cluster 发送命令时,Redis Cluster 会根据键名计算哈希值,并将哈希值映射到一个对应的哈希槽上。

2023-04-23 14:51:31 1063

原创 go-geecache 总结和收获

这里我们定义了数据结构 Cache 包含一个双向链表和map,map表示真正的缓存,双向链表表示最近的缓存使用情况,然后定义一个entry,用来淘汰双向链表队首,根据key删除map数据。

2023-04-21 10:30:00 297

原创 【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信

详情看这篇博客[【go】protobuf 基本介绍和window安装说明](【go】protobuf 基本介绍和window安装说明_CCSU__LRF的博客-CSDN博客。

2023-04-20 08:40:39 458

原创 【go】protobuf 基本介绍和window安装说明

Protocol Buffers(简称protobuf)是一种由Google开发的序列化数据结构的格式,可以用于数据存储、通信协议等多个领域。它的主要优点包括:简单:protobuf的编写和解析非常简单,只需要定义一个IDL文件,并使用protobuf的编译器来生成代码即可。高效:protobuf的编码和解码速度非常快,同时它的序列化后的数据大小也比XML和JSON等格式要小得多。

2023-04-19 21:06:25 1610

原创 【go项目-geecache】动手写分布式缓存 - day6 - 防止缓存击穿

概念可以看我这篇博客缓存穿透,缓存雪崩,缓存击穿概念及解决方法简单说一下缓存击穿,就是在缓存中找不到数据,导致直接访问数据库,降低效率。

2023-04-19 15:06:33 822

原创 缓存穿透,缓存雪崩,缓存击穿概念及解决方法

缓存穿透是指请求在缓存和数据库中都找不到,每次请求都会穿透缓存访问数据库,导致数据库被频繁地访问,从而降低系统的性能指在短时间内大量缓存失效,此时所有缓存都会访问数据库,导致数据库被瞬间压力过大,甚至崩溃。缓存击穿是指请求在缓存找不到,但是其他请求需要访问这个数据,由于缓存中没有这个数据,就会导致这些请求都需要访问数据库,从而降低系统的性能。这种情况也可以被攻击者利用来发起攻击。

2023-04-19 10:11:23 208

原创 【go项目-geecache】动手写分布式缓存 - day4 - 一致性哈希(hash)

首先把整个哈希值空间变成一个环,然后把key哈希放在环上,接着把value哈希放在环上,我们让value哈希的位置的顺时针的下一个key哈希作为对应关系 ,因为整个哈希空间是个环,这样即使某些节点增加或者减少,也只需要修改节点附近的对应关系。它的主要思想是将数据和节点映射到一个虚拟环形空间中,通过一致的哈希函数将数据均匀地分布在环上,然后根据节点在环上的位置将数据映射到相应的节点上,从而实现负载均衡。一致性哈希(Consistent Hashing)是一种常用的哈希算法,主要用于解决。

2023-04-18 21:33:26 458

原创 【go项目-geecache】动手写分布式缓存 - day4 - 一致性哈希(hash)

它的主要思想是将数据和节点映射到一个虚拟环形空间中,通过一致的哈希函数将数据均匀地分布在环上,然后根据节点在环上的位置将数据映射到相应的节点上,从而实现负载均衡。一致性哈希(Consistent Hashing)是一种常用的哈希算法,主要用于解决。最终达到的效果就是每个请求都会落在同一个节点上,提高了缓存效率,但是去缺点就是。这里如果hash函数为空,那么默认调用32位的CRC校验值。

2023-04-18 16:45:27 384

原创 【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端

了解go函数的可变参数的使用,还有切片展开的方式即…了解了HTTP通信方式,hinder的使用了解了go.mod ,import 和modoule的使用分布式缓存需要实现点对点的通信,我们可以使用HTTP来实现节点之间的通信,如果说某个节点开始了HTTP服务,那么其他节点就可以进行通信}) {

2023-04-18 15:23:59 321

原创 【go项目-geecache】动手写分布式缓存 day2 - 单机并发缓存

了解接口的使用场景,它和函数之间的差别和优略势测试文件要以_test结尾系统设计要严谨,要考虑后期的拓展性和维护 ,比如load函数考虑到了分布式场景数据结构之间的封装。

2023-04-17 22:31:17 403

原创 【golang项目-GeeCache】动手写分布式缓存 day1 - 实现LRU算法

LRU(Least Recently Used) 最近最少使用 算法 ,系统认为如果这个数据最近使用过那么它被再次使用的概率会高,所以系统会先淘汰最久没被使用的数据。

2023-04-16 21:56:14 517

原创 如何使用Redis缓存 ?

写入的数据先在redis中更新,等到这些增改的数据要被从缓存中淘汰出来时,再次将它们写回后端数据库。因为Redis基于内存,读写速度快。写入的数据写入数据库后,

2023-04-15 21:47:08 695

原创 IO多路复用 学习笔记 (阻塞 IO,非阻塞IO,select 模型,poll 模型,epoll 模型)

就是用一个线程或者一个进程监控文件描述符是否能执行 IO操作。

2023-04-15 21:09:27 610

原创 Educational Codeforces Round 143 E. Explosions 【动态规划dp】

([Problem - E - Codeforces](https://codeforces.com/contest/1795/problem/E))## 思路 : 我们可以定义两个dp数组,分别表示最高点为i向左能爆破的数量和向右的数量那么dp(向左爆破的数量)应该是从i向左找到第一个j , 使得 A[i] - (i-j-1) > A[j],也就是说中间那部分一定可以使用等差数列计算,而小于j的部分则是dp[j]那么我们可以推出 dp(i) = dp(j) + cost(j,i) (使用等差数列

2023-03-13 16:03:25 140

原创 Educational Codeforces Round 144 D. Maximum Subarray 【动态规划dp】题解

我们设dp表示以i为结尾的最大字段和并且选择j个位置+x那么我们可以分成三种情况- 当 j = 0 时,即所有位置都不选,那么就是所有位置都减去x,根据常规的最大字段和dp即可,dp(i,j) = max(A[i] - x ,A[i]-x+dp(i-1,j))- 接下来我们考虑取第i个位置的情况 ,那么如果前面i - 1结尾的字段和大于0那么取dp(i-1,j-1)一定是最优的,否则我们从0开始,可以得出 dp(i,j) = max(0,dp(i-1,j-1)) + A[i] - x - 考虑不取

2023-03-13 10:41:36 161

原创 【2022ICPC沈阳I题解】【值域线段树+贪心】The 2022 ICPC Asia Shenyang Regional Contest I. Quartz Collection

线段树里面存区间和在区间内的数的个数那么对于每次修改,我们拿的位置是确定的,我们用值域线段树维护sum[4],分别表示从i号位相隔4个位置的和(例如 1 2 3 4 5 6 7 3 2 ,sum[0] = 1 + 5 + 2),那么对于Bob ,小于0区间的sum[2]+sum[3] 就是他取的值,大于0的部分需要根据小于0的奇偶性来判别。

2023-03-02 19:44:26 996 2

原创 【计算机网络】期末计网复习资料(应该全了)

主机B收到ARP请求分组后,向主机A发送一个ARP响应分组(该分组包含A的IP地址和MAC地址、B的IP地址和MAC地址),主机A将获得的MAC地址写入自己的ARP高速缓存,并填到MAC帧中,完成解析过程。=========================================================================第三个文件========================================================================

2023-02-23 21:16:33 10601 14

原创 Effective C++ 26 ~ 31 条款 实现 包括 尽可能延后变量定义式的出现时间 尽量少做转型动作 避免返回handle指向对象内部成分 为“异常安全”而努力是值得的

# 条款26:尽可能延后变量定义式的出现时间## 尽可能延后变量定义式的出现,这样可以增加程序的清晰度并改善程序效率。## 问题A (效率问题): ```cpp// 这个函数过早定义变量“encrypted”std::string encryptPassword(const std::string& password){ using namespace std; string encrypte

2023-02-20 13:00:26 891

原创 ACM常用模板V2.0

ACM常见模板

2023-02-18 13:46:34 296

空空如也

空空如也

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

TA关注的人

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