一个键盘码代码,两只黄鹂名翠柳

go语言开源的项目

使用Go语言开发的开源项目非常多。早期的Go语言开源项目只是通过Go语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用Go语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用Go语言原生开发项目的出现。Go 实现的存储服务器[minio] - Minio 是一个与 Amazon S3 APIs 兼容的开源对象存储服务器,分布式存储方案[rclone] - “用于云存储的 Rsync” - Google Drive, Amazon Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Cloudfile…[Camlistore] - Camlistore 是你的个人存储系统:一种存储、同步、共享、建模和备份内容的方式[torus] 查看全文

Redis主要底层数据结构扩容

简单动态字符串如果SDS修后的长度小于1MB,则将SDS扩容为修改后的字符串长度的2倍(未使用的空间设为修改后的字符串长度)如果SDS修后的长度大于等于1MB,则将SDS扩容1MB的空间(未使用的空间设为1MB)如果字符串缩短,SDS选择惰性释放,将释放的空间使用free记录下来,以便下次使用hash触发条件扩容未执行BGSAVE,负载因子大于等于1时执行BGSAVE快照时,负载因子大于等于5时,以尽量避开服务器快照期间扩容缩容负载因子小于0.1时渐进式rehash扩缩容大小扩容,首次大于 字典里元素数量*2*2^n 缩容,   首次大于 字典里元素数量*2^n  查看全文

Redis主要数据类型的编码

简单动态字符串底层编码整数字符串对象embstr编码的字符串对象简单动态字符串转换long int使用int编码float使用 简单动态字符串编码当使用embstr编码的字符串长度大于39时,转换为简单动态字符串编码列表底层数据结构压缩列表双端链表转换列表元素长度大于64个字节或者列表元素数量大于512压缩列表编码则转换为双端链表Hash底层数据结构压缩列表字典转换列表元素长度大于64个字节或者列表元素数量大于512压缩列表编码则转换为字典集合底层数据结构整数集合,int16 int32 int64字典。存储时字典的key存储集合元素,value存储null转换整数集合转换为字典,存储的整数数量超过512则使用字段有序集合底层数据结构压缩列表跳跃表转换压缩列表编码要求集合元素数量小于128,元素大小小于64字节。不满足这两个条件则转换为跳跃表。 查看全文

Redis保存多大的Key-Value合适

1. 避免大key首先,需要明确的是,Redis官方并不推荐存储过大的key或value。大key不仅占用大量内存,而且在处理时(如读取、写入、删除)可能会导致Redis性能下降,甚至阻塞整个Redis服务。因此,在设计Redis数据结构时,应尽量避免创建大key。2. 合理的key大小关于key的大小,一般建议key的长度不要超过1024字节,这是为了确保key的存储效率和可读性。虽然Redis本身可以支持更长的key,但过长的key会增加内存的消耗,并且降低查询效率。3. 评估value的大小对于value的大小,虽然没有固定的限制(最大为512MB),但应根据实际需求进行合理评估。如果某个key的value非常大,应考虑将其拆分成多个小key来存储。这样做不仅可以提高Redis的存储效率,还可以避免在删除或修改大value时导致的性能问题。 查看全文

GO-GMP线程模型

介绍G用户态线程M系统线程P处理器,作为M和G的桥梁,负责G的调度和执行.调度器启动时就会创建GOMAXPROCS个处理器。每个处理器都有一个本地空闲队列和运行队列,全局环境各维护着一个空闲队列和运行队列。调度流程获取可用的G首先从P的本地空闲队列获取可用的G 如果没有则从全局空闲队列获取,从全局队列获取时,则会最多同步32个free的G到P的本地free队列.如果没有则创建一个G拿到G后,如果next设置为true, 会有1/2的机会将G放在P的本地队列的next上执行,否则放在P的本地运行队列队末,此时如果本地队里已满,则会触发本地运行队列向全局运行队列迁移动作,期间本地运行队列的一半将迁移到全局运行队列调度首先以1/60的概率从全局运行列获取可用的G。 期间可能会触发全局运行队列向本地运行队列迁移的动作,此时会拿全局队列的 1/GOM 查看全文

Go扩容

切片扩容容量如果期望的容量是当前容量的两倍则使用期望容量如果期望容量小于1024则扩容到当前容量的2倍如果期望容量大于1024则扩容当前容量的25%直到满足当前容量需求出触发条只有添加新元素后的cap不满足时才会触发扩容, 扩容后返回一个新的slice结构体处理方式slice=append(slice, one)        扩容后新的slice结构体赋给原sliceappend(slice, one)        则返回一个新slicehash扩容初始化当map中的桶的数量多于24时才会有溢出桶的存在,数量为2^B-4个,B为正常桶的数量hash桶最多存储8个对象,如果超出则需要存储在溢 查看全文

GO值复制

GO语言本身是值传递,先给结论,再看case.标量类型是赋值是值传递,如int float string数组和结构体赋值也是值传递,如[2]string  struct{}指针赋值也是值传递,只不过传递的是地址而已map和slice赋值是引用传递,如map[string][string] []string字符串遍历,得到值是字符,索引是不连续的。如下标量类型func TestInt(t *testing.T) {    num1 := 123    num2 := num1    num1 = 456    fmt.Println(& 查看全文

goland The selected directory is not a valid home for Go SDK 解决

The selected directory is not a valid home for Go SDK 解决方案Navigate to the Go SDK root (execute go env and find GOROOT entry), then navigate to src/runtime/internal/sys inside the Go SDK root.Edit zversion.go file and add an entry on a new line: const theVersion = `go1.17`zversion.go// Code generated by go too 查看全文
加载更多
redis ( 8 )
php ( 6 )
go ( 5 )
源码 ( 5 )
index ( 5 )
ssl ( 4 )
数据结构 ( 4 )
https ( 3 )
awk ( 3 )
http ( 3 )
hql ( 3 )
字体 ( 3 )
php:// ( 2 )
chrome ( 2 )
链表 ( 2 )
firefox ( 2 )
跳跃表 ( 2 )
测试 ( 2 )