Skip to content

Commit

Permalink
Merge pull request #3 from houseme/main
Browse files Browse the repository at this point in the history
improve comment
  • Loading branch information
heiyeluren authored Feb 28, 2022
2 parents 062eab8 + ffff46d commit 896aa23
Show file tree
Hide file tree
Showing 10 changed files with 290 additions and 264 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@

# Dependency directories (remove the comment below to include it)
# vendor/
.idea
80 changes: 39 additions & 41 deletions example/xmap_test0.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,48 @@ package main

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

"github.com/heiyeluren/xmm"
"github.com/spf13/cast"

"github.com/heiyeluren/xds"
"github.com/heiyeluren/xds/xmap"
)

//-----------------------------------
// TestMap testing
// -----------------------------------
// 把Xmap当做普通map来使用
// 说明:类型不限制,初始化必须设定好数据类型,写入数据必须与这个数据类型一致,类似于 map[KeyType]ValType 必须相互符合
//-----------------------------------
// -----------------------------------
func TestMap(mm xmm.XMemory) {

//初始化xmap的时候必须制定key和val的数据类型,数据类型是在xmap中定义的
//构建一个 map[string]int 的xmap
// 初始化xmap的时候必须制定key和val的数据类型,数据类型是在xmap中定义的
// 构建一个 map[string]int 的xmap
m, err := xds.NewMap(mm, xmap.String, xmap.Int)
if err != nil {
panic("call NewMap() fail")
}

var (
k11 string = "id"
v11 int = 9527
v11 int = 9527
)

//set的时候需要关注类型是否跟初始化对象的时候一致
// set的时候需要关注类型是否跟初始化对象的时候一致
err = m.Set(k11, v11)
if err != nil {
panic("XMap.Set fail")
}
fmt.Println("XMap.Set key: [", k11, "] success")

//get数据不用关心类型,也不用做类型转换
// get数据不用关心类型,也不用做类型转换
ret, exists, err := m.Get(k11)
if err != nil {
panic("XMap.Get fail")
}
fmt.Println("XMap.Get key: [", k11, "] , value: [", ret,"]")
fmt.Println("XMap.Get key: [", k11, "] , value: [", ret, "]")

//Remove数据
// Remove数据
err = m.Remove(k11)
if err != nil {
panic("XMap.Remove fail")
Expand All @@ -54,31 +54,31 @@ func TestMap(mm xmm.XMemory) {
fmt.Println("XMap.Get key: [", k11, "] not found")
}

// 调用扩展的Map函数使用方法(可以获得更高性能)

//调用扩展的Map函数使用方法(可以获得更高性能)

//生成KV数据
// 生成KV数据
var (
k22 = "name"
v22 = "heiyeluren"
)
//生成一个 map[string]string 数据结构,默认大小256个元素,占用了75%后进行map扩容(这个初始化函数可以获得更好性能,看个人使用场景)
// 生成一个 map[string]string 数据结构,默认大小256个元素,占用了75%后进行map扩容(这个初始化函数可以获得更好性能,看个人使用场景)
m, err = xds.NewMapEx(mm, xmap.String, xmap.String, uintptr(256), 0.75)
//set数据
// set数据
m.Set(k22, v22)
//get数据
// get数据
ret, exists, err = m.Get(k22)
fmt.Println("XMap.Get key: [", k22, "] , value: [", ret,"]")
fmt.Println("XMap.Get key: [", k22, "] , value: [", ret, "]")

}

//-----------------------------------
// TestHashMap testing
// -----------------------------------
// 把Xmap当做普通hashmap来使用
// 说明:Key/Value 都必须是 []byte
//-----------------------------------
// -----------------------------------
func TestHashMap(mm xmm.XMemory) {

fmt.Println("\n===== XMap X(eXtensible) Raw Map (HashMap) example ======\n")
fmt.Println("===== XMap X(eXtensible) Raw Map (HashMap) example ======")

hm, err := xds.NewHashMap(mm)
if err != nil {
Expand All @@ -92,7 +92,7 @@ func TestHashMap(mm xmm.XMemory) {
v2 uint32 = 9527
)

//新增Key
// 新增Key
fmt.Println("----- XMap Set Key ------")
err = hm.Set([]byte(k1), []byte(v1))
if err != nil {
Expand All @@ -105,8 +105,8 @@ func TestHashMap(mm xmm.XMemory) {
}
fmt.Println("Xmap.Set key: [", k2, "] success")

//读取Key
fmt.Println("\n----- XMap Get Key ------")
// 读取Key
fmt.Println("----- XMap Get Key ------")
s1, exists, err := hm.Get([]byte(k1))
if err != nil {
panic("xmap.Get fail")
Expand All @@ -118,15 +118,15 @@ func TestHashMap(mm xmm.XMemory) {
}
fmt.Println("Xmap.Get key: [", k2, "], value: [", cast.ToString(s2), "]")

//删除Key
// 删除Key
fmt.Println("\n----- XMap Remove Key ------")
err = hm.Remove([]byte(k1))
if err != nil {
panic("xmap.Remove fail")
}
fmt.Println("Xmap.Remove key: [", k1, "]")
s1, exists, err = hm.Get([]byte(k1))
//fmt.Println(s1, exists, err)
// fmt.Println(s1, exists, err)
if !exists {
fmt.Println("Xmap.Get key: [", k1, "] Not Found")
}
Expand All @@ -141,37 +141,35 @@ func TestHashMap(mm xmm.XMemory) {
}
fmt.Println("Xmap.Remove key: [", k2, "]")
s2, exists, err = hm.Get([]byte(k2))
//fmt.Println(s1, exists, err)
// fmt.Println(s1, exists, err)
if !exists {
fmt.Println("Xmap.Get key: [", k2, "] Not Found")
}
s1, exists, err = hm.Get([]byte(k1))
//fmt.Println(s1, exists, err)
// fmt.Println(s1, exists, err)
if !exists {
fmt.Println("Xmap.Get key: [", k1, "] Not Found")
}

}


//xmap测试代码
// xmap测试代码
func main() {
f := &xmm.Factory{}
mm, err := f.CreateMemory(0.75)
if err != nil {
panic("xmm.CreateConcurrentHashMapMemory fail")
}
fmt.Println("\n===== XMap X(eXtensible) Map example ======\n")
fmt.Println("===== XMap X(eXtensible) Map example ======")

//var NotFound = errors.New("not found")
// var NotFound = errors.New("not found")

//把Xmap当做普通map来使用
// 把Xmap当做普通map来使用
TestMap(mm)

//把Xmap当做普通hashmap来使用
// 把Xmap当做普通hashmap来使用
TestHashMap(mm)


fmt.Println("Xmap test case done.\n")
fmt.Println("Xmap test case done.")

}
5 changes: 3 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/heiyeluren/xmm v0.2.4 h1:LTBN2/0j81B+74XJlj+mOp6O61OK8cbFSfFqQ/Z63z8=
github.com/heiyeluren/xmm v0.2.4/go.mod h1:8QJJh1eQeh3twu/1F4QszTP+Gv6dtF3wFXdzQiYxleM=
github.com/heiyeluren/xmm v0.2.5-0.20220224032610-dc4401be1e4c h1:xHJavjGZNRSgD72B8XKjPfVXkQB5Ey0smzTO6WUU4hU=
github.com/heiyeluren/xmm v0.2.5-0.20220224032610-dc4401be1e4c/go.mod h1:8QJJh1eQeh3twu/1F4QszTP+Gv6dtF3wFXdzQiYxleM=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
95 changes: 42 additions & 53 deletions xmap.go
Original file line number Diff line number Diff line change
@@ -1,33 +1,30 @@
package xds

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

"github.com/heiyeluren/xmm"

"github.com/heiyeluren/xds/xmap"
)

//------------------------------------------------
// XMap is a map of maps.
// ------------------------------------------------
// 当做map[]来使用的场景
// 本套API主要是提供给把Xmap当做map来使用的场景
//------------------------------------------------
// ------------------------------------------------
type XMap struct {
chm *xmap.ConcurrentHashMap
}


/*
初始化调用xmap生成对象
mm 是XMM的内存池对象
keyKind 是要生成 map[keyType]valType 中的 keyType
valKind 是要生成 map[keyType]valType 中的 valType
说明:keyKind / valKind 都是直接调用xmap中对应的kind类型,必须提前初始化写入
本函数调用参考:
//生成一个 map[int]string 数据结构,默认大小16个元素,占用了75%后进行map扩容
m, err := xds.NewMapEx(mm, xmap.Int, xmap.String)
*/
// NewMap returns a new XMap.
// 初始化调用xmap生成对象
// mm 是XMM的内存池对象
// keyKind 是要生成 map[keyType]valType 中的 keyType
// valKind 是要生成 map[keyType]valType 中的 valType
// 说明:keyKind / valKind 都是直接调用xmap中对应的kind类型,必须提前初始化写入
//
// 本函数调用参考:
// 生成一个 map[int]string 数据结构,默认大小16个元素,占用了75%后进行map扩容
// m, err := xds.NewMapEx(mm, xmap.Int, xmap.String)
func NewMap(mm xmm.XMemory, keyKind xmap.Kind, valKind xmap.Kind) (*XMap, error) {
chm, err := xmap.NewDefaultConcurrentHashMap(mm, keyKind, valKind)
if err != nil {
Expand All @@ -36,20 +33,19 @@ func NewMap(mm xmm.XMemory, keyKind xmap.Kind, valKind xmap.Kind) (*XMap, error)
return &XMap{chm: chm}, nil
}

/*
初始化调用xmap生成对象 - 可扩展方法
mm 是XMM的内存池对象
keyKind 是要生成 map[keyType]valType 中的 keyType
valKind 是要生成 map[keyType]valType 中的 valType
说明:keyKind / valKind 都是直接调用xmap中对应的kind类型,必须提前初始化写入
capSize 是默认初始化整个map的大小,本值最好是 2^N 的数字比较合适(2的N次方);
这个值主要提升性能,比如如果你预估到最终会有128个元素,可以初始化时候设置好,这样Xmap不会随意的动态扩容(默认值是16),提升性能
factSize 负载因子,当存放的元素超过该百分比,就会触发扩容;建议值是0.75 (75%),这就是当存储数据容量达到75%会触发扩容机制;
本函数调用参考:
//生成一个 map[int]string 数据结构,默认大小256个元素,占用了75%后进行map扩容
m, err := xds.NewMapEx(mm, xmap.Int, xmap.String, (uintptr)256, 0.75)
*/
// NewMapEx returns a new XMap.
// 初始化调用xmap生成对象 - 可扩展方法
// mm 是XMM的内存池对象
// keyKind 是要生成 map[keyType]valType 中的 keyType
// valKind 是要生成 map[keyType]valType 中的 valType
// 说明:keyKind / valKind 都是直接调用xmap中对应的kind类型,必须提前初始化写入
// capSize 是默认初始化整个map的大小,本值最好是 2^N 的数字比较合适(2的N次方);
// 这个值主要提升性能,比如如果你预估到最终会有128个元素,可以初始化时候设置好,这样Xmap不会随意的动态扩容(默认值是16),提升性能
// factSize 负载因子,当存放的元素超过该百分比,就会触发扩容;建议值是0.75 (75%),这就是当存储数据容量达到75%会触发扩容机制;
//
// 本函数调用参考:
// //生成一个 map[int]string 数据结构,默认大小256个元素,占用了75%后进行map扩容
// m, err := xds.NewMapEx(mm, xmap.Int, xmap.String, (uintptr)256, 0.75)
func NewMapEx(mm xmm.XMemory, keyKind xmap.Kind, valKind xmap.Kind, capSize uintptr, factSize float64) (*XMap, error) {
chm, err := xmap.NewConcurrentHashMap(mm, capSize, factSize, 8, keyKind, valKind)
if err != nil {
Expand All @@ -58,39 +54,33 @@ func NewMapEx(mm xmm.XMemory, keyKind xmap.Kind, valKind xmap.Kind, capSize uint
return &XMap{chm: chm}, nil
}

//Set写入数据
func (xm *XMap) Set(key interface{}, val interface{}) (err error) {
// Set 写入数据
func (xm *XMap) Set(key interface{}, val interface{}) (err error) {
return xm.chm.Put(key, val)
}

//Remove删除数据
// Remove 删除数据
func (xm *XMap) Remove(key interface{}) (err error) {
return xm.chm.Del(key)
}

//Get数据
// Get 数据
func (xm *XMap) Get(key interface{}) (val interface{}, keyExists bool, err error) {
return xm.chm.Get(key)
}




//------------------------------------------------
// RawMap .
// ------------------------------------------------
// 当做原生Hash Map来使用场景
// 本套API主要是提供给把Xmap当做Hash表来使用的场景
//------------------------------------------------

//定义xmap的入口主结构

// ------------------------------------------------
// 定义xmap的入口主结构
type RawMap struct {
chm *xmap.ConcurrentRawHashMap
}

/*
初始化调用xmap - hashmap 生成对象
mm 是XMM的内存池对象
*/
// NewHashMap returns a new RawMap.
// 初始化调用xmap - hashmap 生成对象 mm 是XMM的内存池对象
func NewHashMap(mm xmm.XMemory) (*RawMap, error) {
chm, err := xmap.NewDefaultConcurrentRawHashMap(mm)
if err != nil {
Expand All @@ -99,18 +89,17 @@ func NewHashMap(mm xmm.XMemory) (*RawMap, error) {
return &RawMap{chm: chm}, nil
}

//Set写入数据
// Set 写入数据
func (xm *RawMap) Set(key []byte, val []byte) error {
return xm.chm.Put(key, val)
}

//Remove删除数据
// Remove 删除数据
func (xm *RawMap) Remove(key []byte) error {
return xm.chm.Del(key)
}

//Get数据
// Get 数据
func (xm *RawMap) Get(key []byte) ([]byte, bool, error) {
return xm.chm.Get(key)
}

Loading

0 comments on commit 896aa23

Please sign in to comment.