【开源推荐】XDS 第三方可扩展的Go语言中高性能数据结构和数据类型合集

举报
小雨青年 发表于 2022/03/28 22:37:49 2022/03/28
【摘要】 XDS - eXtensible Data Structure Sets (第三方可扩展的 Golang 高性能数据结构和数据类型合集) A third-party extensible collect...

XDS - eXtensible Data Structure Sets
(第三方可扩展的 Golang 高性能数据结构和数据类型合集)

A third-party extensible collection of high-performance data structures and data types in Go

XDS 介绍:(什么是 Xds)

XDS - eXtensible Data Structure(第三方可扩展的 Go 语言中高性能数据结构和数据类型合集)

XDS 主要是为了解决现有 Go 语言官方内置的各类数据结构性能在高并发场景中不尽如人意的情况而开发,核心主要是依赖于 XMM 内存管理库基础之上开发,保证了高性能和内存可控。

XDS 集合目前主要包含:

  • XMap - 高性能的类似 map/sync.map 的 Map 型数据结构类型(已开源
  • XSlice - 高性能类似 slice 的数组型数据结构类型(开发中
  • XChannel - 高性能的 channel 管道类型结构(调研中
  • 更多…



XDS - XMap 概要介绍

XMap 是属于高性能开源 Go 数据结构 Xds 中的 map 数据结构类型的实现,主要是基于高性能内存管理库 XMM 基础之上进行的开发,主要弥补了 Go 内置 map 的无法并发读写,并且总体读写性能比较差的问题而开发。


为什么要设计 XMap?

现有 Golang 中的 map 数据结构无法解决并发读写问题,Sync.map 并发性能偏差,针对这个情况,各种高性能底层服务需要一个高性能、大容量、高并发、无 GC 的 Map,所以开发实现 XMap。
针对我们需求调研了市场上主要的 hashmap 结构,不能满足我们性能和功能要求。


XMap 设计目标是什么?

要求设计一个可以并发读写不会出现 panic,要求并发读写 200w+ OPS/s 的并发 map 结构。
(写 20%,读 80% 场景;说明:go 自带 map 读写性能在 80w ops/s,大量并发读写下可能 panic;sync.map 写入性能在 100w OPS/s)


XMap 的技术特点

  • 绝对高性能的 map 数据结构(map 的 3 倍,sync.map 的 2 倍并发性能)
  • 内部实现机制对比 Go 原生 map/sync.map 技术设计上要更细致,更考虑性能,使用包括开地址法,红黑树等等结构提升性能;
  • 为了节约内存,初始的值比较低,但是依赖于 XMM 高性能内存扩容方式,能够快速进行内存扩容,保证并发写入性能
  • 底层采用 XMM 内存管理,不会受到 Go 系统本身 GC 机制的卡顿影响,保证高性能;
  • 提供 API 更具备扩展性,在一些高性能场景提供更多调用定制设置,并且能够同时支持 map 类型操作和底层 hash 表类型操作,适用场景更多;
  • 其他特性

XMap 性能数据和实现对比

XMap 目前并发读写场景下性能可以达到 200 万 op/s,对比原生 map 单机性能 80 万 op/s,提升了 3 倍 +,对比 Go 官方扩展库 sync.Map 性能有 2 倍的提升。


XMap 与 Go 官方数据结构特点对比:(20% 写入,80% 读场景)

map 模块 性能数据
加锁机制 底层数据结构 内存机制
map 80w+ read/s
并发读写会 panic
Hashtable + Array Go gc
sync.Map 100w+ op/s RWMutex map Go gc
Xds.XMap 200w+ op/s CAS + RWMutex Hashtable + Array + RBTree XMM


如何使用 XMap?

快速使用:

  1. 下载对应包
go get -u github.com/heiyeluren/xds
go get -u github.com/heiyeluren/xmm

  
 
  • 1
  • 2
  1. 快速包含调用库:
//注意:本代码只是伪代码,大家最好看这个使用测试案例更充分一些
//使用案例:https://github.com/heiyeluren/xds/blob/main/example/xmap_test0.go

import (
   xmm "github.com/heiyeluren/xmm"
   xds "github.com/heiyeluren/xds"
   xmap "github.com/heiyeluren/xds/xmap"
)

// 创建一个 XMM 内存块
f := &xmm.Factory{}
mm, err := f.CreateMemory(0.75)

// 构建一个 map[string]string 的 xmap
m, err := xmap.NewMap(mm, xds.String, xds.String)

// 写入、读取、删除一个元素
err = m.Set("name", "heiyeluren")
ret, key_exists, err := m.Get("name")
err = m.Remove("name")
//...


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  1. 执行对应代码
go run map-test.go

  
 
  • 1

XMap 各类 API 使用案例

- XMap 使用示例 -

  • 更多案例(期待)

以上代码案例执行输出:



XMap 内部是如何实现的?

- 《Xds-XMap技术设计与实现》 -


文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。

原文链接:coderfix.blog.csdn.net/article/details/123219044

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。