缓存在各个计算机系统中运用广泛,成本也不会太高。 所以深入学习一下缓存系统的设计与实现
常见缓存实现模式
Cache-Side
请求数据时如下图
数据发生更新时,应该先对数据库进行更新再删除缓存,缓存可能在并发情况下会有读到脏数据的情况。
但是相比于先删缓存在更新数据库而言,如果并发下读取了数据库,会将数据结果更新到缓存中去,于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了
Write/Read-Through Cache
读写数据都经过缓存,提高高频数据的读取能力,如果缓存中存在就直接返回,避免了大量请求直接打到数据库上,减轻了数据库的压力,也提高了系统响应速度 其实Write和Read可以进行分开再讨论的,但是对单独使用其中的设计还比较生疏,后面有机会再补充学习 (;´д`)ゞ
Write Behind Caching Pattern
缓存写回策略,对数据的读写完全应用在缓存里,实际的持久化在异步去执行,这使得数据的实际操作速度很快,毕竟所有操作都在缓存中进行的嘛,就要看异步的更新到数据库的设计怎么实现了,但是对缓存的可用性很高,如果缓存出了点问题或者突发情况,数据就会发生丢失,毕竟没有将缓存中的数据持久化到数据库中去。
实践运用与总结
结合Redis和Mysql在Go下使用缓存设计
go get -u github.com/go-redis/redis/v9
go get -u gorm.io/gorm
//初始化redis,连接地址和端口,数据库名称
func init() {
rdb := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
DB: 3,
})
}
Gorm的连接操作在上篇学习记录中已经介绍了,这里就不再赘述了
编写业务逻辑
根据具体的业务逻辑选择合适的缓存方案。
总结
基础的学习很重要,以小见大,能看出在很多场景下多多少少都会接触到操作系统和系统架构相关的设计思想,不断学习,理论指导实践,实践又完善理论。
参考学习: 缓存更新的套路