package
0.0.0-20211208162728-2c17daf04a11
Repository: https://github.com/herb-go/deprecated.git
Documentation: pkg.go.dev

# README

Datastore 数据存储组件

将数据依据主键的方式进行存储,并能快速的通过创建函数(creator)和加载函数(loader)从缓存和数据源中进行批量加载。

一般用于作为用户或者其他数据模型的缓存

功能

  • 提供store接口,便于根据实际数据类型自定义store实现,快速转换数据
  • 使用提供的缓存进行数据的序列化与反序列化
  • 预防缓存雪崩

缺点

  • 只支持字符串类型的主键

使用方法

Store 数据存储集

储存所有已经从数据源和缓存中取出的数据的接口类型。

需要实现5个方法

Store.Load(key string) (value interface{}, ok bool)

从数据存储集中按给定主键取出对象值。

返回值value为具体的值

返回值ok为是否成功获取。

Store.Store(key string, value interface{})

将给到的数据(value)以指定主键(key)存入数据存储集

Store.Delete(key string)

在数据存储集中按主键删除数据。只有通过这个方法才能删除特定的数据,通过Store方法存入nil并不视为删除数据

Store.Flush()

清除所有数据

Store.LoadInterface(key string) interface{}

将数据强制以 interface{} 的形式取出。与Load方法的区别是并不关注数据是否存在。不存在的数据以nil返回

MapStore与SyncMapStore

MapStore和SyncMapStore的区别是具体实现的驱动

MapStore的实现是map[string]interface{},效率理论较高,非线程安全。创建方式为

 s:=datastore.NewMapStore()

SyncMapStore的实现是sync.Map,线程安全。创建方式为

 s:=datastore.NewSyncMapStore()

Creator/Loader方法

这两个是负责数据初始化和加载的函数

Creator的形式为

func() interface{}

返回一个初始化好的数据

Loader的形式为

func(...string) (map[string]interface{}, error)

通过给定的主键列表加载返回加载成功的数据集,或者任何发生的错误。

###直接通过Store/Creator/Loader 加载数据

err:=Load(store, datacache, loader, creator, key1,key2,key3,key4....)  

将主键列表中的数据加载到store中。同时在给定缓存中对未缓存的数据进行缓存

通过Datasource加载数据

Datasource是一个包含了数据Creator和Loader的结构。创建方式为

datasource:=datastore.NewDataSource()
datasource.Creator=creator
datasource.SourceLoader=loader

通过datasouce加载数据有两种方式

1.传入缓存,直接加载

err:=datasource.Load(store, c cache, key1,key2.key3...) error {

2.传入缓存,生成Loader,通过Loader加载

Loader是一个包含store,cache,datasource的结构

loader:=datasource.NewSyncMapStoreLoader(cache)
//如果需要使用MapStore的话,使用
//loader:=datasource.NewMapStoreLoader(cache)
err:=loader.Load(key1,key2,key3)
store:=loader.Store

对loader可以进行Delete和Flush操作,会同时对对应的Store和缓存进行操作

err:=loader.Delete(key)
//同时删除对应的数据存储集和缓存里的对应主键的值
err:=loader.Flust()
//同时清空对应的数据存储集和缓存

通过实现BatchDataLoader 接口的结构加载

BatchDataLoader 是一个包含数据Creator和Loader的接口。Datasource就是一个BatchDataLoader 的实现。

通过BatchDataLoader加载数据有两种方式

1.传入缓存,直接加载

err:=LoadWithBatchLoader(store, cache, batchdataloader, key1,key2,key3...)

2.传入缓存,生成Loader,通过Loader加载

loader:=NewSyncMapLoader(cache,batchdataloader)
//如果需要使用MapStore的话,使用
//loader:=NewMapLoader(cache,batchdataloader)
err:=loader.Load(key1,key2,key3)
store:=loader.Store