缓存管理

概述

本章节介绍 monc 的用法。

准备条件

  1. 完成 mon 的链接创建。

创建链接对象

数据库的连接创建提供了五个方法。

  1. MustNewModel
  1. 函数签名:
  2. MustNewModel func(uri, db, collection string, c cache.CacheConf, opts ...cache.Option) *Model
  3. 说明:
  4. 1. mongodb 连接创建存在问题时,会直接进退退出,输出错误日志。
  5. 2. db collection 不存在时,会创建 db collection
  6. 入参:
  7. 1. uri: mongodb uri
  8. 2. db: 数据库名
  9. 3. collection: 集合名
  10. 4. c: cache cluster config
  11. 5. opts: WithExpiry 自定义过期时间,WithNotFoundExpiry 没有记录时,缓存空记录时间(防止缓存穿透)
  12. 返回值:
  13. 1. *Model: 连接管理对象
  1. MustNewNodeModel
  1. 函数签名:
  2. MustNewNodeModel func(uri, db, collection string, rds *redis.Redis, opts ...cache.Option) *Model
  3. 说明:
  4. 1. mongodb 连接创建存在问题时,会直接进退退出,输出错误日志。
  5. 2. db collection 不存在时,会创建 db collection
  6. 入参:
  7. 1. uri: mongodb uri
  8. 2. db: 数据库名
  9. 3. collection: 集合名
  10. 4. rds: redis 链接对象
  11. 5. opts: WithExpiry 自定义过期时间,WithNotFoundExpiry 没有记录时,缓存空记录时间(防止缓存穿透)
  12. 返回值:
  13. 1. *Model: 连接管理对象
  1. NewModel
  1. 函数签名:
  2. NewModel func(uri, db, collection string, conf cache.CacheConf, opts ...cache.Option) (*Model, error)
  3. 说明:
  4. 1. db collection 不存在时,会创建 db collection
  5. 入参:
  6. 1. uri: mongodb uri
  7. 2. db: 数据库名
  8. 3. collection: 集合名
  9. 4. c: cache cluster config
  10. 5. opts: WithExpiry 自定义过期时间,WithNotFoundExpiry 没有记录时,缓存空记录时间(防止缓存穿透)
  11. 返回值:
  12. 1. *Model: 连接管理对象
  13. 2. error: 创建错误
  1. NewNodeModel
  1. 函数签名:
  2. NewNodeModel func(uri, db, collection string, rds *redis.Redis, opts ...cache.Option) (*Model, error)
  3. 说明:
  4. 1. db collection 不存在时,会创建 db collection
  5. 入参:
  6. 1. uri: mongodb uri
  7. 2. db: 数据库名
  8. 3. collection: 集合名
  9. 4. rds: redis 链接对象
  10. 5. opts: WithExpiry 自定义过期时间,WithNotFoundExpiry 没有记录时,缓存空记录时间(防止缓存穿透)
  11. 返回值:
  12. 1. *Model: 连接管理对象
  13. 2. error: 创建错误
  1. NewModelWithCache
  1. 函数签名:
  2. NewModelWithCache func(uri, db, collection string, c cache.Cache) (*Model, error)
  3. 说明:
  4. 1. db collection 不存在时,会创建 db collection
  5. 入参:
  6. 1. uri: mongodb uri
  7. 2. db: 数据库名
  8. 3. collection: 集合名
  9. 4. c: 自定义 cache 实现
  10. 返回值:
  11. 1. *Model: 连接管理对象
  12. 2. error: 创建错误

