自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 监听redis的key过期事件

notify-keyspace-events,将值设置为EX,直接连接redis后执行下面的代码即可。通过go-redis进行监听。E:表示键过期事件通知。x:表示键空间事件通知。

2024-06-11 22:01:08 134

原创 go使用ssh从云服务器存取文件

【代码】go使用ssh从云服务器存取文件。

2024-06-05 16:11:34 103

原创 go实现AES加解密

【代码】go实现AES加解密。

2024-06-05 14:34:06 131

原创 go的反射和断言

在go中对于一个变量,主要包含两个信息变量类型(type)和变量值(value)reflect.TypeOf()返回的是一个Type类型,里面保存了类型的信息。对于Type可以通过reflect.TypeOf()获取到变量的类型信息。reflect.ValueOf()返回的是一个Value类型。通过reflect.ValueOf()来获取到变量的值部分。可以通过Value.Kind()获取到该变量大概的类型。go中的断言可以将一个未知的类型转换为指定的类型。通过结合反射和断言,我们可以实现这样的一个功能。

2024-06-04 16:31:48 430

原创 mysql日志

记录了当mysql启动和停止时,以及服务器在运行过程中发生的任何严重错误时的相关信息,该日志是默认开启的,查看日志位置/var/log/mysqld.log就是mysql的错误日志的位置。

2024-06-03 20:32:08 331

原创 mysql查询的时间复杂度

如果customers和orders都没有索引的话,一个数据量为N,一个数据量为M,那么总的时间复杂度为O(NM),假设M有索引的话,时间复杂度为O(N logM),两个都有索引的时间复杂度为O(N+M)索引的值本身都是有序的,所以可以直接通过类似于双指针的形式对两个表都进行扫描。并且上述复杂度都是在customer_id字段为唯一索引的情况下,如果customer_id重复度都比较的高,那么组合排列数就为NM,时间复杂度肯定也就是O(NM)。如果对age添加了索引,那么复杂度为O(log n)

2024-05-29 20:54:44 370

原创 使用go发送邮箱

【代码】使用go发送邮箱。

2024-05-29 19:35:31 73

原创 git冲突

如果想撤销掉本次的一个提交,可以先通过git log查看自己的commit_id然后通过git revert commit_id,本地将会回退该版本,然后重新push即可,git会给commit 的备注前面自动加上Revert。大概的意思是远端仓库有你没有的内容,也就是用户A的push,用户B并没有进行更新,并且也对同一个文件进行了修改,产生了冲突,通过git pull后git会自动为冲突的文件添加一定的标志信息。其中内容1为当前用户产生冲突的内容,内容2为上传用户的冲突内容。就会产生这样的一个错误。

2024-05-27 23:07:23 401

原创 使用api和rpc的一个综合使用

最后就是logic/loginlogic.go中对于具体服务的一个处理。在login中进行token的生成,其他的响应根据业务写出相应的代码。在etc/users.yaml中添加myslq的链接信息和jwt。在config/config.go中添加相应的配置内容。在svc中配置数据库的初始化和Context信息。首先是api文档,然后通过命令。去生成对应的go项目。

2024-05-21 13:58:35 336

原创 go-zero(rpc服务)

service:定义一个服务,其中rpc UserInfo(UserInfoRequest) returns (UserInfoResponse)表示定义一个rpc服务,接受一个UserInfoRequest请求,响应为UserinfoResponse。api端主要是起一个接口的作用,根据配置文件,获取到对应的rpc链接,然后再转发请求到rpc服务,最终rpc端处理并相应。其中etc文件和internal文件和根据api生成的文件作用和结构几乎都是差不多的。go_out:指定go语言生成目录。

2024-05-20 22:15:49 470

原创 git命令总结

git reset --hard version :加载指定版本(HEAD^表示上个版本,HEAD^表示上上个版本)git status :查看git仓库中文件的状态信息,包括已修改、已缓存或未跟踪的文件。git checkout --document :放弃修改某文件恢复到最近一次的提交状态。git init :git初始化,将当前目录变成git管理的仓库。git remote -v :查看已经配置的远程仓库列表。git reflog:查看Git仓库的引用日志。git log:查看提交日志。

2024-05-17 17:14:31 174

原创 Go-zero(api部分)

