自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Go并发安全,锁和原子操作

有时候在Go代码中可能存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。

2024-04-22 10:11:01 575

原创 Goroutine池,定时器,select

下面来一个例子:需求随机生成数字,计算一个数字的各个位数之和。例如数字123,结果为1 + 2 + 3 = 6。

2024-04-16 09:44:30 413

原创 Go——Channel通道

channel常见的异常总结:注意:关闭已经关闭的channel也会产生panic。

2024-04-13 14:32:56 1269 1

原创 Go——Goroutine介绍

在java/c++中我们要实现一个并发编程,我们通常需要自己维护一个线程池,并且需要自己取包装一个有一个任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量心智。那么能不能有一种机制,程序员只需要定义很多任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢?Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但goroutine是由Go的运行时(runtime)调度和管理的。

2024-04-12 16:37:21 1199 2

原创 Go——网络编程

在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议簇隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数,让Socket去组织符合指定的协议数据然后进行通信。UDP协议中文名称是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据的发送和接收,数据不可靠的,没有时序的通信,但是UDP协议的实时性比较好(快),通常用于视频直播相关领域。创建套接字,绑定套接字,监听套接字,监听到连接后,获取到监听套接字,然后往监听套接字中收发数据。

2024-04-11 10:21:36 986 1

原创 Go——面向对象

Go语言提倡面向接口编程。接口在底层实现上包含两部分,即类型(type)和数据(data)。接口是一个或多个方法签名的集合任何类型的方法集中只要拥有该接口对应的全部方法,就表示它实现了该接口,无须在该类型上显示声明实现了那个接口。这称为Structural Typing。所谓对应方法,是指有相同名称,参数列表(不包括参数名)以及返回值。当然,该类型还可以有其它方法。接口只有方法声明,没有实现,没有数据字段(属性)。接口可以匿名嵌入其它接口,或者嵌入到其它结构中。

2024-04-09 14:10:57 993

原创 Golang——方法

func (reveicer type) methodName(参数列表)(返回值列表){}//参数和返回值可以省略// 接收者为值类型,无参,无返回值// 接收者为值类型,单参,无返回值// 接收者为值类型,无参,单返回值// 接收者为值类型,多参,无返回值// 接收者为值类型,无参,多返回值// 接收者为值类型,多参,多返回值// 接收者为指针类型,无参,无返回值// 接收者为指针类型,单参,无返回值// 接收者为指针类型,无参,单返回值// 接收者为指针类型,多参,无返回值。

2024-04-08 16:13:21 1309 1

原创 Golang单元测试和压力测试

go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似,并不需要学习新的语法,规则和工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数,基准测试函数和示例函数。

2024-04-07 19:57:32 1005 2

原创 Go——函数

在参数赋值时,可以不用一个个的赋值,可以直接传递一个切片。注意传递切片时在可变参数后需要加"..."。

2024-04-03 15:36:43 919

原创 Go语言流程控制

select是Go的一个控制结构,类似于用于通信的switch语句,每一个case必须是一个通信操作,要么是发送,要么是接收。select随机执行一个可运行的case。如果没有case可以运行,它将堵塞,直到有case可以运行。一个默认子句应该总是可运行的。每一个case必须是一个通信所有channel表达式都会被求值所有被发送的表达式都会被求值如果任意某个通信可以进行,它就执行,其他被忽略如果有多个case可以运行,select会随机公平的选出一个执行。其它不会执行。

2024-03-29 14:52:09 970

原创 Go——结构体

在Go语言中有一些基本的数据类型,如string,整型,浮点型,布尔型等数据结构,Go中可以使用type关键字来自定义类型。自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型来定义,也可以通过struct来定义。例如:通过type关键字定义,MyInt就是一种新的类型,它具有int的特性。自定义类和类型别名表面上看只有一个等号的差异,实际上自定义类型是新增了一个类型,而类型别名并没有新增类型。下面的例子表明:a的类型为main.NewInt,表示在main包下定义的NewInt类型。

2024-03-27 17:30:33 1008 1

原创 Go——map操作及原理

KeyType表示键类型ValueType表示值类型map类型的变量默认初始值为nil,需要使用make函数来分配内存。map[KeyType]ValueType{} //底层也是使用的makemap[KeyType]Value{ //底层也是使用的makekey:value,key:value,...其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。可以使用len()内置函数来获取map键值对的个数。

2024-03-21 17:36:11 520

原创 Go——指针和内存逃逸

