- 博客(244)
- 资源 (11)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 保持学习,持续进步
在近些年来,程序员这个职业越来越广为大众所知,这一方面是一些互联网企业的迅速发展让很多人看到了这个方向的希望,另一方面程序员的工资普遍高。因此报IT方向的大学学生越来越多,除了主修这个专业的之外,还有很多别的专业的学生会通过自学学习编程,或者通过社会上的培训机构学习。每年毕业、就业的程序员越来越多了呢。而且除了竞争加大,技术的更新换代也越来越快,早些年会一些PHP、jee就能谋生,而近两年大家都在...
2018-12-28 11:03:13
5274
1
原创 godis 运行原生redis命令
我们可能会遇到需要运行的某些命令在godis中不存在的情况,这个时候我们可以使用其原生的方式运行命令,为了方便使用,封装了一个方法,用于简化这个过程。需要注意的是,执行命令的返回结果返回的是interface{},需要对其进行解析成可读的实体结构。传递的参数logger是用来打印日志的:// RunRedisCmd 运行redis命令func RunRedisCmd(redis *godis.Redis, logger *log.Logger, cmd string, args ...string)
2022-05-01 10:50:29
544
原创 idea、goland泛型语法报错解决|go1.18泛型初体验
go在1.18正式推出了泛型,你是否和博主一样好奇其语法呢?快啊来看看吧1. 版本更新&插件更新go如何更新到最新版本,可以查看https://www.hengyumo.cn/momoblog/detail/20220417102155idea插件更新:setting >> plugin >> installed全部更新之后idea版本更新(可能要更新多次,直到更新到不能更新为止):help >> check update在此处勾选上泛型支持
2022-05-01 10:33:01
4268
原创 go更新最新版本
最近go1.18出了泛型,趁着周末有时间,赶不及要尝尝鲜呢。那如何更新我本地go到最新版本到1.18呢1. 下载安装包https://go.dev/dl/2. 执行安装点击打开安装程序,点击next选择卸载之前版本同意,下一步选择安装目录点击安装安装完成3. 验证版本cmd 输入go version可以了,已经更新到了最新的1.18.1版本...
2022-05-01 10:29:58
1246
转载 Redis是如何实现高性能的?
Redis作为应对高并发场景的利器,它是如何实现高性能的呢?IO多路复用传统对于并发情况,假如一个进程不行,那搞多个进程不就可以同时处理多个客户端连接了么?多进程是可以解决一些并发问题,但是还是有一些问题,上下文切换开销,线程循环创建,从PCB来回恢复效率较低。随着客户端请求增多,那么线程也随着请求数量直线上升,如果是并发的时候涉及到数据共享访问,有时候涉及到使用锁来控制范围顺序,影响其他线程执行效率。在学NIO之前得先去了解IO模型(1)同步阻塞IO(Blocking IO):即传统的IO模型
2022-05-01 10:26:53
729
转载 在面对一些亿级流量场景,消息队列届的排头兵kafka是如何保证高性能的呢?
在面对一些亿级流量场景,消息队列届的大哥kafka是如何保证高性能的呢?Kafka Reactor模型架构Kafka客户端和服务端通信采取的是NIO的reactor模式,它是一种事件驱动模式。reactor模型天然支持高并发,可以充分利用多核心多线程。https://blog.51cto.com/u_15067229/2573746页缓存技术+磁盘顺序写2.1 操作系统每次从磁盘读写数据的时候,需要先寻址,也就是先要找到数据在磁盘上的物理位置,然后再进行数据读写。如果是机械硬盘,这个寻址需
2022-05-01 10:21:48
281
原创 linux系统或者windows WSL安装redis最新版本
概述因为windows的最新版本redis已经在16年就停止更新了,目前最新的版本只到redis3,很多redis新增的特性都无法使用。例如redis5的stream,windows版本就没有。这篇文章通过使用wsl来为windows提供最新版本redis的支持,而免于去启动虚拟机的麻烦事了。主要安装的流程和linux上一般无异。1、下载redis打开 https://redis.io/download/ 查看可用版本。截至这篇文章写作时,redis目前的稳定版本是6,预计今年会更新7,目前还在
2022-04-27 18:58:33
1351
原创 redis实现消息队列的几种方式及其优劣
概述常用的消息队列有,rabbitMq、kafka、RocketMq、ActiveMq等。这些消息队列需要独立安装部署,作为一个中间件来提供服务,虽然有着高性能、高可靠的优点,但是额外部署这些中间件也会增加运维成本,和服务器成本。本篇文章探讨了一下如何使用redis实现消息队列。使用redis无需额外的部署,如果原先就有使用redis的话。此外redis更为轻量也更容易维护。但是redis实现消息队列有多种方案,这些方案有其优点也有其缺点,适用于不同的应用场景。以下从“实时性”、“可靠性”、“功能性”这
2022-04-27 18:45:56
18963
4
原创 使用gomail发送邮件
概述为了实现一个邮件验证码功能,特意了解了一下go如何发送邮件。本来以为会很麻烦,没想到其实很简单。工具类实现的工具类如下:package mailimport "gopkg.in/gomail.v2"// MailConfig 邮箱发送配置type MailConfig struct { Account string // QQ邮箱填写授权码 Password string // QQ:POP/SMTP 587 Port int // QQ:smtp.qq.com Host
2022-04-27 18:36:07
1219
原创 Gin路由算法模拟
概述Gin的路由算法是采用压缩字典树实现的,基数树(Radix Tree)又称为PAT位树(Patricia Trie or crit bit tree),是一种更节省空间的前缀树(Trie Tree)。对于基数树的每个节点,如果该节点是唯一的子树的话,就和父节点合并。下图为一个基数树示例:https://www.cnblogs.com/randysun/p/15841366.html算法模拟结构体组成:// TrieNode 压缩字典树节点type TrieNode struct {
2022-04-27 12:23:26
763
转载 PowerDesigner导入sql脚本
1.依次点击File->Reverse Engineer->Database…2.弹出弹窗对模型进行命名,同时在DBMS下拉选择框中需要选择自己对应的数据库类型,点击确定新的弹窗,选中Using script files,再点击红圈中,选中你的sql脚本位置,点击确定结果图如何让Name里面的值显示的是comment里面的值在使用REVERSE ENGINEER从数据库反向生成PDM的时候,PDM中的表的NAME和CODE事实上都是CODE,为了把NAME替换为数据库中
2022-04-25 16:13:48
3622
原创 gin 框架原理
Gin的路由原理Gin的路由基于Trie树和压缩字典树算法,什么是Trie树?其实很好理解,看下图:单词at,bee,ben,bt,q组成的Trie树如下:每个字母的父亲节点就是它的前一个字母Trie树的三个性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串每个节点的所有子节点包含的字符都不相同也就是按照各个词的前缀,将所有的词拆解组成一颗树的结构。那么有了这样的一颗树,查找单词就变得很简单,从根节点开始向下
2022-04-25 16:12:07
1263
原创 go sync.Pool 深入
new函数的调用时机和pool的内存释放规则以下代码调用了四次Get函数,但是并不是每次都会new第一次,是a := pool.Get().([]byte),首次Get,在pool的private私有池没有对象,在共享池也没有对象,不存在victim cache,所以会new。第二次,是b := pool.Get().([]byte),因为a取出后,pool的私有池又成为了空。在共享池也没有对象,不存在victim cache,所以会new。第三次,是c := pool.Get().([]byte
2022-04-25 16:09:08
394
转载 tcp黏包问题
服务端代码如下:package mainimport ( "bufio" "fmt" "io" "net")func process(conn net.Conn) { defer conn.Close() reader := bufio.NewReader(conn) var buf [1024]byte for { n, err := reader.Read(buf[:]) if err == io.EOF { break } if err != nil
2022-04-25 16:08:10
281
转载 go 编写tcp和udp服务端和客户端
TCP协议TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。TCP服务端一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就创
2022-04-25 16:07:06
525
转载 网络协议概述
互联网协议介绍互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。我们理解了这些协议,就理解了互联网的原理。由于这些协议太过庞大和复杂,没有办法在这里一概而全,只能介绍一下我们日常开发中接触较多的几个协议。互联网分层模型互联网的逻辑实现被分为好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。用户接触到的只是最上面的那一层,根本不会感觉到下面的几层。要理解互联网就需要自下而上理解每一层的实现的功能。
2022-04-25 16:05:26
434
转载 TCP和UDP的区别
TCP协议与UDP协议的区别首先咱们弄清楚,TCP协议和UDP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信!TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。TCP/IP协议集包括应用层,传输层,网络层,网络访问层。其中应用层包括:1、超文本传输协议(HTTP):万维网的基本协议;2、文件传输(TFTP简单文
2022-04-25 16:01:27
384
转载 UDP协议
UDP 概述(User Datagram Protocol,用户数据报协议)用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及查错检测的功能UDP 的主要特点UDP 是无连接的,即发送数据之前不需要建立连接(发送数据结束时也没有连接可释放),减少了开销和发送数据之前的时延UDP 使用尽最大努力交付,即不保证可靠交付,主机不需要维持复杂的连接状态表UDP 是面向报文的,发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UD
2022-04-25 15:58:54
3132
转载 TCP协议
TCP 基础https://www.jianshu.com/p/ef892323e68fTCP 使用固定的连接TCP 用于应用程序之间的通信。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。TC
2022-04-25 15:55:46
2344
转载 TLS协议/SSL协议
历史背景SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC里包含了很多互联网技术的规范!起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这
2022-04-25 15:53:05
2469
转载 http协议原理
HTTP工作原理HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。以下是 HTTP 请求/响应的步骤:客户端连接到Web服务器一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP
2022-04-07 15:29:02
2989
原创 GO GC垃圾回收
垃圾回收(Garbage Collection,简称GC),是编程语言运行时自带的内存管理功能,例如Java、python、js、ruby、Erlang等语言都有其GC功能。一个进程拥有的资源包括栈和堆,栈通常存储临时变量,在函数返回时就自动释放。堆则存储程序动态申请的内存,例如c中的malloc。这一部分申请的内存需要程序员手动进行回收,否则将存在内存泄漏的风险。但是将回收内存交给程序员,显然是很容易犯错的。后续的很多语言都加上了GC功能,在程序运行时,由虚拟机或者Runtime进行垃圾回收,减轻了程序
2022-04-07 15:16:45
327
原创 go并发3-定时器、select、锁、atomic、sync
time.Ticker定时器// 定时器,延迟一秒func Test_15(t *testing.T) { ticker := time.NewTimer(1 * time.Second) start := time.Now() now := <-ticker.C fmt.Println(now) fmt.Println(time.Since(start))}time.Timerfunc Test_16(t *testing.T) { // 每隔一秒 timer := ti
2022-04-07 15:01:51
797
原创 go并发-协程池优化及性能测试分析
相比前一个版本优化了代码:/* 有关Task任务相关定义及操作 *///定义任务Task类型,每一个任务Task都可以抽象成一个函数type Task struct { Run func() error //一个无参的函数类型}/* 有关协程池的定义及操作 *///定义池类型type Pool struct { // 协程池最大worker数量,限定Goroutine的个数 workerNum int // 协程池内部的任务就绪队列 jobsChannel chan *Tas
2022-04-07 14:38:13
782
原创 go并发-协程池
协程池虽然go的协程设计已经非常完美。但是无休止的开辟Goroutine依然会出现高频率的调度Groutine,依然会浪费很多上下文切换的资源。所以设计一个Goroutine池限制Goroutine的开辟个数在大型并发场景还是必要的。/* 有关Task任务相关定义及操作 *///定义任务Task类型,每一个任务Task都可以抽象成一个函数type Task struct { Run func() error //一个无参的函数类型}//通过NewTask来创建一个Taskfunc N
2022-04-07 14:33:53
524
2
原创 go并发2-go并发基础使用
启动一个goroutine启用go关键字即可启动一个goroutinefunc Test_1(t *testing.T) { ch := make(chan int) go func() { for i := 0; i < 10; i++ { ch <- i } close(ch) }() for v := range ch { fmt.Println(v) }}WaitGroup 等待多个goroutine完成var wg1 = sync.Wai
2022-04-07 14:31:52
360
原创 go 并发1-基础原理
进程和线程A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。进程与线程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但
2022-04-07 14:27:13
253
原创 go 单元测试
基础Go语言中的测试依赖go test命令。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数类型格式作用基础测试前缀为Test测试程序的逻辑是否正确性能测试前缀为Benchmark测试程序的性能提供示例前缀为Example为程序
2022-04-07 14:14:17
6214
原创 go 压力测试
基础Go语言中的测试依赖go test命令。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数类型格式作用基础测试前缀为Test测试程序的逻辑是否正确性能测试前缀为Benchmark测试程序的性能提供示例前缀为Example为程序
2022-04-07 14:09:06
1244
原创 go 异常处理
panic-recover机制go中不像其它语言有try catch语法,同样也不推荐捕获异常而是推荐采用将异常返回的方式。但是对于一些会导致程序崩溃的严重异常,直接退出也会比层层返回方便的多。因此go中实现了panic-recover机制,专门用于对这些异常进行抛出和恢复。在语义上,try catch更像尝试性的去做一些事,在这期间如果发生错误,则如何如何。而panic则是告诉你程序奔溃了,发生了特别严重的故障,到了难以恢复的程度。recover则是看看能不能救回来,如果不是极其致命,那么就继续服务吧
2022-04-06 16:17:59
2783
原创 go 面向对象
概述go的面向对象和其它的面向语言并不太相同。首先,go是没有类的概念的,在go中数据是数据,方法是方法,二者比较独立。其次go对继承的实现更像是“组合”。go的接口是鸭子类型:只要你像个鸭子,那么我就认为你是个鸭子,而不需要显式的实现接口,像java的implements XXX在go是不存在的。面向对象的三个特征:继承、封装、多态 go都可以实现。(多态需要基于接口实现)基础语法type User struct { name string}func (u User) introduceM
2022-04-06 16:11:32
2540
原创 go defer使用
defer 用于延迟调用关键字 defer 用于注册延迟调用。这些调用直到 return 前才被执。因此,可以用来做资源清理。多个defer语句,按先进后出的方式执行(类似于栈)。defer语句中的变量,在defer声明时就决定了。defer的理解defer和很多语言的finally关键字有点相似,都是在执行完某段代码之后必须会执行到的,finally块即使catch块有return他还是会被执行的。defer声明了一个在函数返回时需要执行的函数栈,每次声明都是将对应的函数压入栈中,等到r
2022-04-06 15:24:47
294
原创 go 函数
go 函数声明go 的函数声明规则和类C语言有较大的不同,它的返回值写在最后。其实这样会更符合人类的思维方式,先想到函数名称、再想到函数需要传的参数,最后才想到函数的返回值:func testFunc1(name string) (string, error) { if name == "" { return "", errors.New("name is empty") } else { return fmt.Sprintf("hello, %s!", name), nil }}
2022-04-06 15:21:25
110
原创 go 流程控制
if … else if … else 语句golang的if 条件中不需要加括号,并且if支持写声明语句import "fmt"func testIf1(c int) { a := 1 // if 可以写声明语句 if b := 4; a < c && c > b { fmt.Println("c") } else if a = 3; a == c { fmt.Println("a") } else { fmt.Println("b") }}
2022-04-06 15:17:38
214
原创 go 基础
1、go关键字 break(和c一样用于退出循环) default(当 select 中的其他条件分支都没有准备好的时候,`default` 分支会被执行。) func(声明函数) interface(声明接口) select select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。 select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到
2022-04-06 14:29:13
856
原创 Go 环境变量、go env
1、常用环境变量GOROOT 指的是go的安装路径,导入go内部库时会去goroot寻找。GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。GOPATH 存放第三方库的路径不同于其他语言,go中没有项目的说法,只有包, 其中有两个重要的路径,GOROOT 和 GOPATHGOROOT是安装目录,GOPATH是我们的工作空间, 用来存放包的目录GOP
2022-04-06 14:11:31
7544
1
原创 Go语言的前景、优点
Go语言的前景、优点go是google开源的编程语言,诞生于2006年,2012年发布稳定版。有道是背靠大树好乘凉。作为大厂设计开发的语言,它拥有更好的背景以及发展。go自带GC,因此程序员不需要操心内存的释放与回收。相比java、c++,它的语法更加精简,less can be more的思想得到了完美的体现,因此go语言上手更快。它的基础语法和编程范式和c语言相差不大,如结构体、指针
2022-04-06 11:18:07
4739
原创 docker 删除某个镜像创建的所有容器
命令如下:docker rm $(docker ps -a | grep cae5f8e9bd47 | awk '{print $1}')其中 cae5f8e9bd47 是镜像的ID主要利用了awk '{print $1}'来打印第一行的容器ID,然后将结果当作参数传给docker rm命令。
2021-08-06 21:08:03
544
puTTY汉化工具包大全,包含有putty, pageant, plink pscp, psftp, puttygen, puttytel
2019-01-04
MTracerFree_2.1 正则表达式验证工具
2018-10-20
ssh-tectia-client 6.3.2
2018-10-13
notepad++7.33
2018-10-13
django-docs-1.11-en
2018-10-13
DeskPins 1.30
2018-10-13
Chrome安装(2018最新)
2018-10-13
NppFTP_0.26.3
2018-10-13
bootstrap-3.3.7-dist
2018-10-13
bootstrap-3.3.7源码
2018-10-13
SSHSecureShellClient-3.2.9
2018-10-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人