- 博客(52)
- 收藏
- 关注
原创 深入剖析 Web HTTP 请求:从浏览器到服务器的完整流程
从浏览器发出请求,到服务器经过反向代理、路由、处理业务逻辑后返回响应,再到浏览器解析渲染,
2024-11-10 02:33:06
1825
原创 【Kafka-go】golang的kafka应用
网络上关于go的Kafka还是比较少的今天就先出一篇入门级别的,之后再看看能能出一个公司业务场景中的消息流。
2024-11-10 02:21:35
853
原创 Go 设置并发控制数量 【go并发模型】
理论上讲并发数小于任务数,总不能1000个任务开2000个并发,首先就像1000个馒头让2000个人去吃一样撤,其次是开2000个并发如果任务比较重那数据库也受不了报警。这个代码假设是每个任务执行时间是1秒如果我们不开并发执行1000个任务是1000秒但如果我们开100个并发只需要10秒 1000个并发只需要1秒 10个并发小于10秒。我给出的并发模型的可以通过修改channel的容量来控制并发数。:go的并发控制也是老生常谈,在公司业务中也是经常出现。谈谈我们这次并发模型的。
2024-10-18 15:21:43
648
1
原创 【吊打面试官系列】为什么Mysql的索引结果用B+树
而B树中,数据存储在每个节点中,链表的存在让B+树比B树更适合顺序访问和范围查询。由于B+树的层数较少,每次查询从根节点到叶子节点只需要进行少量的磁盘读取操作,能快速定位目标数据。当有新的数据插入或删除时,B+树会保持自平衡,即在发生操作时树的高度不会大幅增加,这保证了数据库在面对大量插入、更新和删除时仍然能够保持较高的查询性能。因此,B+树在MySQL InnoDB引擎中作为索引结构,主要是因为它能够平衡磁盘访问、查询、插入、删除等操作的效率,且特别适合范围查询和顺序访问的场景。3. 高效的查询性能。
2024-08-24 21:51:03
391
原创 分布式锁 分布式锁解决了什么问题 如何实现 看门狗机制是什么
锁的key:应固定,表示要锁定的资源。锁的value:保存线程或节点的唯一标识符,用于区分持有锁的线程或节点。在 Redis 分布式锁中,所有线程都应该尝试设置相同的key,而区分不同线程的是value中的标识符。你提到的问题可能是在理解时将线程标识符放在了key中,这样会导致每个线程创建的key不一样,从而失去了锁的作用。在 Go 中结合 Redis 实现一个简单的分布式锁,通常可以使用 Redis 的SET命令和一些关键选项,如NX(表示仅在键不存在时才设置键)和PX。
2024-08-12 08:17:49
830
原创 hash表如何形成,hash函数如何计算,什么是hash冲突 如何解决 ,Golang map的底层原理及扩容机制
由于我们之前讨论的哈希函数主要是针对数字进行计算的,因此,当 key 为字符串时,首先需要将字符串转化为整数,然后再经过哈希函数的运算产生哈希值。如上图,11 、19、27经过运算后的映射下标都是3,由于3被最开始的11占用,那19就不得不后移占住后面空着的下表,这样就会产生连锁反应导致原来hash值是4的key也要后移,这样查找起来就非常麻烦。:如果主桶已满,则会创建一个溢出桶,将多余的键值对存储在溢出桶中。我们遍历⼀个正在迁移的Map时,新的和旧的就会遍历,如果⼀个旧的的桶已经迁移⾛了,那么就直。
2024-07-30 16:25:17
1314
1
原创 存储器分级 一篇文章让你搞懂寄存器 高速缓存 内存 硬盘的区别和联系
寄存器存放CPU正在运行的指令和数据,是最快的存储器,L1 cache 存放即将执行的指令和即将使用的数据,以便快速访问,L2 、L3 cache存放等待执行的程序和数据,优先级排在L1缓存之后,内存中存放正在执行的程序和数据,包括当前大部分还不需要CPU立即处理的部分,硬盘持久化存储数据,保存计算机未来要用的数据和文件信息。内存中但通过缓存预加载,使得cpu拿数据只需往缓存中拿了,实现了cpu的读取整个程序的速度几乎和cpu读取缓存的速度接近。以前还有一种物理读写的磁盘,我们也叫作硬盘,它的速度比内。
2024-07-26 14:52:44
1280
原创 005IPv6协议Tunnel技术是什么
网卡(Network Interface Card,简称 NIC),也称为网络适配器,是计算机硬件的一部分,用于连接计算机到网络。网卡负责在计算机与网络之间进行数据传输。
2024-07-20 21:44:38
678
原创 java 比Scanner 更高效的输入输出 BufferedWriter和`OutputStreamWriter
当我们在 Java 中需要进行字符输出时,可以使用和的组合来实现。
2024-06-02 14:56:19
334
原创 JWT详解
JWT是JSON Web Token的缩写,是为了在网络应用环境间传递生命而执行的一种基于JSON的开放标准。JWT本身没有定义任何技术实现,它只是定义了一种基于token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程,特别使用与分布式站点的单点登录场景一个JWT Token格式它有 . 分割成但部分组成,头部负载签名头部和负载以JSON形式存在,这就是JWT中的JSON,三部分的内容都分别单独经过了 Base64编码,以 . 拼接成一个JWT Token。
2024-05-26 14:52:43
894
原创 【操作系统】为什么要引入虚拟内存
操作系统通过将虚拟内存映射到物理内存和磁盘上的交换空间,允许程序使用比实际物理内存更多的内存。进程可以假定它拥有连续的内存空间,而操作系统负责将这些虚拟地址映射到实际的物理地址。这种机制不仅扩展了有效的内存容量,还允许进程状态在程序崩溃或关机时保持,并在重新启动时恢复。虚拟内存使得每个进程都有自己独立的地址空间,防止一个进程访问或修改另一个进程的内存。虚拟内存使得进程可以被调度到不同的物理内存位置,甚至可以被交换到磁盘上。多个进程可以共享同一个库的内存映像,而无需为每个进程复制该库。
2024-05-19 11:35:52
566
原创 Redis缓存雪崩,击穿,穿透问题
通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。fill:#333;应用层Redis层数据库层请求数据返回缓存数据请求数据返回数据返回数据并缓存alt[数据存在于Redis][数据未命中]应用层Redis层数据库层 那么,当。
2024-05-09 09:31:53
994
1
原创 乐观锁 通俗易懂的介绍
乐观锁是一种并发控制机制,通常用于多个用户或线程并发访问共享资源时,保证数据一致性的一种方法。与悲观锁不同,乐观锁假设在大多数情况下并发冲突不会发生(所以叫乐观),因此不会在访问资源之前进行加锁,而是在更新资源时进行检查。通俗点就是 我认为这个事务很少会有高并发的冲突,所以我不对资源上锁,只乐观地上个锁看这个事务有没有被其他客户端影响,如果被影响就终止事务或重做。
2024-04-25 09:48:11
439
1
原创 go语言 go-redis watch实例
讲一下对watch的理解在redis中watch是通过加了乐观锁的方法先获取事务执行前key值,如果在开始执行事务时检测到由于并发key被其他客户端修改了,就会终止事务如果用go-redis实现就是这样的其中watch即使对key值的监听,fn回调函数相当于如果key没有发生修改要执行的事务逻辑。
2024-04-25 09:45:05
609
3
原创 第15届蓝桥杯题解
十四届国二选手,发表一下,今年提挺坑的。以前经典的斐波那契函数是初始数据 是 1 1然后新的数等于前两个数相加于是数列为 1 1 2 3 5 8......本题的意思是 先给你一个数让你初始化数列数据比如 197初始化数据是 1 9 7然后新的数等于前n个数相加(n为S的位数比如197n就为3)于是数列为 1 9 7 17(1+9+7) 33(9+7+17) 57(7+17+33) 107(17+33+57)197(33+57+107)...所以我们算法思路也是先
2024-04-21 08:29:20
4709
4
原创 009优化器
而对于其他优化器误判的情况,你可以在应用端用 force index 来强行指定索引,也可以通过修改语句来引导优化器,还可以通过增加或者删除索引来绕过这个问题。因为以a为索引 会先用索引查询1000条数据 然后在根据b between 50000 and 100000 的条件过滤,我当时想的and语句会分别查询a 和b的行然后求交集再排序 ,由于排序的时候是b所以我想选b为索引。1)扫描行数 ,扫描的行数越少,意味着访问磁盘的数据的次数越小,消耗cpu的资源越少。Mysql是如何得到索引的激素和。
2024-04-14 14:27:57
240
原创 第十四届蓝桥杯javaA组 阶乘的和
这个题我做的时候已经看出来,最小的m一定是最小的Ai,然后如果想让想让m+1那么只能让最小的Ai的数量是m+1的倍数因为比如说m=Amin +1 那么想让m!是 Ai阶乘和的倍数只有。然后以相同的方法看是否能将Amin+1!转化为Amin+2!然后我就不知道如何就m等于Amin+2的情况了,其实可以迭代将nAmin!直到不能转化为止,此时最小的Amin就为m的最大值。
2024-03-30 21:40:53
245
原创 第十四届蓝桥杯javaA组 D题棋盘
题目也就迎刃而解了,如果不了解上面基础算法得小伙伴可以先学习一下,解题事半功倍。后面看题解也看不懂,于是慢慢了解一维差分,二维差分,二维前缀和。这道题写的时候先用暴力解题只能过30%
2024-03-30 20:58:20
311
原创 一维差分算法
在刷javaA组蓝桥本真题时,碰到了一个用二维差分方法的解题思路,意识到自己差分不熟悉,就想先学习一下一维差分。假设:数组的大小为n,修改次数为m,修改区间平均下来是 1/2 n。就可得到状态2的数组arr2=【1,1,1,1,1,1,1,0】经过遍历之后arr就变成【1,-2,-2,2,5,1,1,0】那么数组arr为 【1,0,0,0,0,0,-1,0】比如说arr1=【1,0,0,0,0,0,-1,0】实际数组应该是【1,1,1,1,1,1,1,0】输出:[ 1,-2,-2,2,5,1,1,0 ]
2024-03-30 16:48:52
388
原创 加密技术概述
所以数字签名很难会被修改,因为采用密钥加密,攻击者即使可以捕获数字签名并用公钥解密,他修改数字签名后也不能对修改后的数字签名进行加密。修改,因为采用密钥加密,攻击者即使可以捕获数字签名并用公钥解密,他修改数字签名后也不能对修改后的数字签名进行加密。具体原理就是 用共享密钥加密数据,用公钥加密共享密钥, 将两个加密的数据和密钥都发给对方。共享加密和公共加密,用共享加密加密公共加密的公钥,优化了公共加密加密时间长的问题。来回交换生成新的密钥 运用了伟大的离散问题,我的理解非常安全。
2024-03-24 11:01:49
1055
原创 第十四届蓝桥杯蜗牛
到达第i根竹竿底部的时间=蜗牛到达第i根竹竿的传送门出口的时间(即到达第i-1竹竿传送门入口的时间:time_portal[i-1])+ 传送门出口到底部距离/下爬速度。time_portal[i] 表示蜗牛从原点到达第i根竹竿可以传送到第i+1竹竿的传送门入口 a1的最短1时间。很明显,代码中表示最状态的数组为 time_bottom[i]表示蜗牛从原点到达第i根竹竿的底部用的最短时间。注意:到达第i个竹竿传送门入口的最短时间也是,蜗牛传送到第i+1根竹竿传送门出口的最短时间。(2)从底部爬到传送门。
2024-03-12 08:14:36
625
原创 三步实现支付宝支付【go语言 支付宝沙箱】
支付宝沙箱支付是支付宝提供的一个测试环境,用于开发者在不影响真实交易的情况下进行支付接口的开发和调试。在沙箱环境中,开发者可以模拟真实的支付流程,包括支付、退款、查询等操作,以便更好地调试和验证自己的支付接口是否正确。使用支付宝沙箱支付可以帮助开发者提高支付接口的稳定性和安全性,避免在开发过程中对真实交易造成影响。同时,沙箱环境还提供了丰富的测试工具和文档,方便开发者快速上手和进行测试。在控制台的沙箱操作时可以查看自己的沙箱账号用于模拟收付款。将私钥 和 KAppId改成自己的。
2024-03-09 17:29:55
1639
1
原创 003堆栈内存
引用数据类型的大小是不固定的,而且它们的生命周期可能会比栈内存中的局部变量更长。因此,将引用数据类型的对象存储在堆内存中。可以更灵活地管理对象的生命周期,并且可以通过引用在不同的方法和作用域中共享对象。ps:第四点便是堆内存存放引用数据类型的原因之一。
2024-03-01 21:59:58
352
原创 001队列
java中的队列(Queue)是一种常见的数据结构,它遵循先进先出的原则。java提供了多种队列的实现方式。常用的包括LinkedList。ArrayDeque 和 PriorityQueue.(前两种实现方式队列没有边界大小,不会满) 添加元素、获取并移除元素、获取但不移除元素、其他操作(如判断空,大小,清除全部队列)
2024-02-25 19:45:23
282
原创 解决前端获取后端传输的整形数据爆精度问题
本例将 code{1,12.0} 序列化为josn格式 {"id":"1","score":"12"}`{"id":"1234456","score":"88.50"}`反序列化为Card{ID:1234567, Score:88.5}序列化时将结构体变量名转化为tag名 类型转化为tag的类型反序列化时将tag名转化为结构体变量名 类型转化为结构体变量的类型。
2024-02-17 20:07:06
290
原创 【mysql】当表为空时如何输出null 方法全集
ps空表示没有没有任何输出,null表示输出为null可以使用聚合函数进行空值null值的转换,具体的聚合函数包括SUM/AVG/MAX/MIN可以使用select语句进行转换但空值应直接写在select中而非from中 limit语句无法出现新的null值where和having同样无法出现新的null值。
2024-02-17 15:26:39
1568
原创 go语言 声明结构体变量以及结构体指针的方法与区别
现有结构体 MyStructimport ("fmt"var myStruct *MyStruct // 结构体变量的零值fmt.Printf("IntField: %d\n", myStruct.IntField)//输出0fmt.Printf("StringField: %s\n", myStruct.StringField)//输出“”fmt.Printf("PtrField: %v\n", myStruct.PtrField) // 指针字段的零值是 nil。
2024-01-29 14:49:31
308
原创 【快速幂加快速乘】解决算法中90%快速幂爆精度问题
第三步 38+76+(76*2)%100 *5/2 等价 (38+76)%100+52*2 即 14+52*2。第二步 38+38*2*(11/2) 等价 19+72*5。第一步 (19*2)*22/2 等价 38*11。如果题目背景是数值最大精度为200 那么19*22就直接爆精度了,而用快速乘的方法不会直接爆。b 拆分成 (2a)
2024-01-26 18:00:46
513
1
原创 数组之二分查询
if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target(也就是说target一定不能在mid位置)那么搜索范围肯定不,那么接下来要查找的左区间结束下标位置就是 middle - 1 类比 如果中间值大于target left=mid+1。【2】比较中间值 mid=(left+right)/2 如果中间值大于target那么target就在左半部分 如果中间值小于target那么target就在右半不放呢。
2023-11-16 17:22:45
229
1
原创 MySQL 备份数据库 以及运行备份好的.sql文件
要复制备份一个 MySQL 数据库,您可以使用 MySQL 的内置工具和功能来执行该任务。2.查看自己系统变量里配的mysql环境。1.打开终端黑窗口 输入。
2023-10-25 20:17:39
441
1
原创 力扣673.最长递增子序列的个数
一样先从i=1开始遍历数组nums[]与前面的数比较如果nums[i]>nums[j] 1<=i<nums.length。那么最长递增序列的长度不变,数量加上新产生的子序列的数量num[j] 即num[i]=num[i]+num[j]那么最长递增子序列的长度和数量都将变化, 长度变dp[i]=num[j]+1 数量为新产生序列的数量。只需在原来代码的基础上多加一个数组num[i]记录以nums[i]结尾的最长递增子序列的数量。假如当前记录的以nums[i]结尾的最长递增子序列的长度为n。
2023-10-19 21:57:13
86
1
原创 力扣300. 最长递增子序列
i->[1,nums.length) j->[0,i) 让nums[i]与nums[j]进行比较如果nums[i]>nums[j]那就说明nunms[i]可以加在nums[j]后面形成新的序列,新增的序列的长度为nums[j]+1 然后让 求出dp[i]的转移方程。2,5,7 或2,3,7就不能选了所以我们可以返回直接跳过10,9但计算机很难实现这样的思路即从前往后比较添加递增序列突然发现后面有一段递增序列但由于前面数的限制而不能添加,再回到前面把那个限制添加的数去掉。
2023-10-19 17:06:58
108
1
原创 力扣53. 最大子数组和
抛开计算机不谈,先说一下我们现实中碰到几个数让你求连续的几个数的和的最大值,怎么办,连续的序列比如 -2 1 -3 4 -1 2 1 -5 4 首先找连续序列的第一个数,只要是正常人,看到负数 -2 直接pass,只要是负数开头的序列一定会更小 ,然后直接 选1 接着就是-3 然后序列1开头也就到此为止了因为1+(-3)=-2 你如果把1+(-3)看成一个数-2 那么序列就变成了 -2 -2 4 -1 2 1 -5 4 所以我们要接着跳过-2(也就是1-3)我们要创建一个变量 int sum=0;
2023-10-19 15:58:57
73
1
原创 golang 同一包下调用不同go文件的函数报错:undefined:函数名
因为只编译了main.go文件,而game.go文件没有编译,所以mian.go运行到NewGame()时就会找不到。命令运行Plane 目录下的全部文件。
2023-10-15 11:34:11
596
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人