Go语言的逃逸分析是指:Go编译器用来决定变量存储位置的过程。逃逸分析在编译阶段完成逃逸分析目的是决定内分配地址是栈还是堆栈上分配内存比在堆中分配内存有更高的效率栈上分配的内存不需要GC处理,堆上分配的内存使用完毕会交给GC处理在实际中,应该尽量避免逃逸。栈中的变量不需要gc回收。同时栈的分配比堆快,性能好。另外,还可以进行同步消除,如果定义的对象的方法上有同步锁,但在运行时却只有一个线程在访问,此时逃逸分析后的机器码会去掉同步锁运行。

2024-03-20 20:19:39 1254

原创 Go——切片

slice并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案。

2024-03-19 13:53:39 1103

原创 Go——数组

Golang Array和以往认知的数组有很大的。

2024-03-13 10:27:50 579

原创 Go——下划线

"_"是特殊标识符,用来忽略结果。

2024-03-12 17:42:06 472

原创 Go——运算符,变量和常量,基本类型

相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的值。常量的声明和变量声明非常相似,只是把var换成const,常量在定义的时候必须赋值。声明了pi和e这两个变量之后,在整个程序运行期间它们的值都不能再发生变化了。const (e = 2.7182const同时声明多个常量时,如果省略了值则表示和上一行的值相同。//n1,n2,n3的值都是100const (n1 = 100n2n3Golang更明确的数字类型命名,支持Unicode,支持常用数据结构。

2024-03-12 17:41:19 1239 1

原创 Golang命令

【代码】Golang命令。

2024-03-12 09:24:34 257

原创 Go语言内置类型和函数

go语言拥有一些不需要进行导入操作就可以使用的内置函数。他们有时可以针对不同类型进行操作,例如len,cap和append,或必须用于系统级的操作,例如:panic。因此,他们需要直接获得编译器的支持。

2024-03-11 15:56:35 1110 1

原创 Go语言简介

其下创建src,pkg,bin目录,bin目录用于生成可执行文件,pkg目录用于生成.a文件,golang中的import name,实际就是到GAPATH中去寻找name.a,使用时是该name.a源码中声明的package名字。Go程序是保存在多个.go文件中,文件的第一行就是package xxx声明,用来说明该文件属于哪一个包(package),package声明下来就是import声明,再下来是类型,变量,常量,函数的声明。1. 声明在函数内部,是函数的本底值,类似private。

2024-03-11 13:27:38 780

原创 Go的安装

根据不同系统下载不同的包。

2024-03-07 20:59:08 1118

原创 Redis——服务器

Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运行。

2024-02-29 17:38:48 1133

原创 redis——客户端

Redis是一个典型一对多服务器程序,一个服务器可以与多个客户端进行网络连接,每隔客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令请求。通过是一个I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式处理命令请求,并与多个客户端进行网络通信。Redis服务器状态结构的clients属性是一个链表,这个链表保存了所有与服务器连接的客户端的状态结构,对客户端执行批量操作,或者查找某个指定的客户端,都可以通过表里clients链表来完成。

2024-02-25 17:24:52 1397

原创 Redis——事件

注意,这里说保存时间事件的链表为无序链表,指的不是链表不按ID排序,而是说,该链表不按when属性的大小排列,正因为链表没有按when属性进行排列,所以当时间事件执行器运行的时候,它必须遍历链表中的所有时间事件,这样才能确保服务器中所有已到达的时间事件都会被处理。下图展示了一个保存时间事件的链表,链表中包含了三个不同的时间事件:因为新的时间事件总是插入到链表的表头,所以三个时间事件分别按ID逆序排列,表头事件的ID为3,中间事件ID为2,表尾事件ID为1。

2024-02-02 17:59:43 1367

原创 Redis数据库——AOF持久化

除了RDB持久化功能外,Redis还提供了AOF持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态。RDB持久化保存数据库的方法就是将msg,fruits,numbers三个键的键值对保存到RDB文件中,而AOF持久化保存数据库状态的方法则是将服务器执行的set,sadd,rpush三个命令保存到AOF文件中。被写入AOF文件的所有命令都是以Redis命令请求协议格式保存的,是纯文本格式,可以直接查看AOF文件。

2024-01-30 11:28:56 674

原创 Redis——RDB持久化

Redis是一个键值对数据库服务器,服务器中通常包含任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。因为Redis数据库是内存数据库,他将自己的数据库状态存储在内存里面。所以如果不想办法将存储在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘中,避免数据意外丢失。

2024-01-23 10:22:29 1013

原创 Redis数据库——键过期时间

我们可以在Redis客户端输入命令,可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在指定秒数或者毫秒数之后,服务器会自动删除生存时间为0的键。

2023-12-24 23:36:28 1026

原创 Redis数据库——键空间

Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的中,db数组的每一个项都是一个redis.h/redisDb结构,每一个RedisDb结构代表一个数据库。在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。dbnum属性的值有服务器配置的database选项决定,默认情况下该选项的值为16,所以Redis服务器默认会创建16个数据库。

2023-12-24 17:10:26 1100

原创 Redis对象——内存回收,对象共享和空转时长

因为C语言不具备内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数技术实现内存回收机制。通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。对象的整个生命周期可以划分为创建对象,操作对象,释放对象三个阶段。

2023-12-11 21:34:22 333

原创 Redis对象类型检测与命令多态

Redis中操作键的命令可以分为两类。1. SET, GET, APPEND,STRLEN等命令只能对字符串键使用。2. HDEL, HSET, HGET,HLEN等命令只能对哈希键使用。3. RPUSH, LPOP, LINSERT, LLEN等命令只能对列表键使用。4. SADD, SPOP, SINTER, SCARD等命令只能对集合键使用。5. ZADD, ZCARD, ZRANK, ZSCORE等命令只能对有序集合键使用。

2023-12-09 17:12:05 182

原创 Redis有序集合对象

有序集合的编码可以是ziplist或者skiplist。ziplist编码的有序集合对象使用压缩列表作为底层实现,每一个集合元素使用紧挨在一起的两个压缩列表节点来保存。第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。如果price键的值对象使用的是ziplist编码,那么这个值的对象和压缩列表如下图:注意:Redis5.0版本后使用listpack替代了ziplist。

2023-12-09 14:45:28 274

原创 Redis集合对象

集合对象的编码可以是intset或者hashtable。intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都保存在整数集合里面。hashtable编码的集合对象使用字典作为底层实现,字典的每一个键都是一个字符串对象,每一个字符串对象包含了一个集合元素,而字典的值全部被置为NULL。

2023-12-03 11:25:07 134

原创 Redis哈希对象(listpack介绍)

listpack(紧凑列表)时Redis5版本出现的,作用是为了代替ziplist。Redis7.0版本之后,listpack就完全替代了ziplist。ziplist的缺点是,在极端的情况下,可能会出现连锁更新的情况,时间复杂度是O(N^2),会带来不小的性能消耗。Redis压缩列表-CSDN博客虽然Redis在3.0版本后使用quicklist,通过quicklistNode来控制ziplist的大小和元素的个数,减少连锁更新带来的性能问题,但是它并没有避免连锁更新,使用的还是ziplist。

2023-11-30 16:19:46 757

原创 Redis对象系统

在Redis中有许多数据结构,比如:简单动态字符串(SDS),双端链表,字典,压缩列表,整数集合等。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统。这个系统中包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象这物种类型的对象。通过这五种不同类型的对象,Redis可以在执行命令前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处时,我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。

2023-11-29 17:45:38 998

原创 Redis压缩列表

/prevrawlen用到的字节数//上一个entry长度//len使用的字节数//保存字符串表示字符串长度//保存整数使用的字节数//整数或字符串编码//节点起始指针} zlentry;注意:压缩列表实际存储的时候并不是这样,只是在计算的时候需要把节点从内存编码中转换出来才方便写逻辑,于是有了这么一个结构。

2023-11-24 10:14:06 278

原创 Redis整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

2023-11-22 17:05:37 90

原创 Redis跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每一个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN),最坏O(N),复杂度的节点查找,还可以通过顺序性来批量处理节点。比如:取某个范围内的节点数据。在大部分情况下,跳跃表的效率可以和平衡树进行媲美,并且跳跃表的实现比平衡树简单。Redis使用跳跃表的使用不像链表和字典等数据结构被广泛应用。跳跃表查找时从level的最高层开始进行查找的。

2023-11-21 20:45:04 270

原创 Redis字典实现

字典又称符号表,关联数组或者映射(map)。是一种保存键值对的抽象数据结构。在字典中一个键和一个值进行关联。这些关联的值被称为键值对。字典中每一个键都是独一无二的,没有重复的。我们可以通过键来查找值,更新值或者删除整个键值对等操作。字典在Redis中应用广泛,比如Redis数据库的底层就是使用字典来实现的。对数据库的增删查改,该操作也是构建在对字典的操作之上。

2023-11-20 21:19:47 201

原创 Redis链表

链表作为一种常见的数据结构,一般都会内置在很多高级语言中。由于Redis使用的是C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。链表在Redis中应用广泛,比如列表建的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串,列表会使用链表作为列表键的底层实现。除了链表键之外,发布于订阅,慢查询,监视器等功能也用到了链表,redis服务器本身还使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区。

2023-11-17 13:45:57 165

原创 python——bs4解析网页数据

bs4(Beautifulsoup)是html的解析器,主要的功能是解析和提取数据。缺点是:效率不是很高。优点是:接口设计人性化,使用方便。

2023-10-30 10:07:00 385

空空如也

空空如也

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

TA关注的人

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