小说软件源码缓存设计原理
小说软件源码对缓存是只删除,不做更新,一旦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进行处理,非常感谢!