新增

  1. InsertOne
  1. 函数签名:
  2. InsertOne func(ctx context.Context, key string, document interface{},
  3. opts ...*mopt.InsertOneOptions) (*mongo.InsertOneResult, error)
  4. 说明:
  5. 1. 新增单条记录,新增同时会清理 key 缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. key: 缓存 key
  9. 3. document: 记录
  10. 4. opts: 操作选项
  11. 返回值:
  12. 1. *mongo.InsertOneResult: 新增结果,包含记录 _id 信息
  13. 2. error: 操作结果
  14. 示例:
  15. var prefixUserCacheKey = "cache:user:"
  16. type User struct {
  17. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  18. // TODO: Fill your own fields
  19. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  20. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  21. }
  22. func (m *defaultUserModel) Insert(ctx context.Context, data *User) error {
  23. if data.ID.IsZero() {
  24. data.ID = primitive.NewObjectID()
  25. data.CreateAt = time.Now()
  26. data.UpdateAt = time.Now()
  27. }
  28. key := prefixUserCacheKey + data.ID.Hex()
  29. _, err := m.conn.InsertOne(ctx, key, data)
  30. return err
  31. }
  1. InsertOneNoCache
  1. 函数签名:
  2. InsertOneNoCache func(ctx context.Context, document interface{},
  3. opts ...*mopt.InsertOneOptions) (*mongo.InsertOneResult, error)
  4. 说明:
  5. 1. 新增单条记录,不会清理缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. document: 记录
  9. 3. opts: 操作选项
  10. 返回值:
  11. 1. *mongo.InsertOneResult: 新增结果,包含记录 _id 信息
  12. 2. error: 操作结果
  13. 示例:
  14. type User struct {
  15. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  16. // TODO: Fill your own fields
  17. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  18. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  19. }
  20. func (m *defaultUserModel) Insert(ctx context.Context, data *User) error {
  21. if data.ID.IsZero() {
  22. data.ID = primitive.NewObjectID()
  23. data.CreateAt = time.Now()
  24. data.UpdateAt = time.Now()
  25. }
  26. _, err := m.conn.InsertOneNoCache(ctx, data)
  27. return err
  28. }

