让我们对比一下两个版本:
// 版本1: 简单的size限制
func resourcesAcl(resources map[string]struct{}, resource string) bool {
if len(resources) == 0 {
return true
}
if _, authorized := resources[resource]; authorized {
return true
}
for r := range resources {
if strings.HasPrefix(resource, r) {
if len(resources) < 1024 {
resources[resource] = struct{}{}
}
return true
}
}
return false
}
// 版本2: LRU缓存实现
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
}
我建议使用版本1(简单的size限制),原因如下:
简单性:
内存效率:
性能:
可维护性:
虽然LRU缓存在某些场景下可能更优,但对于当前的ACL检查场景,版本1的简单实现已经足够好了。如果将来有特殊需求(比如需要更复杂的缓存策略),再考虑升级到LRU实现。
记住,在软件开发中,过早优化往往是万恶之源。除非有明确的性能瓶颈,否则应该选择更简单、更容易维护的解决方案。