分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
尝试写了一个demo,但是感觉不够灵活,有没有最佳实践可以参考一下?主要目的是解耦缓存逻辑与业务逻辑
```go
package cache
import "context"
//对缓存的个性化设置,如最大空间、过期时间等如何加入,处理缓存一致性、缓存穿透等问题?
type Cache interface {
Get(ctx context.Context, key string, ret interface{}) error
Set(ctx context.Context, key string, value interface{}) error
}
type RedisCache struct {
client int //假设是redis client
}
func (rc RedisCache) Get(ctx context.Context, key string, ret interface{}) error {
return nil
}
func (rc RedisCache) Set(ctx context.Context, key string, value interface{}) error {
return nil
}
type Service struct {
redis Cache
goCache Cache
mysql int
}
type mysqlGetFunc func(ctx context.Context, key string, ret interface{}) error
type Data1 struct {
}
//也可以做成一个接口
func (s *Service) GetDataFunc(ctx context.Context, mf mysqlGetFunc, key string, ret interface{}, caches ... Cache) error {
for _, c := range caches {
err := c.Get(ctx, key, &ret)
if err != nil {
return err
}
//if d exist -> return
}
err := mf(ctx, key, &ret)
if err != nil {
return err
}
for _, c := range caches {
//update cache
c.Set(ctx, key, ret)
}
return nil
}
func (s *Service) GetData1(ctx context.Context, key string, caches ... Cache) ([]*Data1, error){
ret := make([]*Data1, 0)
s.GetDataFunc(ctx, nil /*mysql.GetData1()*/, key, &ret, caches...)
return nil, nil
}
var _ Cache = (*RedisCache)(nil)
func test() {
service := &Service{redis: RedisCache{client: 1} }
service.GetData1(context.Background(), "key")
service.GetData1(context.Background(), "key", service.redis)
}
```
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信2295 次点击 ∙ 1 赞
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传