https://github.com/shomali11/maps
Concurrent Map
https://github.com/shomali11/maps
concurrent concurrent-map map multimap shard sharding
Last synced: 12 months ago
JSON representation
Concurrent Map
- Host: GitHub
- URL: https://github.com/shomali11/maps
- Owner: shomali11
- License: mit
- Created: 2017-08-05T22:15:01.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2019-06-08T14:53:02.000Z (almost 7 years ago)
- Last Synced: 2025-04-13T03:49:07.586Z (about 1 year ago)
- Topics: concurrent, concurrent-map, map, multimap, shard, sharding
- Language: Go
- Size: 84 KB
- Stars: 4
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# maps [](https://travis-ci.com/shomali11/maps) [](https://goreportcard.com/report/github.com/shomali11/maps) [](https://godoc.org/github.com/shomali11/maps) [](https://opensource.org/licenses/MIT)
A collection of various maps with concurrent versions that supports concurrent reads and writes.
## Features
* Thread safe
* Available types:
* Maps:
* Multi Map
* Concurrent Maps:
* Concurrent Map
* Concurrent Multi Map
* Sharded Concurrent Maps:
* Sharded Concurrent Map
* Sharded Concurrent Multi Map
_Note: Sharded versions provides improved performance by reducing the number of write locks_
## Dependencies
* `util` [github.com/shomali11/util](https://github.com/shomali11/util)
# Examples
## Example 1
Using `NewConcurrentMap` to create a concurrent map
```go
package main
import (
"fmt"
"github.com/shomali11/maps"
)
func main() {
concurrentMap := maps.NewConcurrentMap()
concurrentMap.Set("name", "Raed Shomali")
fmt.Println(concurrentMap.ContainsKey("name")) // true
fmt.Println(concurrentMap.Get("name")) // "Raed Shomali" true
fmt.Println(concurrentMap.Size()) // 1
fmt.Println(concurrentMap.IsEmpty()) // false
fmt.Println(concurrentMap.Keys()) // ["name"]
concurrentMap.Remove("name")
fmt.Println(concurrentMap.ContainsKey("name")) // false
fmt.Println(concurrentMap.Get("name")) // false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
concurrentMap.Set("name", "Raed Shomali")
concurrentMap.Clear()
fmt.Println(concurrentMap.ContainsKey("name")) // false
fmt.Println(concurrentMap.Get("name")) // false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
}
```
## Example 2
Using `NewShardedConcurrentMap` to create a sharded concurrent map. _Default shards are 16_
```go
package main
import (
"fmt"
"github.com/shomali11/maps"
)
func main() {
concurrentMap := maps.NewShardedConcurrentMap()
concurrentMap.Set("name", "Raed Shomali")
fmt.Println(concurrentMap.ContainsKey("name")) // true
fmt.Println(concurrentMap.Get("name")) // "Raed Shomali" true
fmt.Println(concurrentMap.Size()) // 1
fmt.Println(concurrentMap.IsEmpty()) // false
fmt.Println(concurrentMap.Keys()) // ["name"]
concurrentMap.Remove("name")
fmt.Println(concurrentMap.ContainsKey("name")) // false
fmt.Println(concurrentMap.Get("name")) // false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
concurrentMap.Set("name", "Raed Shomali")
concurrentMap.Clear()
fmt.Println(concurrentMap.ContainsKey("name")) // false
fmt.Println(concurrentMap.Get("name")) // false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
}
```
## Example 3
Using `WithNumberOfShards` to override default number of shards
```go
package main
import (
"fmt"
"github.com/shomali11/maps"
)
func main() {
concurrentMap := maps.NewShardedConcurrentMap(maps.WithNumberOfShards(100))
concurrentMap.Set("name", "Raed Shomali")
fmt.Println(concurrentMap.ContainsKey("name")) // true
fmt.Println(concurrentMap.Get("name")) // "Raed Shomali" true
fmt.Println(concurrentMap.Size()) // 1
fmt.Println(concurrentMap.IsEmpty()) // false
fmt.Println(concurrentMap.Keys()) // ["name"]
concurrentMap.Remove("name")
fmt.Println(concurrentMap.ContainsKey("name")) // false
fmt.Println(concurrentMap.Get("name")) // false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
concurrentMap.Set("name", "Raed Shomali")
concurrentMap.Clear()
fmt.Println(concurrentMap.ContainsKey("name")) // false
fmt.Println(concurrentMap.Get("name")) // false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
}
```
## Example 4
Using `NewConcurrentMultiMap` to create a concurrent multi map
```go
package main
import (
"fmt"
"github.com/shomali11/maps"
)
func main() {
concurrentMap := maps.NewConcurrentMultiMap()
concurrentMap.Set("names", []interface{}{"Raed Shomali"})
concurrentMap.Append("names", "Dwayne Johnson")
fmt.Println(concurrentMap.ContainsKey("names")) // true
fmt.Println(concurrentMap.Get("names")) // ["Raed Shomali" "Dwayne Johnson"] true
fmt.Println(concurrentMap.Size()) // 1
fmt.Println(concurrentMap.IsEmpty()) // false
fmt.Println(concurrentMap.Keys()) // ["name"]
concurrentMap.Remove("names")
fmt.Println(concurrentMap.ContainsKey("names")) // false
fmt.Println(concurrentMap.Get("names")) // [] false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
concurrentMap.Append("names", "Raed Shomali")
concurrentMap.Clear()
fmt.Println(concurrentMap.ContainsKey("names")) // false
fmt.Println(concurrentMap.Get("names")) // [] false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
}
```
## Example 5
Using `NewShardedConcurrentMultiMap` to create a sharded concurrent multi map. _Default shards are 16_
```go
package main
import (
"fmt"
"github.com/shomali11/maps"
)
func main() {
concurrentMap := maps.NewShardedConcurrentMultiMap()
concurrentMap.Set("names", []interface{}{"Raed Shomali"})
concurrentMap.Append("names", "Dwayne Johnson")
fmt.Println(concurrentMap.ContainsKey("names")) // true
fmt.Println(concurrentMap.Get("names")) // ["Raed Shomali" "Dwayne Johnson"] true
fmt.Println(concurrentMap.Size()) // 1
fmt.Println(concurrentMap.IsEmpty()) // false
fmt.Println(concurrentMap.Keys()) // ["name"]
concurrentMap.Remove("names")
fmt.Println(concurrentMap.ContainsKey("names")) // false
fmt.Println(concurrentMap.Get("names")) // [] false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
concurrentMap.Append("names", "Raed Shomali")
concurrentMap.Clear()
fmt.Println(concurrentMap.ContainsKey("names")) // false
fmt.Println(concurrentMap.Get("names")) // [] false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
}
```
## Example 6
Using `WithNumberOfShards` to override default number of shards
```go
package main
import (
"fmt"
"github.com/shomali11/maps"
)
func main() {
concurrentMap := maps.NewShardedConcurrentMultiMap(maps.WithNumberOfShards(100))
concurrentMap.Set("names", []interface{}{"Raed Shomali"})
concurrentMap.Append("names", "Dwayne Johnson")
fmt.Println(concurrentMap.ContainsKey("names")) // true
fmt.Println(concurrentMap.Get("names")) // ["Raed Shomali" "Dwayne Johnson"] true
fmt.Println(concurrentMap.Size()) // 1
fmt.Println(concurrentMap.IsEmpty()) // false
fmt.Println(concurrentMap.Keys()) // ["name"]
concurrentMap.Remove("names")
fmt.Println(concurrentMap.ContainsKey("names")) // false
fmt.Println(concurrentMap.Get("names")) // [] false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
concurrentMap.Append("names", "Raed Shomali")
concurrentMap.Clear()
fmt.Println(concurrentMap.ContainsKey("names")) // false
fmt.Println(concurrentMap.Get("names")) // [] false
fmt.Println(concurrentMap.Size()) // 0
fmt.Println(concurrentMap.IsEmpty()) // true
fmt.Println(concurrentMap.Keys()) // []
}
```