mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-07 18:09:23 +08:00
解决IpAuditMap在UDP下的fatal error: concurrent map read and map write
This commit is contained in:
115
server/pkg/utils/maps.go
Normal file
115
server/pkg/utils/maps.go
Normal file
@@ -0,0 +1,115 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
cmap "github.com/orcaman/concurrent-map"
|
||||
)
|
||||
|
||||
type IMaps interface {
|
||||
Set(key string, val interface{})
|
||||
Get(key string) (interface{}, bool)
|
||||
Del(key string)
|
||||
}
|
||||
|
||||
/**
|
||||
* 基础的Map结构
|
||||
*
|
||||
*/
|
||||
type BaseMap struct {
|
||||
m map[string]interface{}
|
||||
}
|
||||
|
||||
func (m *BaseMap) Set(key string, value interface{}) {
|
||||
m.m[key] = value
|
||||
}
|
||||
func (m *BaseMap) Get(key string) (interface{}, bool) {
|
||||
v, ok := m.m[key]
|
||||
return v, ok
|
||||
}
|
||||
func (m *BaseMap) Del(key string) {
|
||||
delete(m.m, key)
|
||||
}
|
||||
|
||||
/**
|
||||
* CMap 并发结构
|
||||
*
|
||||
*/
|
||||
type ConcurrentMap struct {
|
||||
m cmap.ConcurrentMap
|
||||
}
|
||||
|
||||
func (m *ConcurrentMap) Set(key string, value interface{}) {
|
||||
m.m.Set(key, value)
|
||||
}
|
||||
|
||||
func (m *ConcurrentMap) Get(key string) (interface{}, bool) {
|
||||
return m.m.Get(key)
|
||||
}
|
||||
|
||||
func (m *ConcurrentMap) Del(key string) {
|
||||
m.m.Remove(key)
|
||||
}
|
||||
|
||||
/**
|
||||
* Map 读写结构
|
||||
*
|
||||
*/
|
||||
type RWLockMap struct {
|
||||
m map[string]interface{}
|
||||
lock sync.RWMutex
|
||||
}
|
||||
|
||||
func (m *RWLockMap) Set(key string, value interface{}) {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
m.m[key] = value
|
||||
}
|
||||
|
||||
func (m *RWLockMap) Get(key string) (interface{}, bool) {
|
||||
m.lock.RLock()
|
||||
defer m.lock.RUnlock()
|
||||
v, ok := m.m[key]
|
||||
return v, ok
|
||||
}
|
||||
|
||||
func (m *RWLockMap) Del(key string) {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
delete(m.m, key)
|
||||
}
|
||||
|
||||
/**
|
||||
* sync.Map 结构
|
||||
*
|
||||
*/
|
||||
type SyncMap struct {
|
||||
m sync.Map
|
||||
}
|
||||
|
||||
func (m *SyncMap) Set(key string, val interface{}) {
|
||||
m.m.Store(key, val)
|
||||
}
|
||||
|
||||
func (m *SyncMap) Get(key string) (interface{}, bool) {
|
||||
return m.m.Load(key)
|
||||
}
|
||||
|
||||
func (m *SyncMap) Del(key string) {
|
||||
m.m.Delete(key)
|
||||
}
|
||||
|
||||
func NewMap(name string, len int) IMaps {
|
||||
switch name {
|
||||
case "cmap":
|
||||
return &ConcurrentMap{m: cmap.New()}
|
||||
case "rwmap":
|
||||
m := make(map[string]interface{}, len)
|
||||
return &RWLockMap{m: m}
|
||||
case "syncmap":
|
||||
return &SyncMap{}
|
||||
default:
|
||||
m := make(map[string]interface{}, len)
|
||||
return &BaseMap{m: m}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user