Files
redis-go/datastruct/set/set.go
finley bf7f628810 raft cluster
wip: raft does not care about migrating

wip: optimize code

wip: raft election

wip

wip: fix raft leader missing log entries

wip

fix a dead lock

batch set slot route

wip: raft persist

wip

refactor cluster suite

remove relay

rename relay2

refactor: allow customizing client factory

test raft

refactor re-balance

avoid errors caused by inconsistent status on follower nodes during raft commits

test raft election
2023-06-10 22:48:24 +08:00

125 lines
2.5 KiB
Go

package set
import "github.com/hdt3213/godis/datastruct/dict"
// Set is a set of elements based on hash table
type Set struct {
dict dict.Dict
}
// Make creates a new set
func Make(members ...string) *Set {
set := &Set{
dict: dict.MakeSimple(),
}
for _, member := range members {
set.Add(member)
}
return set
}
// Add adds member into set
func (set *Set) Add(val string) int {
return set.dict.Put(val, nil)
}
// Remove removes member from set
func (set *Set) Remove(val string) int {
_, ret := set.dict.Remove(val)
return ret
}
// Has returns true if the val exists in the set
func (set *Set) Has(val string) bool {
_, exists := set.dict.Get(val)
return exists
}
// Len returns number of members in the set
func (set *Set) Len() int {
return set.dict.Len()
}
// ToSlice convert set to []string
func (set *Set) ToSlice() []string {
slice := make([]string, set.Len())
i := 0
set.dict.ForEach(func(key string, val interface{}) bool {
if i < len(slice) {
slice[i] = key
} else {
// set extended during traversal
slice = append(slice, key)
}
i++
return true
})
return slice
}
// ForEach visits each member in the set
func (set *Set) ForEach(consumer func(member string) bool) {
set.dict.ForEach(func(key string, val interface{}) bool {
return consumer(key)
})
}
// Intersect intersects two sets
func (set *Set) Intersect(another *Set) *Set {
if set == nil {
panic("set is nil")
}
result := Make()
another.ForEach(func(member string) bool {
if set.Has(member) {
result.Add(member)
}
return true
})
return result
}
// Union adds two sets
func (set *Set) Union(another *Set) *Set {
if set == nil {
panic("set is nil")
}
result := Make()
another.ForEach(func(member string) bool {
result.Add(member)
return true
})
set.ForEach(func(member string) bool {
result.Add(member)
return true
})
return result
}
// Diff subtracts two sets
func (set *Set) Diff(another *Set) *Set {
if set == nil {
panic("set is nil")
}
result := Make()
set.ForEach(func(member string) bool {
if !another.Has(member) {
result.Add(member)
}
return true
})
return result
}
// RandomMembers randomly returns keys of the given number, may contain duplicated key
func (set *Set) RandomMembers(limit int) []string {
return set.dict.RandomKeys(limit)
}
// RandomDistinctMembers randomly returns keys of the given number, won't contain duplicated key
func (set *Set) RandomDistinctMembers(limit int) []string {
return set.dict.RandomDistinctKeys(limit)
}