Go中“0字节”

  1. int

sizeof 查看字节数
int 8字节 64位;4字节 32位(根据系统)
int32永远4字节
指针也是跟随系统字长,其底层其实是无符号的64位整型

  1. 空结构体

空结构体有地址没内存
空结构体独立的地址都为 zerobase(指针)
%p 打印地址
主要为了节约内存
map【string】struct{}{},相当于hashset 只有键没有值
chan的负载可以为空结构体,当发信号使用
nil不能是空结构体

数组字符串切片

  1. 字符串

底层为结构体 ,runtime包中unsafe.Pointer 指向byte数组
unicode 统一的字符集,至少3 个字节表示,utf8变长格式
访问字符串"你好"fori得到每个字节,forr range自动解码为rune
rune就是utf8

  1. 切片

字面量创建 []int{} 编译时确定
运行时创建 make() 直接调用runtime的makeSlice

因为数组是连续的空间,继续用原来的数组可能到达其他变量的空间,所以切片扩容新开数组
切片扩容时,并发不安全,注意加锁(第一个协程追加扩容老切片废除,第二个协程读取老切片的值就会出问题)

map

redis的本质就是一个大的hashmap

a:A 举例:
先对key(a)哈希取位置
开放寻址法一直找到不为空的值插入
取的话也是一样,a哈希找位置,不为a则往后找
拉链法横向的对应槽(Slot),每个槽对用的kv为桶

  1. hmap,bmap

map在go中底层为: hmap,其中:
count kv个数
hash0 代表哈希种子,哈希算法用到
buckets 中有 2的B次幂个 桶(bmap)

bmap
tophash 哈希数组(哈希值的高8位) —> 为了快速访问
keys elems kv数组
overflow 指针,如果这个bmap 超过 8 个还要存,那么指向 新的 bmap

  1. 初始化

调用make初始化
先确定B,先创建正常的bmap,同时会多创建几个溢出桶,
hmap 底层有 NextOverflow 指向下一个可用的溢出桶,bmap中的overflow指针溢出后会指向该桶

字面量初始化
掉用make,然后赋值

  1. 访问:

hash0 + key 确认桶号
通过B 取二进制后几位确认桶
然后找tophash ,key 和 溢出桶的hash
没找到说明key 不存在,写入同样操作,没有的话插入一个

map扩容

哈希碰撞严重,map桶溢出太多,趋向链表
太多溢出桶(溢出桶>普通桶)

整理(等量)扩容 – >溢出桶太多(存在之前的数据被删掉导致)
翻倍扩容(数据太多)
创建一组新桶
oldbuckets 指向原有的桶数组,buckets指向新的桶数组
map标记(flags)为扩容状态

渐进式驱逐
每次操作一个旧桶,将旧桶数据驱逐到新桶(根据B操作进行划分)
所有旧桶驱逐完毕,oldbuckets 回收

map并发操作

A协程读取时桶不会驱逐,B协程写入驱逐这个桶
map加锁会影响性能

Map

  1. 总结构:

Mutex
read 下面有个万能map
dirty 下面有个map
misses 没有命中
将不会扩容的操作和扩容的操作分离

正常的话走read ,找到的话修改即可
找不到的话,上锁,操作dirtymap,所以每次只有一个协程操作dirtymap
然后read中的amended 为true,表示有追加,说明read中map数据不准确,修改和读走read就行
只有追加元素可能扩容时才走dirtymap
如果在dirtymap中读到键值,则misses+1
misses = len(dirtmap) ,dirty提升变为read中map
追加false ,misses=0,dirtymap = nil(走dirty时在变为和read中一样)

删除更麻烦
正常删除,追加为false,将k后的指针置为nil,指不到v了,过段时间GC就会将v干掉
追加后的删除,指针为nil
上提后dirtymap重建时,指针为expunded(删除)
访问read时直接将其干掉就行,因为dirty中没有,不用考虑一致的问题

接口

结构体实现接口,底层会实现值和指针的方法
而指针实现接口,底层只实现指针的方法

正常接口 iface,空接口 eface 除了指针,第一个字段比较简单(类型)
其实是用eface承载传入,最大用途任意类型入参

内存对齐

CPU操作数据按照字长来操作
跨字长变量影响原子操作,并且影响性能
基本类型根据对齐系数判断放置位置

结构体偏移量可通过调整成员顺序节省空间,最后分情况补长
根据结构体的对其系数判断第一个位置的地址

空结构体独立使用地址默认,包在其他结构体中则不一定

