- 博客(73)
- 收藏
- 关注
原创 【Linux】nohup命令使用
运行这条命令如果会忽略输入且将命令运行结果输出到当前目录下的nohup.out日志下。且运行当前命令会占用当前终端直到命令运行结束终端才能接受其它输入。的运行结果会重定向到test.log中,包括标准输出(stdout)和错误输出(stderr)。,代表命令会不挂断的在后台运行,后台会有该命令运行进程号并且终端可以接受其它输入。译为不挂起,用于在Linux中不挂断的运行命令,终端退出也不会影响。:让命令在后台运行,退出终端后,后台依然运行。配合使用不挂断的运行命令在Linux后台。这条命令比上条命令多了。
2024-08-11 17:13:53
268
原创 【golang】内存对齐
在访问特定类型变量的时候通常在特定的内存地址访问,这就需要对这些数据在内存中存放的位置有限制,各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。内存对齐是编译器的管辖范围。表现为:编译器为程序中的每个“数据单元”安排在适当的位置上。
2024-05-23 10:42:37
1107
原创 【操作系统】内存分配问题
等下次在申请内存的时候,就直接从内存池取出对应的内存块就行了,而且可能这个内存块的虚拟地址与物理地址的映射关系还存在,这样不仅减少了系统调用的次数,也减少了缺页中断的次数,这将大大降低 CPU 的消耗。malloc 通过 brk() 系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当内存释放的时候,就缓存在内存池中。这样当执行free函数时,free会对传入进来的内存地址向左偏移16字节,然后从这个16字节的分析出当前的内存块的大小,自然就知道要释放多大的内存了。
2024-05-06 11:17:03
850
3
原创 【golang】http.ListenAndServe源码解析
if err!= nil {return errListenAndServe监听TCP网络地址 srv.Addr,然后调用服务来处理传入连接的请求。第二层首先根据srv中Addr定义了监听信息,然后把监听对象ln作为srv(Server)对象调用Serve方法的参数。以上就是当调用接口时候ListenAndServe的大致流程。
2024-03-14 15:41:57
1297
2
原创 【Git】解决上传代码到github不增加代码提交次数问题
在我们向github远程仓库中提交代码时,有时候会出现提交了代码却没有显示代码的提交记录问题。这是因为你远程github的用户信息和你本地仓库用户信息不一致造成的。查看哪一项用户信息与你github上不同。
2024-03-08 09:55:36
460
原创 【golang】深入理解切片(slice)函数传递
切片在go语言中属于引用类型,但是在go中都是值传递(拷贝副本),那切片是传递的什么呢?在函数传递中就是把这个结构体拷贝了一份副本进行传递。所以上面问题就得到了解答,因为拷贝的是slice结构体的副本,而。切片指针地址值,作append增加或修改操作都是对一个。对象修改的,所以在不同作用域下修改的对象都是一致的。,切片未发生扩容,所以代码运行结果为切片第一个元素为。是正常变化了的,这是怎么回事呢?,而传递的原slice结构体是没有发生改变的。切片的底层其实是一个结构体类型,在。函数,函数功能为切片增加。
2024-03-02 11:17:34
750
2
原创 【golang】Context超时控制与原理
当定时器到期时,会调用cancel方法关闭通道,级联关闭当前Context派生的子Context,并取消与父Context的绑定关系。每个派生出的子Context都会创建一个新的退出通道,这样,只要组织好Context之间的关系,就可以实现继承链上退出信号的传递。而WithDeadline函数会先判断父Context设置的超时时间是否比当前Context的超时时间短,如果是,那么子协程会随着父Context的退出而退出,没有必要再设置定时器。因此,要具体使用Context,需要派生出新的Context。
2024-01-21 21:13:43
1580
原创 【LLM】Prompt微调
在机器学习中,Prompt通常指的是一种生成模型的输入方式。生成模型可以接收一个Prompt作为输入,并生成与该输入相对应的输出。Prompt可以是一段文本、一个问题或者一个片段,用于指导生成模型生成相应的响应、续写文本等。
2024-01-16 13:31:20
1205
原创 【golang】init()函数是什么时候执行的?
Go程序初始化先于main函数,由runtime初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。总结: import –> const –> var –> init() –> main()每个包首先初始化包作用域的常量和变量(常量优先于变量),然后执行包的。函数没有入参和返回值,不能被其他函数调用,同一个包内多个。函数执行完后,程序就等于结束了。函数前执行,可以实现包级别的初始化操作–函数的执行顺序不作保证。函数是程序执行的入口,
2023-12-25 21:22:01
766
1
原创 【golang】为什么使用goland终端修改不了Go语言的配置环境?
终端修改配置变量的语法命令是不一样的,所以在goland终端中修改配置变量没有生效。修改不成功的原因是因为goland终端使用的是。系统上运行的golang程序的二进制文件。输入这两条命令之后,虽然终端不会报错,但是。查看之后,发现配置环境还是没有修改成功。这就需要暂时修改一下golang的。然后使用windows系统中的。最近在做项目时,需要使用。系统上打包一个可以在。但是修改的时候发现在。经过查询之后,发现在。
2023-12-02 15:50:48
1178
原创 【Casbin】一篇文章入门Casbin
Policy 就是一种定义,它界定了策略的含义。[policy_definition] //定义policy.csv存储到数据库中策略一般会存储到数据库,因为会有很多策略eg:在本例中,sub、obj和act代表经典的访问三元组:主题(访问实体)、对象(访问资源)和操作(访问方法)。但是,我们也可以自定义自己的请求格式。例如,如果不需要指定特定的资源,可以使用sub, act;如果有两个访问实体,可以使用。
2023-12-02 14:56:10
2540
原创 【PostgreSQL】解决PostgreSQL时区(TimeZone)问题
一、因为项目的PostgreSQL是在云服务器上用Docker部署的,所以首先到docker容器中排查了一下。在Navicat可视化软件中是没有这个问题的,服务器上配置的时区就是Navicat的时区。,但是goland自带的可视化数据库依然是没有设置的,所以我们看到的还是。二、数据库用的可视化工具是用的goland中自有的Database。方案二:设置goland中Database中的时区。时间而数据库中写入的数据是不一致的数据。在goland中的Database中的。goland中的时区是。
2023-11-21 21:04:29
3226
原创 【golang】探索for-range遍历实现原理(slice、map、channel)
for-range其实是正常for循环的一种语法糖,在go语言中可以遍历arr,slice,map和channel等数据结构,但是在一些初学者使用for-range可能会遇见很多坑,这篇文章会带你探索一下for-range中非常有趣的一些实现机制。
2023-11-13 22:22:18
1391
原创 【Redis】Redis实现分布式锁
分布式锁是一种在分布式系统中实现同步机制的技术。它允许多个进程或节点在访问共享资源时进行同步,以确保它们按照预期的顺序执行。这篇文章使用Redis来分布式锁,通俗的来说,分布式锁本质上要实现的目标就是在Redis里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲在那里了,就只好放弃或者稍后重试。接下来我们来循序渐进的实现一个成功的分布式锁。
2023-11-05 17:58:02
231
原创 【OAuth】OAuth2.0四种授权模式
开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务器提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供的某些特定信息,而非所有内容。
2023-10-13 16:17:48
313
原创 【Redis】数据过期策略和数据淘汰策略
Redis所有的数据结构都可以设置过期时间,时间一到,就会自动删除。这些问题Redis作者 Antirez 早就想到了,所以在过期这件事上,Redis非常小心。
2023-10-04 10:27:59
306
原创 【Redis】redis基本数据类型详解(String、List、Hash、Set、ZSet)
渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务中以及hash的子指令中,循序渐进的将旧hash的内容一点点迁移到新的hash结构中。同样,取用户信息会经过一次反序列化的过程。Redis的字符串是动态字符串,是可以修改的字符串,内部实现上采用预分配冗余空间的方式来减少内存的频繁分配,如上图所示,内部为当前字符串实际分配的空间。正常条件下,当hash表中元素的个数等于第一维数组的长度时,就会开始扩容,扩容的新数组是原数组大小的2倍。
2023-10-01 17:30:14
1425
原创 【golang】深入理解Go语言垃圾回收(GC)
为了防止这种现象的发生,最简单的方式就是STW,直接禁止掉其他用户程序对对象引用关系的干扰,但是STW的过程有明显的资源浪费,对所有的用户程序都有很大影响,如何能在保证对象不丢失的情况下合理的尽可能的提高GC效率,减少STW时间呢?垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。A.添加下游对象(nil, B) //A 之前没有下游, 新添加一个下游对象B, B被标记为灰色。
2023-09-20 09:26:38
658
原创 【操作系统】深入浅出死锁问题
线程A和线程B获取资源的顺序要一样,当线程A是先尝试获取资源A,然后尝试获取资源B的时候,线程B同样也是先尝试获取资源A,然后尝试获取资源B,也就是说,线程A和线程B总是以相同的顺序申请自己想要的资源。我们使用资源有序分配法的方式来修改前面发生死锁的代码,我们可以不改动线程A的代码。我们先要清楚线程A获取资源的顺序,它先是获取互斥锁A,然后获取互斥锁B。所以我们只需要将线程B改成以相同顺序的获取资源,就可以打破死锁了。
2023-09-17 15:42:35
207
原创 【操作系统】进程是如何调度的?
对于长作业,如果在第一级队列处理不完,可以移入下次队列等待被执行,虽然等待的时间变长了,但是运行时间也变更长了,所以该算法很好的。比如,一个长作业在就绪队列等待运行,而这个就绪队列有非常多的短作业,那么就会使得长作业不断的往后推,周转时间长,致使长作业长期不会被运行。前面的「时间片轮转算法」做了个假设,即让所有的进程同等重要,也不偏袒谁,大家的运行时间都一样。似乎很公平,但是当一个长作业先运行了,那么后面的短作业的等待的时间就会很长,不利于短作业,但是依然有缺点,可能会导致低优先级的进程永远不会运行。
2023-09-15 22:03:28
626
原创 【golang】深入理解GMP调度模型
为了提高系统的性能,P 的数量肯定不是越小越好,所以官方默认值就是 CPU 的核心数,设置的过小的话,如果一个持有 P 的 M, 由于 P 当前执行的 G 调用了 syscall 而导致 M 被阻塞,那么此时关键点: GO 的调度器是迟钝的,它很可能什么都没做,直到 M 阻塞了相当长时间以后,才会发现有一个 P/M 被 syscall 阻塞了。调度器把G都分配M上,不同的G在不同的M并发运行时,都需要向系统申请资源,比如堆栈内存等,因为资源是全局的,就会因为资源竞争造成很多性能损耗。的栈空间,全局变量的。
2023-09-15 18:12:13
698
原创 【操作系统】进程,线程和协程的哪些事儿
我们编写的代码只是个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着CPU会执行程序中的每一条指令,那么这个运行中的程序,就被称为进程。线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。线程的优缺点一个进程中可以存在多个线程;各个线程之间可以并发执行;各个线程之间可以共享地址空间和文件等资源。
2023-09-15 10:43:14
162
原创 【计算机网络】什么是WebSocket?
WebSocket是一种与HTTP不同的协议。两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议。WebSocket通过HTTP端口80和443进行工作,并支持HTTP代理和中介,从而使其与HTTP协议兼容。为了实现兼容性,WebSocket握手使用Upgrade头从HTTP协议更改为WebSocket协议。WebSocket协议支持Web浏览器(或其他客户端服务器应用程序)与Web服务器之间的交互,具有价低的开销,便于实现客户端与服务器的实时数据传输。
2023-09-10 15:37:40
705
原创 【计算机组成原理】十个问题带你走进计算机组成的世界
中断处理程序应该要短且快,这样才能减少对正常进程运行调度地影响,而且中断处理程序可能会暂时关闭中断,这时如果中断处理程序执行时间过长,可能在还未执行完中断处理程序前,会丢失当前其他设备的中断请求。Linux系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分为了两个阶段,分别为上半部分和下半部分。上半部分用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。下半部分用来延迟处理上半部未完成的工作,一般以[内核线程]的方式运行。
2023-09-09 21:39:28
186
原创 【golang】工作区与GOPATH
工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。Go 语言提供的很多工具都是在GOPATH 和工作区的基础上运行的,比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。
2023-08-09 08:21:43
585
原创 【RabbitMQ】golang客户端教程5——使用topic交换器
我们创建了三个绑定关系:Q1与绑定键“ * .orange. * ”绑定,Q2与“* .* .rabbit”和“lazy.#”绑定。请注意,代码没有对路由键或绑定键进行任何假设,你可能希望使用两个以上的路由键参数。——用特定路由键发送的消息将传递到所有匹配绑定键绑定的队列。与两个绑定匹配(匹配Q2的两个绑定),也只会传递到第二个队列一次。即使有四个单词,也将匹配最后一个绑定,并将其传送到第二个队列。(井号)绑定键绑定时,它将接收所有消息,而与路由键无关,就像在。与任何绑定都不匹配,因此将被丢弃。
2023-08-08 19:59:27
750
原创 【RabbitMQ】golang客户端教程4——路由(使用direct交换器)
例如,我们可能希望将日志消息写入磁盘的脚本只接收严重错误,而不会在warning或info日志消息上浪费磁盘空间。在本教程中,我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如,我们将只能将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。我们将提供严重性(译注:通常我们使用日志级别划分日志信息的严重性)作为路由键。接收消息的工作方式与上一教程一样,但有一个例外——我们将为感兴趣的每种严重性(日志级别)创建一个新的绑定。在我们的示例中,我们可以使用绑定键。
2023-08-06 15:11:26
237
1
原创 【RabbitMQ】golang客户端教程3——发布订阅(使用fanout交换器)
一方面,它接收来自生产者的消息,另一方面,将它们推入队列。在我们的日志系统中,每一个运行的接收器程序副本都会收到消息。在这一部分中,我们将做一些完全不同的事情——我们将向多个消费者传递一个消息。首先,当我们连接到Rabbit时,我们需要一个新的、空的队列。为此,我们可以创建一个随机名称的队列,或者更好的方法是让服务器为我们选择一个随机队列名称。正如你可能从名称中猜测的那样,它只是将接收到的所有消息广播到它知道的所有队列中。如果没有队列绑定到交换器,那么消息将丢失,但这对我们来说是ok的。
2023-08-05 11:33:41
1192
1
原创 【RabbitMQ】golang客户端教程2——工作队列
我们将任务封装为消息并将其发送到队列,在后台运行的工作进程将取出消息并最终执行任务。如果使用者在不发送确认的情况下死亡(其通道已关闭,连接已关闭或TCP连接丢失),RabbitMQ将了解消息未完全处理,并将对其重新排队。当你的客户机退出时,消息将被重新传递(这看起来像随机重新传递),但是RabbitMQ将消耗越来越多的内存,因为它无法释放任何未确认的消息。在这一节中,我们将创建一个工作队列,该队列将用于在多个工人之间分配耗时的任务。如果我们的工作正在积压,我们可以增加更多的工人,这样就可以轻松扩展。
2023-07-30 20:54:31
833
原创 【RabbitMQ】golang客户端教程1——HelloWorld
RabbitMQ是一个消息代理:它接受并转发消息。你可以把它想象成一个邮局:当你把你想要邮寄的邮件放进一个邮箱时,你可以确定邮差先生或女士最终会把邮件送到你的收件人那里。在这个比喻中,RabbitMQ是一个邮箱、一个邮局和一个邮递员。RabbitMQ和邮局的主要区别在于它不处理纸张,而是接受、存储和转发二进制数据块——消息。RabbitMQ和一般的消息传递都使用一些术语。生产仅意味着发送。发送消息的程序是生产者:队列是位于RabbitMQ内部的邮箱的名称。
2023-07-30 11:06:16
1782
原创 【RabbitMQ】Linux系统服务器安装RabbitMQ
这是RabbitMQ的管理界面(Management UI)的默认端口号。通过浏览器访问 http://:15672(或者本地访问 http://localhost:15672)可以打开RabbitMQ的管理界面。在该界面上,您可以监视和管理RabbitMQ服务器、查看队列、交换器、绑定等信息,以及进行一些管理操作。客户端应用程序可以通过5672端口与RabbitMQ进行通信,包括发布消息到队列、消费队列中的消息等。博主的系统是centos 7的所以下载的是el7的。
2023-07-30 09:51:04
1396
原创 Redis持久化之AOF
以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
2023-07-28 15:51:08
156
原创 Redis持久化之RDB
在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
2023-07-28 11:41:25
202
原创 用户认证模式Cookie-Session、JWT-Token(gin框架实现)
在Web应用发展的初期,大部分采用基于Cookie-Session的会话管理方式客户端使用用户名、密码进行认证服务端验证用户名、密码正确后生成并存储Session,将SessionID通过Cookie返回给客户端客户端访问需要认证的接口时在Cookie中携带SessionID服务端通过SessionID查找Session并进行鉴权,返回给客户端需要的数据鉴于基于Session的会话管理方式存在上述的多个缺点,基于Token的无状态(服务端不存储信息)会话方式诞生了。
2023-07-24 18:03:18
499
原创 gin 中间件流程控制:Next()、 Abort()
Next应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。通俗的说,就是中间件放行,当一个中间件代码执行到Next(),会先执行它之后的函数,最后再来执行完本函数。如果其中一个中间件响应了c.Abort(),后续中间件将不再执行,直接按照顺序走完所有的响应中间件。
2023-07-23 21:08:19
1441
1
原创 golang使用bcrypt包对密码进行加密
实现中bcrypt会使用一个加盐的流程以防御彩虹表攻击,同时bcrypt还是适应性函数,它可以借由增加迭代之次数来抵御日益增进的电脑运算能力透过暴力法破解。go语言库中,bcrypt只能做单向加密,而不能反向破解生成明文,但是可以对原密码和进行hash加密后的hash值进行比对判断是否相同,使用bcrypt进行加密,同一个密码每次生成的hash值都是不相同的。除了对数据进行加密,默认情况下,bcrypt在删除数据之前将使用随机数据三次覆盖原始输入文件,以阻挠可能会获得计算机数据的人恢复数据的尝试。
2023-07-16 21:57:42
948
原创 跨域资源共享(CORS)
跨域资源共享(英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。通过该机制,页面能够自由地使用不同源(英语:cross-origin)的图片、样式、脚本、iframes以及视频。一些跨域的请求(特别是Ajax)常常会被同源策略(英语:Same-origin policy)所禁止。
2023-07-16 21:00:18
884
原创 Git开发项目完整流程使用(图文超详解)
现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。2005年,安德鲁·垂鸠(Andrew Tridgell)写了一个简单程序,可以连接BitKeeper的仓库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的许可。一般在一个多人的开发项目中,不能把自己代码直接提交到主分支(各个仓库平台主分支名称不同),而是建立一个自己的远程代码分支,然后让自己本地分支跟踪到自己的远程代码分支。7、提交本地代码到远程仓库。
2023-07-09 22:42:42
1279
原创 Go语言入门详细教程
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,他们最终的目标是设计一种适应网络和多核时代的C语言。所以Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”,Go 富有表现力、简洁、干净且高效。其并发性机制使编写充分利用多核的程序变得容易,而其新颖的类型系统可实现灵活和模块化程序构建。Go 可以快速编译为机器代码,且具有垃圾回收的便利性和运行时反射的强大功能。是一个快速的静态类型的编译语言,但感觉就像动
2023-07-01 18:21:54
3220
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人