缓存管理

概述

本章节介绍 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: 连接管理对象
  2. 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: 连接管理对象
  3. 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: 创建错误
  4. 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: 创建错误
  5. 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. }
  2. 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. }
  2. 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. }
  3. 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. }
  4. 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. }
  5. 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. }
  6. 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. }
  2. 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. }
  2. 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. }