https://github.com/ormissia/cache_shim
一个数据库与内存之间的缓适配器,运用了控制反转的思想。引入之后无需重复为每种实体实现相同的缓存策略
https://github.com/ormissia/cache_shim
Last synced: 4 months ago
JSON representation
一个数据库与内存之间的缓适配器,运用了控制反转的思想。引入之后无需重复为每种实体实现相同的缓存策略
- Host: GitHub
- URL: https://github.com/ormissia/cache_shim
- Owner: ormissia
- License: mit
- Created: 2022-12-08T10:38:28.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2023-05-25T10:10:14.000Z (about 2 years ago)
- Last Synced: 2025-01-02T07:44:49.580Z (5 months ago)
- Language: Go
- Homepage:
- Size: 9.77 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# cache_shim 缓存适配器
> 一个数据库与内存之间的缓存适配器,运用了控制反转的思想。引入之后无需重复为每种实体实现相同的缓存策略
## 框架背景
> 大多数情况下我们在代码中添加`Redis`作为缓存中间件之后都会多出很多代码来。每给一个实体添加缓存,都需要加一大堆代码。久而久之,代码库变得非常冗杂而且难看。
举个栗子,一个带缓存的实体的查询逻辑的伪代码:
```go
func (e *TestS) Select() {
e, ok := SelectFromRedis()
if !ok {
et, ok := SelectFromDB()
if !ok {
return
}
e = etgo func() {
SaveToCache(e)
}()return
}
return
}
```假如一个服务中有多个需要维护到缓存中的实体,再加上删除,修改等其他逻辑,就会出现非常多的相似代码,导致维护十分麻烦,而且复用性极低。即使写成工具类,当有新服务加入时,也需要将代码拷来拷去,显得十分不专业。
因此,写了这个缓存适配器框架,使用`控制反转`的思想,代码中的实体只需实现指定接口,删除、修改、查询时只需要调用该库的对应方法即可,无需关心具体实现,框架会自动完成缓存相关逻辑。
## 使用示例
1. 缓存客户端实现`CacheClintImpl`接口
```go
type CacheClintImpl interface {
Del(key string) (int64, error)
SetString(key, value string) error
GetString(k string) (string, error)
}
```实现参考[redis_storage.go](example/redis_ex/redis_storage.go)
2. 初始化缓存客户端并将缓存客户端示例初始化到框架中
```go
redis_ex.Init()
cache_shim.InitCacheClient(&redis_ex.RDB)
```3. 需要做缓存的实体实现`CacheTypeImpl`接口
```go
type CacheTypeImpl interface {
CacheKey() stringDelete() error
Select() error
Update() error
}
```实现参考[user_ex.go](example/db_ex/user_ex.go)
4. 向数据库中插入数据之后,使用框架提供的查询方法查询
因为控制反转,这个时候不需要直接调用实体的`Select()`方法,直接调用`cache-shim`包中的`Select()`函数即可,框架将自动维护缓存中的数据。
```go
_ = t1.Insert()
t, err := cache_shim.Select[*db_ex.UserEx](t1)
fmt.Printf("t.type: %T\tt: %v\terr: %v",t,t,err)
```代码参考[main.go](example/main.go)
> 修改、删除同理
## TODO
- 支持传入自定义序列化、反序列化函数
- `CacheClint`生成的实体变量改为由用户存储