- 博客(13)
- 收藏
- 关注
原创 Slice
Slice实现原理数据结构type slice struct{ array unsafe.Pointer //指向底层数组 len int //切片长度 cap int //底层数组的容量}切片操作使用make()创建slice,可以同时指定长度和容量,创建时底层会分配一个数组,数组的长度即为容量。使用数组创建切片,使用数组创建slice时,slice将与原数组共用部分内存array := [10]intslice :=
2021-10-03 10:46:33
168
原创 Channel
Channel管道是Go在语言层面提供的协程间的通信方式。管道有无缓冲管道和带缓冲管道ch1 := make(chan string) //无缓冲ch2 := make(chan string, 5) //有缓冲数据读写无缓冲:从管道中读写数据会被阻塞,直到有协程向管道中写或读数据。有缓冲:有缓冲但缓冲为空的Chan读取数据时也会被阻塞,直到有协程写入数据;有缓冲但缓冲已满的Chan中写数据时也会被阻塞,直到有协程读取数据。对于值为nil的Chan,无论读写都会阻塞,而且
2021-10-03 10:12:21
135
原创 Go语言byte、rune、string小知识
Go语言byte、rune、string小知识byte: byte是uint8的一个别名代表了ASCII码的一个字符rune:是int32的一个别名,代表一个UTF-8字符string:是所有8位字节字符串的集合,通常但不一定代表UTF-8编码的文本""和’’:Go中双引号标记的元素为string类型,其实质就是一个byte类型的数组,单引号是rune类型,下面例子中的32可以换位’ ’GO语言在字符串的操作中byte只能操作简单的字符不支持中文操作,rune可以操作任何字符,比如
2021-09-17 21:29:56
456
原创 内存管理相关知识
操作系统内存管理相关知识虚拟内存虚拟内存:操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。我们程序所使用的内存地址叫做虚拟内存地址,实际存在硬件里面的空间地址叫物理内存地址。操作系统主要通过内存分段和内存分页来管理虚拟地址与物理地址的关系。内存分段内存分段:程序是由若干个逻辑分段组成的如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段的形式把这些段分离出来。分段机制下的虚拟地址由两部分组成段选择子和段内偏移量。段选
2021-09-07 19:40:55
107
原创 操作系统进程线程相关知识总结
操作系统1.进程线程基本知识进程:我们编写的代码只是一个存储在硬盘中的静态文件,通过编译后就生成二进制可执行文件,当我们运行这个可知性文件后,他会被装载到内存中,接着CPU会执行程序中的每一条指令,那么这个运行中的程序就被称为进程。 可简单理解为:进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的基本单位。并发和并行:并发可以理解为一个处理器核心交替处理多个任务,并行可以理解为多个处理器核心同时处理多个任务。CPU可以从一个进程切换到另外一个进程,在切换之前必须要记录当前进程
2021-09-05 17:37:03
177
原创 Redis的RDB持久化和AOF持久化总结
RDB持久化这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。由于RDB文件是保存在磁盘里面的,所以即使Redis服务器进程退出,甚至运行Redis的服务器停机,只要存在RDB文件就可以还原数据库状态。RDB文件的创建和载入保存数据库状态生成一个RDB文件,这个文件由两个命令生成,一个是SAVE一个是BGSAVE。SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞期间服务器不能处理任何请求。BGSAVE命令会派生一个子进程,然后由子进程负责创建R
2021-05-20 00:15:29
105
原创 Redis服务器数据库的实现
Redis服务器数据库的实现redis服务器将所有数据库都保存在redis.h/redisServer结构体中的Db数组中,每个Db数组都是一个redis.Db结构。初始化数据库时会根据redisServer结构中的dbnum属性来决定数据库的多少。struct redisServer{ ... redisDb *db;//一个数组,保存者服务器中的所有数据库 int dbnum;//服务器的数据库数量根据配置文件生成 ...}typedef struct redisDb{ .
2021-05-17 21:28:22
116
原创 Redis压缩列表
Redis压缩列表压缩列表是一种为节约内存而开发的顺序型数据结构。是列表键和哈希键的底层实现之一。(包含少量列表项,列表项是小整数值或长度较短的字符串)(只包含少量键值对,值是小整数值或长度较短的字符)是由一系列特殊编码的连续内存块组成的顺序结构.zlbytes:记录整个压缩列表占用的内存字节数zltail:表尾结点距离压缩列表起始位置多少字节(如果需要访问表尾结点,无需遍历整个压缩列表就可以得到表尾地址)zllen:压缩列表中结点的数量entryx:结点zlend:用于标记压缩列表的尾端
2021-05-15 19:22:24
93
原创 Redis整数集合
Redis整数集合 整数集合(inset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层。整数集合的实现typedef stryct intset{ //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[];}intset;这个数组contents不包含重复项,并且数组的真正类型取决于encodin
2021-05-15 18:24:53
119
原创 Redis跳跃表
Redis跳跃表跳跃表是一种有序的数据结构,它通过在每个结点中维持多个指向其他结点的指针,从而达到快速访问的目的。作为有序集合键的底层实现,集群结点中的内部数据结构。跳跃表的实现zskiplist结构用于保存跳跃表节点的相关信息typedef struct zskiplist{ //表头结点和表尾结点 struct zskiplistNode *header,tail; //表中结点的数量 unsigned long length; //表中最层数最大的结点 int level;}z
2021-05-12 18:41:33
77
原创 Redis字典
Redis字典一种用于保存键值对的抽象数据结构,Redis的数据库就是使用字典来作为底层实现的,字典还是哈希键的底层实现之一.字典的实现Redis中字典使用哈dictht表作为底层,一个哈希表里面可以有多个哈希表结点,而每个哈希表结点就保存了字典中的一个键值对.哈希表typedef struct dictht{ //哈希表数据 dictEntry **table; //哈希表大小 unsigned long size; //哈希表大小掩码,用于计算索引值 //总是等于size - 1
2021-05-11 22:14:44
148
原创 Redis链表
Redis链表Redis构建了自己的链表实现eg:列表键的底层实现之一就是链表,发布与订阅、慢查询、监视器等功能也用到了链表,Redis服务器本身还用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区。链表与链表节点的实现typedef struct listNode{ //前置结点 struct listNode *prev; //后置结点 struct listNode *next; //节点的值 void *value}listNode;typedef str
2021-05-09 16:10:11
111
原创 Redis简单动态字符串
Redis简单动态字符串Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为SDS的抽象类型,并将其作为Redis的默认字符串表示。在Redis中C字符串只会用在一些无须对字符串值进行修改的地方,比如打印日志###SDS的定义每一个sds.h/sdshdr结构代表一个SDS值struct sdshdr{ //记录buf数组中已经使用的字节的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用的字节数量 int free; //字节数组,用
2021-05-07 22:05:16
90
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人