更新

  1. UpdateByID
  1. 函数签名:
  2. UpdateByID func(ctx context.Context, key string, id, update interface{},
  3. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  4. 说明:
  5. 1. 通过 _id 更新记录,同时会清理 key 缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. key: 缓存 key
  9. 3. id: 记录 _id
  10. 4. update: 记录
  11. 5. opts: 操作选项
  12. 返回值:
  13. 1. *mongo.UpdateResult: 更新结果,包含记录 _id 信息
  14. 2. error: 操作结果
  15. 示例:
  16. var prefixUserCacheKey = "cache:user:"
  17. type User struct {
  18. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  19. // TODO: Fill your own fields
  20. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  21. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  22. }
  23. func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
  24. data.UpdateAt = time.Now()
  25. key := prefixUserCacheKey + data.ID.Hex()
  26. _, err := m.conn.UpdateByID(ctx, key, bson.M{"_id": data.ID}, data)
  27. return err
  28. }
  1. UpdateByIDNoCache
  1. 函数签名:
  2. UpdateByIDNoCache func(ctx context.Context, id, update interface{},
  3. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  4. 说明:
  5. 1. 通过 _id 更新记录,不会清理缓存。
  6. 入参:
  7. 1. ctx: context
  8. 3. id: 记录 _id
  9. 3. update: 记录
  10. 4. opts: 操作选项
  11. 返回值:
  12. 1. *mongo.UpdateResult: 更新结果,包含记录 _id 信息
  13. 2. error: 操作结果
  14. 示例:
  15. type User struct {
  16. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  17. // TODO: Fill your own fields
  18. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  19. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  20. }
  21. func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
  22. data.UpdateAt = time.Now()
  23. key := prefixUserCacheKey + data.ID.Hex()
  24. _, err := m.conn.UpdateByIDNoCache(ctx, bson.M{"_id": data.ID}, data)
  25. return err
  26. }
  1. UpdateMany
  1. 函数签名:
  2. UpdateMany func(ctx context.Context, keys []string, filter, update interface{},
  3. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  4. 说明:
  5. 1. 更新多条记录,同时会清理 keys 缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. keys: 缓存 key 列表
  9. 3. filter: 过滤条件
  10. 4. update: 记录
  11. 5. opts: 操作选项
  12. 返回值:
  13. 1. *mongo.UpdateResult: 更新结果,包含记录 _id 信息
  14. 2. error: 操作结果
  15. 示例:
  16. var prefixUserCacheKey = "cache:user:"
  17. type User struct {
  18. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  19. Name string `bson:"name,omitempty" json:"name,omitempty"`
  20. Age int `bson:"age,omitempty" json:"age,omitempty"`
  21. // TODO: Fill your own fields
  22. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  23. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  24. }
  25. func (m *defaultUserModel) UpdateMany(ctx context.Context, name string, data []*User) error {
  26. var keys = make([]string, 0, len(data))
  27. for _, v := range data {
  28. keys = append(keys, prefixUserCacheKey+v.ID.Hex())
  29. v.UpdateAt = time.Now()
  30. }
  31. _, err := m.conn.UpdateMany(ctx, keys, bson.M{"name": name}, data)
  32. return err
  33. }
  1. UpdateManyNoCache
  1. 函数签名:
  2. UpdateManyNoCache func(ctx context.Context, filter, update interface{},
  3. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  4. 说明:
  5. 1. 通过 _id 更新记录,不会清理缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. filter: 过滤条件
  9. 3. update: 记录
  10. 4. opts: 操作选项
  11. 返回值:
  12. 1. *mongo.UpdateResult: 更新结果,包含记录 _id 信息
  13. 2. error: 操作结果
  14. 示例:
  15. type User struct {
  16. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  17. Name string `bson:"name,omitempty" json:"name,omitempty"`
  18. Age int `bson:"age,omitempty" json:"age,omitempty"`
  19. // TODO: Fill your own fields
  20. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  21. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  22. }
  23. func (m *defaultUserModel) UpdateMany(ctx context.Context, name string, data []*User) error {
  24. _, err := m.conn.UpdateManyNoCache(ctx, bson.M{"name": name}, data)
  25. return err
  26. }
  1. UpdateOne
  1. 函数签名:
  2. UpdateOne func(ctx context.Context, key string, filter, update interface{},
  3. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  4. 说明:
  5. 1. 更新单条记录,同时清理 key 缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. key: 缓存 key
  9. 3. filter: 过滤条件
  10. 4. update: 记录
  11. 5. opts: 操作选项
  12. 返回值:
  13. 1. *mongo.UpdateResult: 更新结果,包含记录 _id 信息
  14. 2. error: 操作结果
  15. 示例:
  16. var prefixUserCacheKey = "cache:user:"
  17. type User struct {
  18. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  19. Name string `bson:"name,omitempty" json:"name,omitempty"`
  20. Age int `bson:"age,omitempty" json:"age,omitempty"`
  21. // TODO: Fill your own fields
  22. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  23. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  24. }
  25. func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
  26. data.UpdateAt = time.Now()
  27. key := prefixUserCacheKey + data.ID.Hex()
  28. _, err := m.conn.UpdateOne(ctx, key, bson.M{"name": data.Name}, data)
  29. return err
  30. }
  1. UpdateOneNoCache
  1. 函数签名:
  2. UpdateOneNoCache func(ctx context.Context, filter, update interface{},
  3. opts ...*mopt.UpdateOptions) (*mongo.UpdateResult, error)
  4. 说明:
  5. 1. 更新单条记录,不会清理缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. filter: 过滤条件
  9. 3. update: 记录
  10. 4. opts: 操作选项
  11. 返回值:
  12. 1. *mongo.UpdateResult: 更新结果,包含记录 _id 信息
  13. 2. error: 操作结果
  14. 示例:
  15. type User struct {
  16. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  17. Name string `bson:"name,omitempty" json:"name,omitempty"`
  18. Age int `bson:"age,omitempty" json:"age,omitempty"`
  19. // TODO: Fill your own fields
  20. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  21. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  22. }
  23. func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
  24. data.UpdateAt = time.Now()
  25. _, err := m.conn.UpdateOneNoCache(ctx, bson.M{"name": data.Name}, data)
  26. return err
  27. }

查询

  1. FindOne
  1. 函数签名:
  2. FindOne func(ctx context.Context, key string, v, filter interface{},
  3. opts ...*mopt.FindOneOptions) error
  4. 说明:
  5. 1. 查询单条记录,优先通过缓存 key 查找,查不到会从数据库查找再插入缓存中,
  6. 如果数据库也不存在会在缓存中插入空记录,防止缓存穿透。
  7. 入参:
  8. 1. ctx: context
  9. 2. key: 缓存 key
  10. 3. v: 查询记录结果
  11. 4. filter: 查询条件
  12. 5. opts: 操作选项
  13. 返回值:
  14. 1. error: 操作结果
  15. 示例:
  16. var prefixUserCacheKey = "cache:user:"
  17. type User struct {
  18. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  19. Name string `bson:"name,omitempty" json:"name,omitempty"`
  20. Age int `bson:"age,omitempty" json:"age,omitempty"`
  21. // TODO: Fill your own fields
  22. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  23. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  24. }
  25. func (m *defaultUserModel) FindOne(ctx context.Context, id string) (*User, error) {
  26. oid, err := primitive.ObjectIDFromHex(id)
  27. if err != nil {
  28. return nil, ErrInvalidObjectId
  29. }
  30. var data User
  31. key := prefixUserCacheKey + id
  32. err = m.conn.FindOne(ctx, key, &data, bson.M{"_id": oid})
  33. switch err {
  34. case nil:
  35. return &data, nil
  36. case monc.ErrNotFound:
  37. return nil, ErrNotFound
  38. default:
  39. return nil, err
  40. }
  41. }
  1. FindOneNoCache
  1. 函数签名:
  2. FindOneNoCache func(ctx context.Context, v, filter interface{},
  3. opts ...*mopt.FindOneOptions) error
  4. 说明:
  5. 1. 查询单条记录,不使用缓存。
  6. 入参:
  7. 1. ctx: context
  8. 2. v: 查询记录结果
  9. 3. filter: 查询条件
  10. 4. opts: 操作选项
  11. 返回值:
  12. 1. error: 操作结果
  13. 示例:
  14. type User struct {
  15. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  16. Name string `bson:"name,omitempty" json:"name,omitempty"`
  17. Age int `bson:"age,omitempty" json:"age,omitempty"`
  18. // TODO: Fill your own fields
  19. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  20. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  21. }
  22. func (m *defaultUserModel) FindOne(ctx context.Context, id string) (*User, error) {
  23. oid, err := primitive.ObjectIDFromHex(id)
  24. if err != nil {
  25. return nil, ErrInvalidObjectId
  26. }
  27. var data User
  28. err = m.conn.FindOneNoCache(ctx, &data, bson.M{"_id": oid})
  29. switch err {
  30. case nil:
  31. return &data, nil
  32. case monc.ErrNotFound:
  33. return nil, ErrNotFound
  34. default:
  35. return nil, err
  36. }
  37. }

删除

  1. DeleteOne
  1. 函数签名:
  2. DeleteOne func(ctx context.Context, key string, filter interface{},
  3. opts ...*mopt.DeleteOptions) (int64, error)
  4. 说明:
  5. 1. 删除单条记录,同时会清理 key 缓存
  6. 入参:
  7. 1. ctx: context
  8. 2. key: 缓存 key
  9. 3. filter: 查询条件
  10. 4. opts: 操作选项
  11. 返回值:
  12. 1. int64: 删除个数
  13. 2. error: 操作结果
  14. 示例:
  15. var prefixUserCacheKey = "cache:user:"
  16. type User struct {
  17. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  18. Name string `bson:"name,omitempty" json:"name,omitempty"`
  19. Age int `bson:"age,omitempty" json:"age,omitempty"`
  20. // TODO: Fill your own fields
  21. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  22. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  23. }
  24. func (m *defaultUserModel) Delete(ctx context.Context, id string) error {
  25. oid, err := primitive.ObjectIDFromHex(id)
  26. if err != nil {
  27. return ErrInvalidObjectId
  28. }
  29. key := prefixUserCacheKey + id
  30. _, err = m.conn.DeleteOne(ctx, key, bson.M{"_id": oid})
  31. return err
  32. }
  1. DeleteOneNoCache
  1. 函数签名:
  2. DeleteOneNoCache func(ctx context.Context, filter interface{},
  3. opts ...*mopt.DeleteOptions) (int64, error)
  4. 说明:
  5. 1. 删除单条记录,同时会清理 key 缓存
  6. 入参:
  7. 1. ctx: context
  8. 2. filter: 查询条件
  9. 3. opts: 操作选项
  10. 返回值:
  11. 1. int64: 删除个数
  12. 2. error: 操作结果
  13. 示例:
  14. type User struct {
  15. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  16. Name string `bson:"name,omitempty" json:"name,omitempty"`
  17. Age int `bson:"age,omitempty" json:"age,omitempty"`
  18. // TODO: Fill your own fields
  19. UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
  20. CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
  21. }
  22. func (m *defaultUserModel) Delete(ctx context.Context, id string) error {
  23. oid, err := primitive.ObjectIDFromHex(id)
  24. if err != nil {
  25. return ErrInvalidObjectId
  26. }
  27. _, err = m.conn.DeleteOneNoCache(ctx, bson.M{"_id": oid})
  28. return err
  29. }