Golang并发下的数据结构及其底层剖析相关推荐

  1. Redis中五大数据结构的底层实现

    来自:DBAplus社群 作者介绍 田兆壮,新炬网络开发工程师.具备扎实的Java.Scala开发经验,熟练使用Python和Shell等脚本语言:具备前后端开发能力,熟练使用关系型数据库和非关系型数 ...

  2. 获取用户列表为空_数据结构和算法(Golang实现)(15)常见数据结构-列表

    列表 一.列表 List 我们又经常听到 列表 List 数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表 List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序 ...

  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 08 Redis中有哪些数据结构及底层实现原理

    08 Redis中有哪些数据结构及底层实现原理 不经一翻彻骨寒,怎得梅花扑鼻香. --宋帆 引言 07小节面完了负载均衡,正向代理,反向代理,终于松了一口气,然后话题转向了缓存Redis,为什么是这个 ...

  4. Redis之数据结构和底层编码

    一 字符串(string) 在Redis的世界里,数据类型没有什么整数.浮点数.布尔值等,只有一种类型来代替他们,那就是字符串.字符串无论是否加引号,redis可以自动识别它是否是整数或者浮点数,亦或 ...

  5. Redis的数据结构及底层原理

    一.Redis的两层数据结构简介 redis的性能高的原因之一是它每种数据结构都是经过专门设计的,并都有一种或多种数据结构来支持,依赖这些灵活的数据结构,来提升读取和写入的性能. 如果要了解redis ...

  6. JAVA关于基本数据类型之间进行强制转换底层剖析

    1.什么是基本类型之间的强制转换 先来聊一聊基本类型 基本数据类型 所占用的字节数 表示数的范围 整型 byte 1 -128~+127 short 2 -32768~32767 int 4 -214 ...

  7. redis源码分析 ppt_【Redis】redis各类型数据结构和底层实现源码分析

    一.简介和应用 Redis是一个由ANSI C语言编写,性能优秀.支持网络.可持久化的K-K内存数据库,并提供多种语言的API.它常用的类型主要是 String.List.Hash.Set.ZSet ...

  8. 重新开始学习编程系列Day10——超全的MySQL核心原理,从底层剖析MySQL

    文章目录 前言 一.事务的四个要素 二.事务的隔离级别 1.未提交读(Read Uncommitted): 2.提交读(Read Committed): 3.可重复读(Repeated Read): ...

  9. Redis 数据结构的底层实现 (二) dict skiplist intset

    一.REDIS_INCODING_HT (dict字典,hashtable) dict是一个用于维护key和value映射关系的数据结构.redis的一个database中所有的key到value的映 ...

最新文章

  1. 2021 AAAI Fellow名单重磅出炉,华人学者遗憾连续两年无缘入选 | AI日报
  2. windows十大必禁服务
  3. information_schema.triggers 学习
  4. 云计算安全解决方案白皮书(二)
  5. android shape.xml 文件使用
  6. 【MySQL】MySQL 如何实现 唯一随机数ID
  7. 人工智能、机器学习、数据挖掘著名会议
  8. spring-自动加载配置文件\使用属性文件注入
  9. 2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)
  10. 设计灵感|春节新年到!充满年味的海报给你参考
  11. python中int什么意思_python3中int(整型)的使用教程
  12. sqlserver2000中字符串类型的日期如何比较大小
  13. Linux 快捷键总结
  14. python做客户端监控程序(python 监控程序)
  15. win7访问服务器共享文件夹提示没有权限,win7系统无法访问共享文件夹提示权限不足的解决方法...
  16. Linux回到桌面快捷键
  17. 《三重门》作者的机灵与人物的笨拙
  18. 从“扫月亮”到“扫福字”,扒一扒背后的支付宝AR框架体系
  19. 基于vc的freetype字体轮廓解析_字体术语集
  20. exsi rh2288hv5 驱动_华为RH2288H服务器引导ServiceCD安装Windows Server操作系统

热门文章

  1. 前端开发——Ionic 3.0【爱创课堂专业前端培训】
  2. 程序员在上海税前12000的工资,真实发到手能拿到多少?
  3. 黑马头条推荐系统完整版(包括虚拟机和数据,代码已修复过可完美跑起来)
  4. android studio项目改成android.mk编译APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
  5. 标号法求解单源最短路径
  6. Docker的降维打击是怎么利用天时地利人和的?看这一篇就够了
  7. 十字路口红绿灯plc程序_西门子PLC编程实例详解十字路口交通灯自动控制系统!...
  8. ImagePullBackOff: Back-off pulling image \gcr.io/google_containers/pause-amd64:3.0 解决方法
  9. 如何练成某一领域的高手
  10. 量子有什么特性计算机,量子是什么、量子具有什么特性、又有什么作用?