news 2026/4/17 22:14:26

4.2 缓存策略与多级缓存:如何减少90%的数据库访问?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.2 缓存策略与多级缓存:如何减少90%的数据库访问?

4.2 缓存策略与多级缓存:如何减少90%的数据库访问?

在高并发的分布式系统中,数据库往往是性能瓶颈之一。通过合理的缓存策略和多级缓存架构,我们可以显著减少数据库访问次数,提升系统响应速度和吞吐量。本节将深入探讨缓存策略的设计与实现,以及如何构建高效的多级缓存系统。

缓存基础概念

缓存的作用

缓存的主要作用是存储热点数据,减少对后端存储系统的访问压力,从而提高系统性能。合理的缓存策略可以带来以下好处:

  1. 提升响应速度:缓存数据通常存储在内存中,访问速度远快于磁盘数据库
  2. 降低数据库负载:减少数据库查询次数,提升数据库处理能力
  3. 提高系统吞吐量:并行处理更多请求
  4. 增强系统可用性:在数据库故障时提供降级服务

缓存策略

常见的缓存策略包括:

  1. Cache-Aside Pattern(旁路缓存):应用代码负责维护缓存
  2. Read-Through/Write-Through:缓存层负责数据加载和存储
  3. Write-Behind:异步更新后端存储

本地缓存实现

本地缓存是存储在应用进程内的缓存,访问速度最快,但容量有限且无法共享。

// LocalCache 本地缓存typeLocalCachestruct{// 缓存数据datamap[string]*CacheItem// LRU链表lruList*list.List// 缓存键到链表元素的映射elementMapmap[string]*list.Element// 缓存容量capacityint// 互斥锁mutex sync.RWMutex// 统计信息stats*CacheStats}// CacheItem 缓存项typeCacheItemstruct{// 键Keystring// 值Valueinterface{}// 过期时间ExpireAt time.Time// 创建时间CreatedAt time.Time// 访问次数AccessCountint64}// CacheStats 缓存统计信息typeCacheStatsstruct{// 总请求数Requestsint64// 命中数Hitsint64// 未命中数Missesint64// 命中率HitRatefloat64// 删除数Evictionsint64}// NewLocalCache 创建本地缓存funcNewLocalCache(capacityint)*LocalCache{return&LocalCache{data:make(map[string]*CacheItem,capacity),lruList:list.New(),elementMap:make(map[string]*list.Element),capacity:capacity,stats:&CacheStats{},}}// Get 获取缓存项func(lc*LocalCache)Get(keystring)(interface{},bool){lc.mutex.RLock()deferlc.mutex.RUnlock()// 更新统计信息atomic.AddInt64(&lc.stats.Requests,1)// 查找缓存项item,exists:=lc.data[key]if!exists{atomic.AddInt64(&lc.stats.Misses,1)returnnil,false}// 检查是否过期if!item.ExpireAt.IsZero()&&time.Now().After(item.ExpireAt){// 删除过期项lc.mutex.RUnlock()lc.mutex.Lock()lc.deleteExpiredItem(key)lc.mutex.Unlock()lc.mutex.RLock()atomic.AddInt64(&lc.stats.Misses,1)returnnil,false}// 更新LRU链表ifelement,exists:=lc.elementMap[key];exists{lc.lruList.MoveToFront(element)item.AccessCount++}atomic.AddInt64(&lc.stats.Hits,1)returnitem.Value,true}// Set 设置缓存项func(lc*LocalCache)Set(keystring,valueinterface{},ttl time.Duration){lc.mutex.Lock()deferlc.mutex.Unlock()// 检查缓存是否已满iflen(lc.data)>=lc.capacity{// 淘汰最久未使用的项lc.evict()}// 创建缓存项item:=&CacheItem{Key:key,Value:value,CreatedAt:time.Now(),AccessCount:1,}ifttl>0{item.ExpireAt=time.Now().Add(ttl)}// 添加到缓存lc.data[key]=item// 添加到LRU链表element:=lc.lruList.PushFront(key)lc.elementMap[key]=element}// Delete 删除缓存项func(lc*LocalCache)Delete(keystring){lc.mutex.Lock()deferlc.mutex.Unlock()delete(lc.data,key)ifelement,exists:=lc.elementMap[key];exists{lc.lruList.Remove(element)delete(lc.elementMap,key)}}// evict 淘汰缓存项func(lc*LocalCache)evict(){// 从LRU链表尾部删除最久未使用的项ifelement:=lc.lruList.Back();element!=nil{key:=element.Value.(string)delete(lc.data,key)lc.lruList.Remove(element)delete(lc.elementMap,key)atomic.AddInt64(&lc.stats.Evictions,1)}}// deleteExpiredItem 删除过期项func(lc*LocalCache)deleteExpiredItem(keystring){delete(lc.data,key)ifelement,exists:=lc.elementMap[key];exists{lc.lruList.Remove(element)delete(lc.elementMap,key)}}// Stats 获取缓存统计信息func(lc*LocalCache)Stats()*CacheStats{lc.mutex.RLock()deferlc.mutex.RUnlock()requests:=atomic.LoadInt64(&lc.stats.Requests)hits:=atomic.LoadInt64(&lc.stats.Hits)hitRate:=0.0ifrequests>0{hitRate=float64(hits)/float64(requests)}return&CacheStats{Requests:requests,Hits:hits,Misses:atomic.LoadInt64(&lc.stats.Misses),HitRate:hitRate,Evictions:atomic.LoadInt64(&lc.stats.Evictions),}}// Clear 清空缓存func(lc*LocalCache)Clear(){lc
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:08:24

用 CANN ops-nn 提升 AI 性能:实操技巧与核心逻辑拆解

在昇腾 AI 生态中,CANN(Compute Architecture for Neural Networks)是核心的异构计算架构,而 ops-nn 作为 CANN 针对神经网络算子的核心组件,直接决定了 AI 模型在昇腾硬件上的运行效率。本文将从核心逻辑、实操技巧、…

作者头像 李华
网站建设 2026/4/18 2:07:24

思考是用来解决问题和总结经验的,而不是用来制造障碍的:不为打翻的牛奶哭泣底层逻辑是,哭泣仅仅是情绪表达,不是在解决问题,我们应该想的是尽快打扫不要扎到脚

别让思考,变成困住你的墙:从内耗到破局的底层逻辑 目录 别让思考,变成困住你的墙:从内耗到破局的底层逻辑一、两种思考,两种人生:你在破局,还是在筑墙?1. 制造障碍的思考&#xff1a…

作者头像 李华
网站建设 2026/4/17 12:28:06

【小程序毕设全套源码+文档】基于Android的陪诊护理系统APP的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 2:08:01

本科生必看!万众偏爱的AI论文网站 —— 千笔ai写作

你是否曾为论文选题发愁,反复修改却总不满意?是否在查重和格式上耗费大量时间,却仍难达标?论文写作的每一步都像一场硬仗,让无数本科生倍感压力。而千笔AI,正是为了解决这些难题而生。它集智能写作、文献检…

作者头像 李华
网站建设 2026/4/18 3:50:02

Docker Desktop

1. 他是什么 可以把 Docker Desktop 想象成一个在个人电脑上创建和管理“标准化软件集装箱”的工具。在现实生活中,集装箱无论用哪艘船运输、用哪种卡车搬运,里面的货物都不会受影响,也无需关心外面的环境。Docker Desktop 就是这样一个为你…

作者头像 李华