其中LoginRequest表示登录的请求体,要求包含string类型的username和password语法类似于go的type struct也支持写在一起type(效果是一样的service users表示定义了一个名称为users的微服务,最后的入口文件名称也会是users.go@handler 用于对生成的文件和方法命名post:表示这是一个post请求/login:表示请求路由。

2024-05-17 15:16:38 829

原创 golang中的defer

defer un(trace("a"))在执行到defer的时候就会执行函数un中的函数trace并得到返回值。目前得到的解释为defer在调用函数之前就会提前求出函数中各个形参具体的值,所以对于。看过的有一本书中写过defer能够影响到最终的返回值,差不多也是用到了同样的道理。除了正常的函数结束使用外。对于下面的这一段代码。

2024-05-16 14:43:40 217

原创 golang中传递变长参数(...type)

结果也都是不受影响的,完全也可以理解为一个函数传递切片的简写方法,运行效率和底层差异目前还不清楚,也有可能编译器的优化使得这两种方法运行逻辑都是一样的。原来有很长的一段时间不理解golang函数实参和形参中的 ... 到底是什么意思,有好几次的失败使用案例,具体也忘了当时为啥失败了。按照字面意思的理解的话,min(slice...)差不多等价于min(7,9,3,5,1),测试结果却是也是一样的。结果也是一样的,对于展开的写法,也可以直接定义为一个切片。对于实参中的(type...)网上常见的一种叫法是。

2024-05-16 14:17:11 179

原创 go实现ORM框架(sql基本结构)

首先写一些基本的东西,Exec主要用于执行原生的mysql指令,QueryRow用于请求数据,QueryRows用于请求多条数据。因此我们需要导入mysql的驱动通过sql.open(driver,source)来连接mysql数据库。go本身提供了一个库database/sql用来管理数据库,但是缺少驱动需要导入驱动。

2024-04-23 19:51:29 128

原创 go实现GeeCache(一致性哈希)

一致性hash算法也差不多是这样,但是没有这样的平均,首先我们计算所有key的hash值,并排好序形成一个环,对于所有的节点我们同样也计算他的hash值(一般是计算节点名称的hash值)然后关于key的归属,假设有key的hash值1 3 5 8 9 有三个节点的hash 2 5 8,那么对于每个数据的归属都是通过二分查找不小于当前key的hash值的最小节点hash对应的节点,如果大于所有节点那么就是最小的那个节点,所以节点2存储1 9,节点5存储3 5,节点8存储8。添加节点和获取数据所在的节点。

2024-04-21 10:12:00 157

原创 Go实现GeeCache(单机并发缓存)

主要的一个数据查找流程:首先查找主缓存中是否存在有该数据,如果有就直接返回,否则通过调用子缓存接口中的Get方法获取数据,如果有的话,主缓存中存放一个。Group主要是用来存储缓存的信息,name:该缓存的名字,getter:子缓存数据获取接口,mainCache:主缓存。然后是缓存的获取方法,首先是通过主缓存查找,如果查找不到就从子缓存中查找并返回(调用子缓存中的Get方法)提供一个读写锁,防止写冲突,同时定义一个map用于映射各种缓存。定义一个Getter接口,该接口主要是用于通过子缓存获取数据。

2024-04-16 21:05:57 198

原创 Go实现GeeCache(LRU缓存淘汰策略)

核心思想:首先是一个双端队列,同时用一个map来映射队列中元素与key的关系,方便快速定位某一元素,当添加或者访问元素的时候,就将该元素移动到队列的前面,如果当前数据内存超限就会pop队列的末尾元素。首先是定义一个Cache用来管理整个缓存,其中OnEvicted是回调函数,可以用来统计那些数据是经常被淘汰之类的用户自定义功能。然后是数据,要求是key+一个实现了Len的Value接口,Len主要方便计算缓存大小。最后是获取元素,获取元素的同时也要将元素移动到链表最前面。

2024-04-15 21:02:36 200

原创 用Go实现Web—Gee(错误恢复)

runtime.Callers用于返回调用栈的程序计数器,第0个事Callers本身,第1一个是trace,第2个是defer func(ctx *Context) 通过retime.FuncForPC(pc)获取对应的函数,在通过fn.FileLine(pc)获取到调用该函数的文件名和行号,打印在日志中。ctx.Next()主要用于先执行其他的中间件,然后通过defer func来捕获错误并返回错误信息.Recover本身也作为一个中间件放置于根路由中。

2024-04-14 22:17:14 115

原创 用Go实现Web-Gee(静态文件)

http.StripPrefix主要的作用是假设路由是/home访问/home/user/1.jpg,固定的目录是D:windows/,那么就会被解析成访问路径D:/windows/user/1.jpg,最后返回一些基本处理方法,以及调用系统已经封装好的ServeHTTP进行文件的访问。首先是实现一个createStateTicHandler传递是两个参数string和一个http.FileSystem,一个是需要绑定的路由另一个是一个接口主要用于打开文件,需要实现Open方法。然后是创建该访问的方法。

2024-04-14 20:07:11 136

原创 用Go实现Web-Gee(中间件middleware)

遍历主路由中所有绑定的分组,如果当前请求路由和绑定分组匹配就将成功匹配分组中所有的中间件添加进来通过Context来进行传递。中间件的作用主要是根据用户的需求对响应进行二次加工,同时也可以根据分组来分配中间件,通过RouterGroup.middlewares来存放该分组所有的中间件。将路由的响应也封装到中间件中通过Next来一键执行所有中间件。通过与RouterGroup绑定的Use来添加中间件。然后就可以自定义一个中间件输出自己想要的信息。通过中间件就能够自定义响应的日志以及信息。

2024-04-14 17:05:26 166

原创 用go实现web-Gee (路由分组)

然后重新修改gee.go中的内容,完成路由分组的操作。engine用于指向总Engine中存储的路由信息。路由分组主要是用类似于链表的方法进行实现的。prefix用于保存当前的一个路由前缀。首先要定义一个路由分组的struct。parent用于指向父分组。

2024-04-12 17:02:27 198

原创 用Go实现Web-Gee(路由匹配)

首先是实现了一个Trie树,以及提供了两个函数,一个用于插入新的路由,一个则用来进行路由匹配,然后重新修改router。如果匹配成功会返回匹配成功的路由以及提取出来的字段。根据匹配到的路由查找对应绑定的方法,完成请求的响应。同时重写router.go。

2024-04-11 21:30:09 156

原创 用go实现Web-Gee其一

net.http.HandleFunc通过对应的函数去处理对应模式pattern,函数中的两个参数http.ResponseWriter是用于处理http回复的接口,http.Request用来存放请求数据。服务器监听指定端口,对于客户端的请求调用接口中的ServeHTTP(engine实现了该方法)同时传递两个参数ResponseWriter(用于响应请求的接口)和Request(存储客户端的请求信息)对于当前的请求所绑定的方法就是main函数中的,func(ctx *gee.Context)

2024-04-10 14:59:30 408

原创 c++重载

最后一个node3=node4会调用默认的复制运算符重载函数.默认的赋值运算符重载函数是编译器自动生成的,将源对象的成员变量直接复制给目标对象的相应成员这个时候node3的ptr指针和node4的ptr指针指向的会是同一块内存,这个时候就会造成不必要的麻烦,最好的方法就是重载赋值运算符。但是交换了顺序以后double*Node就不可以了,左侧的应该是调用对象,因此编译器不能使用成员函数调用来替换该表达式。在执行Node*double的时候等价于Node.operator*(double)

2023-12-24 14:32:08 43

原创 linux学习笔记

e :支持反斜杠控制的字符转换 \\(输出'\') \n(换行) \t(制表符)-f 实时监控文件内容更新 ctrl+s暂停监控 ,ctrl+q 继续监控,ctrl+c退出监控。内容 > 指定文件: 将命令的输出重定向到指定文件,并覆盖文件中原有的内容,如果不存在则创建一个新文件。内容 >> 指定文件: 将命令的输出追加到指定文件中,如果文件不存在则创建一个新的文件。enter :向下翻一行。

2023-11-06 14:20:37 85

原创 https://codeforces.com/contest/1862

如果总共有n个球,那么最多可以有n*(n-1)/2+n种配合,后面的+n是可以改变的,同时计算一下n个球和n-1个球的差距是小于n的,所以可以通过二分计算最少需要多少球才能让n*(n-1)/2+x(0<=x<=n)满足题目要求的个数。这个题目首先要转换一下思维,假设你最后一个位置选在i,那么一定会有i*d的损失,这个损失是固定的,所以我们可以枚举最右端,使用优先队列维护我们拿到的m个最大值.水和火的蓝条每一秒固定增长的,所以我们直接二分时间,然后通过背包判断是否能将所有的怪物杀死。

2023-08-30 20:40:22 82

原创 codeforces 1857(div3) E-F

稍微改变一下思路,对于每区间[l,r]单独计算该区间的贡献,对于区间[l,r]的贡献为r-l+1,然后就是计算对于任意的xi作为s能够造成的价值,对于比s小的数肯定就是[l,s],对于比s大的数肯定就是[s,r],分别对比s小的和大的统一计算,计算完后还有[s,s]本身,也就是要+1;对于ai+aj=x,ai*aj=y,可以稍微改变一下也就是ai=x-aj ==> aj*x-aj*aj=y ==>aj^2-aj*x+y=0;并查集+组合数+最小生成树。

2023-08-09 15:49:36 86

原创 codeforces 1856(div2)题解

对于一个区间两个区间[l,mid],[mid+1,r]假设我都已经知道了最大值的位置inx1和inx2,如何去计算inx1和inx2那个更加的大呢?,如果假设inx1是最大的那么询问的区间[inx1,inx2]包含inx1和不包含inx1产生的差值一定是inx2-inx1,因为如果inx1是最大的那么对于区间[inx1+1,inx2]内所有的元素都会产生一个逆序对,数量刚好是inx2-inx1,通过分治从小区间开始计算出每个区间的最大值,每次的花费都不超过2*len^2,最终的花费不会超过3*n^2。

2023-08-08 20:10:38 91

原创 codeforce div3 1851(E-G)

对于a,b,我们首先需要怎样设定x才能让(a^x)&(b^x)最大,总共有三种情况,对于a,b二进制情况下,如果第i位a,b都为1,那么x在这一位一定不为1,这样计算出来才能获得第i位的值,如果a,b都不为1,那么x在第i位为1的时候计算才能获得第i位的值,最后就是一个为1,一个为0,这种情况下,无论x在这一位是什么值,都不能使最后的计算得到这意味值,也就是必定损失的.很容易就想到字典树,字典树写起来有那么一点点的麻烦.所以我换了一种写法:分治。最终还是有点菜了,看了题解。

2023-07-27 19:30:03 108 1

原创 codeforce 1848 (A-D)

对于两种选择:1.积攒,2.兑换 根据贪心的思想,肯定是先积攒,然后后面的次数全是兑换,对于积攒的次数和最终获得的价值,很容易可以看出是一个抛物线(左右低,中间高),求解抛物线可以通过公式,也可以通过三分,但是如果直接套入求解的话就会发现无法求解,或者说求解的结果是错的,因为对于循环节2 4 8 6本身也是一个抛物线的情况,所以两个抛物套在一起,得出来的图形就不是标准的一个抛物线的形状了,上面会有一些起伏.除了0和5,其余的每个数字都包含了循环节2 4 8 6 并且对于每一次循环,都会产生20的差值。

2023-07-20 09:37:04 66

原创 https://codeforces.com/contest/1823 (div2)

暴力求每个数的素数因子,每两个相同的素数因子一定能够凑成一个满足题意的数,每三个不同的素数因子一定能够凑成一个满足题意的数,贪心凑数即可。因为a[i]>=3,所以前面三个我们可以用abc,对于后面的,需要增加多少个回文串我们就加多少个'c'+i,否则就是a,b,c依次循环。第二层博弈,对于一条链来说,我们可以删除l,r个节点,使得这条链变成两条链长度分别为a,b(a,b>=0)补题的时候只想到了第一层的博弈,然后写出来的sg函数非常的对,但是就是不过。最后结合两个sg函数通过找规律最终求解。

2023-05-02 21:12:20 94

原创 https://codeforces.com/contest/1822(div3题解)

首先如果是奇数的话肯定是不行的,因为正中间有一个字符导致无论如何都是不成立的。最多需要暴力1e3,对于每个数桶排,然后排列组合计算匹配数量即可。算法类似于求树的直径,但是是求每个节点的最长链路,然后bfs求出获得的最大权值,输出即可。树上dp+求节点最长链路。

2023-04-26 23:30:34 71

原创 三分算法模板

【代码】三分算法模板。

2023-04-26 15:53:28 79

原创 计算节点最长链

以i为根节点的单链最长长度/经过节点i的最长链长。

2023-04-26 14:38:28 42

原创 倍增LCA模板

链式前向星写了一个init(n)初始化。倍增表格的建立自带有初始化。

2023-04-25 20:42:47 60

原创 学习日记:2022年2月16日

学习日记:最小生成树

2022-02-16 21:33:58 239

原创 学习日记:2022年2月15日

学习日记:最小生成树

2022-02-15 20:26:02 165

原创 学习日记:2022年2月14日

学习日记:最短路

2022-02-14 22:37:30 229

原创 学习日记:2022年2月13日

学习日记:最短路

2022-02-13 23:20:05 7294

空空如也

空空如也

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

TA关注的人

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