在前面提供的两个版本中,基于 LRU 缓存的版本更好:
import (
"strings"
lru "golang.org/x/tools/container/lru"
)
const maxCachedResources = 1024
var resourceCache *lru.Cache
func init() {
resourceCache = lru.New(maxCachedResources)
}
func resourcesAcl(resources map[string]struct{}, resource string) bool {
if len(resources) == 0 {
return true
}
if _, authorized := resources[resource]; authorized {
return true
}
if authorized, ok := resourceCache.Get(resource); ok {
return authorized.(bool)
}
for r := range resources {
if strings.HasPrefix(resource, r) {
resourceCache.Add(resource, true)
return true
}
}
return false
}
为什么 LRU 缓存更好:
与前一个版本的比较:
其他建议:
maxCachedResources
改为可配置参数,方便根据不同场景调整。总体而言,使用 LRU 缓存可以更好地平衡缓存性能和内存占用,更适合处理大量的资源匹配请求。