ecodeclub / ecache

统一缓存 API
Apache License 2.0
12 stars 15 forks source link

ecache: 分组的装饰器实现 #31

Closed flycash closed 10 months ago

flycash commented 10 months ago

仅限中文

使用场景

在大部分的中小公司里面,所有的业务都是共用一个 Redis 之类的集群。

不同的业务之间通过 key 的前缀来区别。

例如说:

而在同一个应用内部,要求所有使用 cache 的地方都要符合前缀约定,是一个比较难解决的事情,大对数时候只能依赖于测试或者 review 代码来发现是否正确使用了前缀。

行业分析

如果你知道有框架提供了类似功能,可以在这里描述,并且给出文档或者例子

可行方案

如果你有设计思路或者解决方案,请在这里提供。你可以提供多个方案,并且给出自己的选择

而实际上我们可以通过提供一个新的装饰器实现来达成这个目标。

type NamespaceCache struct {
    c Cache
    namespace string
}
// 以 Get 为例子
func (c *NamespaceCache) Get(key string) {
    return c.c.Get(c.namespace + key)
}

这里有一个值得讨论的地方,即分隔符的问题。也就是按照道理来说,类似于 app1:biz1:key1,对应的 Namespace 是app1,然后分隔符是 :。

但是这里我并打算采用下面这种设计:

type NamespaceCache struct {
   c Cache
// 类似于 app1
   namespace string
// 类似于 :
   seperator string
}

func (c *NamespaceCache) Get(key string) {
    return c.c.Get(c.namespace + seperator + key)
}

道理也很简单,因为这纯纯是一个没有必要的设计。在引入分隔符的概念时候,就要考虑不同的人使用不同的分隔符,所以需要 seperator 字段,并且要考虑提供默认的分隔符。

而实际上,我们可以统一认为,类似于 app1: 自身就构成了一个 namespace(命名空间),这样可以将分隔符之类的问题交给用户来解决。

换句话来说,我认为这个实现没有必要维持一个分隔符的概念。

其它

任何你觉得有利于解决问题的补充说明

你使用的是 ecache 哪个版本?

你设置的的 Go 环境?

上传 go env 的结果

flycash commented 10 months ago

33