当前位置: 首页 > news >正文

极客兔兔Gee-Cache Day6

+ `缓存雪崩`:缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。缓存雪崩通常因为缓存服务器宕机、缓存的 key 设置了相同的过期时间等引起。+ `缓存穿透`:查询一个不存在的数据,因为不存在则不会写到缓存中,所以每次都会去请求 DB,如果瞬间流量过大,穿透到 DB,导致宕机。+ `缓存击穿`:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到 DB ,造成瞬时DB请求量大、压力骤增。+ `day6`实现`singleflight`,为了防止缓存穿透,这里采取的策略是只放一个请求去访问db,其他的请求被go的同步机制`(sync.waitGroup)`阻塞,`call`结构体用于描述单个请求,`Group`结构体管理所有的请求,最后将`singleflight`集成到`gee.Group`中,并在`load()`函数中使用+ ```gopackage singleflightimport "sync"// 请求结构体type call struct {wg  sync.WaitGroup // 同步信号量val interface{}    // 请求值err error}// 管理所有的请求type Group struct {mu sync.Mutex       // 互斥锁m  map[string]*call // 管理每个key对应的请求}func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) {g.mu.Lock()if g.m == nil {g.m = make(map[string]*call)}if c, ok := g.m[key]; ok { // 当前对这个key的请求已经存在g.mu.Unlock()c.wg.Wait() // 其他的请求会被阻塞在这,等待第一个请求获取值return c.val, c.err}c := new(call)c.wg.Add(1)  // 同步信号量g.m[key] = c // 绑定对这个key的请求g.mu.Unlock()c.val, c.err = fn()c.wg.Done() // 已经获取数据,其他请求可以获取这个请求的值g.mu.Lock() // 互斥delete(g.m, key)g.mu.Unlock()return c.val, c.err}```

http://www.mrgr.cn/news/46444.html

相关文章:

  • qt QPainter setViewport setWindow viewport window
  • IntelliJ IDEA 优化设置
  • android刷机
  • 《Spring Framework实战》6:核心技术 4.1.IoC 容器
  • shell脚本回顾1
  • LeetCode:216.组合总和III
  • 单片机(学习)2024.10.9
  • 《基于FreeRTOS的STM32超声波智能避障平衡小车,实现了小车的自平衡、超声波避障以及通过智能手机远程控制的功能》+源代码+文献资料+文档说明
  • 【AI知识点】泛化(Generalization)与过拟合(Overfitting)
  • 安全帽未佩戴预警系统 劳保防护用品穿戴监测系统 YOLO
  • RK3588S系统导出和烧入新板子
  • 服务器平均响应时间和数据包大小关系大吗?
  • 3.1 显示层技术演变
  • 自由学习记录(4)
  • level2高频tick数据获取以及策略分享
  • HBase中的Write-Ahead Log 详解
  • 自动猫砂盆是养猫新型智商税吗?测评2024年热门款智能猫砂盆分享
  • 【springboot9735】基于springboot+vue的车辆充电桩
  • java异常详解
  • vue3 vue2
  • Oceanbase学习之—docker下oceanbase部署体验
  • 从零开始:网页在线制作入门指南
  • 基于SpringBoot+Vue+Uniapp的仓库点单小程序的详细设计和实现
  • k8s的pod管理及优化
  • 零基础入门大模型,只看这5本就够了!
  • CI/CD 和 DevOps 工具概述:Jenkins 、Docker 的概述、工作流程、对比