Skip to content

documentstore

guolei edited this page Jun 3, 2024 · 1 revision

本文档介绍了moke-kit提供的DocumentStore组件的使用方法。

DocumentStoreModule(内置)

定义

通用的数据存储解决方案,提供了可自定义的缓存,以及基于数据版本的CAS操作来保证数据一致性,提供了数据操作通用接口等功能。

  • DocumentBase 数据操作基础结构体。

  • 通用的缓存策略接口ICache 接口,用于提供CacheAside 的缓存策略,你可以根据需要实现自己的缓存策略. moke-kit 提供了redis的实现

  • 通用的数据操作接口ICollection ,目前只实现了mongodb。

如何使用?

  1. 你需要在指定的Main 中初始化RedisCacheModule /自定义的缓存Module

    func main() {
        fxmain.Main(
            ofx.RedisCacheModule,
            )
    }
  2. 在你的ParamsObject 中注入DocumentStoreModule

        var GrpcService = fx.Provide(
        func(
            dbProvider ofx.DocumentStoreParams,// 注入DocumentStoreModule
        ) (rpc sfx.GrpcServiceResult, err error) {
        // 初始化DocumentStoreModule
        if coll, e := dbProvider.DriverProvider.OpenDbDriver(sSetting.AuthStoreName); e != nil {
            err = e
        }
  3. 创建基于DocumentBase的数据操作对象

     // 定义数据操作对象
     type Dao struct {
          nosql.DocumentBase `bson:"-"`
          Data    *ppb.Profile `bson:"data"`
      }
        
    // 定义初始化方法
     func (d *Dao) Init(id string, doc diface.ICollection, cache diface.ICache) error {
         key, e := NewProfileKey(id)
         if e != nil {
             return e
         }
         d.initData()
         d.DocumentBase.InitWithCache(&d.Data, d.clear, doc, key, cache)
         return nil
     }
    // 定义创建函数
     func NewProfileEntity(id string, doc diface.ICollection, cache diface.ICache) (*model.Dao, error) {
         dm := &model.Dao{}
         if err := dm.Init(id, doc, cache); err != nil {
             return nil, err
         }
         return dm, nil
     }
  4. 使用数据操作对象

         // 创建数据操作对象
         dao, err := NewProfileEntity(id, coll, cache)
         if err != nil {
             return nil, err
         }
         // 创建数据
         if err := dao.Create(); err != nil {
             return nil, err
         }
         // 读取数据
         if err := dao.Load(); err != nil {
             return nil, err
         }
         // 更新数据
         if err := dao.Update(func()bool{
            // you can update data here
            return dao.updateData()
         }); err != nil {
                   return nil, err
         }
         // 删除数据
         if err := dao.Clear(); err != nil {
             return nil, err
         }
Clone this wiki locally