小说软件源码的缓存设计,保证服务的正常执行

小说软件源码缓存设计原理

小说软件源码对缓存是只删除,不做更新,一旦DB里数据出现修改,我们就会直接删除对应的缓存,而不是去更新。

我们看看删除缓存的顺序怎样才是正确的。

  • 先删除缓存,再更新DB
    小说软件源码的缓存设计,保证服务的正常执行
  • 先更新DB,再删除缓存
    小说软件源码的缓存设计,保证服务的正常执行
    让我们再来看一下正常的请求流程:

1、第一个请求更新DB,并删除了缓存
2、第二个请求读取缓存,没有数据,就从DB读取数据,并回写到缓存里
3、后续读请求都可以直接从小说软件源码缓存读取

小说软件源码的缓存设计,保证服务的正常执行
查询单条完整行记录,如图
小说软件源码的缓存设计,保证服务的正常执行

小说软件源码缓存代码解读

1. 基于主键的缓存逻辑

小说软件源码的缓存设计,保证服务的正常执行

2. 基于唯一索引的缓存逻辑

因为这块比较复杂,所以我用不同颜色标识出来了小说软件源码响应的代码块和逻辑,block 2 其实跟基于主键的缓存是一样的,这里主要讲 block 1 的逻辑。

小说软件源码的缓存设计,保证服务的正常执行

我们来看一个实际的例子

func (m *defaultUserModel) FindOneByUser(user string) (*User, error) {  var resp User  // 生成基于索引的key  indexKey := fmt.Sprintf("%s%v", cacheUserPrefix, user)err := m.QueryRowIndex(&resp, indexKey,    // 基于主键生成完整数据缓存的key    func(primary interface{}) string { return fmt.Sprintf("user#%v", primary)    },    // 基于索引的DB查询方法    func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where user = limit 1", userRows, m.table) if err := conn.QueryRow(&resp, query, user); err != nil {return nil, err } 来源:云豹科技程序猿
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年11月8日
下一篇 2021年11月8日

相关推荐