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

极客兔兔Gee-Cache Day1

极客兔兔7Days

GeeCache

- Day1
  • interface{}:任意类型

  • 缓存击穿:一个高并发的请求查询一个缓存中不存在的数据项,因此这个请求穿透缓存直接到达后端数据库或数据源来获取数据。如果这种请求非常频繁,就会导致后端系统的负载突然增加,可能会使数据库或数据源响应变慢甚至宕机,从而影响整个系统的性能和稳定性。

    • 解决1:设置热点数据永不过期
    • 解决2:使用锁机制确保只有一个请求去访问数据库,其他的请求等待这个请求的结果
    • 解决3:设置时间更长的二级缓存
  • 缓存淘汰策略

    • FIFO:先进先出,也就是淘汰缓存中最老(最早添加)的记录
    • LFU:最少使用,也就是淘汰缓存中访问频率最低的记录
    • LRU:最近最少使用,相对于仅考虑时间因素的 FIFO 和仅考虑访问频率的 LFU,LRU 算法可以认为是相对平衡的一种淘汰算法。
  • list常用方法New()PushFront(v interface{}) *ElementPushBack(v interface{}) *ElementRemove(e *Element) interface{}Front() *ElementBack() *ElementNext() *ElementPrev() *Element

  • 使用list和map实现,cache中记录缓存最大容量和当前数据大小,对于刚访问的元素,将其移到list的最头部,表示最近刚使用过,删除时选择最尾部的数据进行删除,entry实际是list的节点数据类型,在删除对应节点后,同时删除map中的数据,实现查找、删除、增加、修改功能

  • 代码

    • package geeimport "container/list"type Cache struct {maxBytes int64nbytes   int64ll       *list.Listcache    map[string]*list.Element
      }type entry struct {key   stringvalue Value
      }type Value interface {Len() int
      }func New(maxBytes int64) *Cache {return &Cache{maxBytes: maxBytes,ll:       list.New(),nbytes:   0,cache:    make(map[string]*list.Element),}
      }// 查找
      func (c *Cache) Get(key string) (value Value, ok bool) {if ele, ok := c.cache[key]; ok {// 假设头部是队尾c.ll.MoveToFront(ele)kv := ele.Value.(*entry)return kv.value, true}return nil, false
      }// 删除
      func (c *Cache) Delete() {ele := c.ll.Back()if ele != nil {c.ll.Remove(ele)// 类型断言kv := ele.Value.(*entry)delete(c.cache, kv.key)c.nbytes -= int64(len(kv.key)) + int64(kv.value.Len())}
      }// 添加
      func (c *Cache) Add(key string, value Value) {if ele, ok := c.cache[key]; ok {c.ll.MoveToFront(ele)kv := ele.Value.(*entry)c.nbytes += int64(value.Len()) - int64(kv.value.Len())kv.value = value} else {ele := c.ll.PushFront(&entry{key, value})c.nbytes += int64(len(key)) + int64(value.Len())c.cache[key] = ele}for c.maxBytes != 0 && c.maxBytes < c.nbytes {c.Delete()}
      }func (c *Cache) Len() int {return c.ll.Len()
      }
      
http://www.lryc.cn/news/452356.html

相关文章:

  • [MAUI]数据绑定和MVVM:MVVM的属性验证
  • 2024年水利水电安全员考试题库及答案
  • 【快速删除 node_modules 】rimraf
  • 毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序
  • 13-指针和动态内存-内存泄漏
  • 基于深度学习的视频摘要生成
  • 适合初学者的[JAVA]: 基础面试题
  • internal.KaptWithoutKotlincTask$KaptExecutionWorkAction 问题 ---Room数据库
  • Frequency-aware Feature Fusion for Dense Image Prediction 论文阅读
  • Springboot + netty + rabbitmq + myBatis
  • 电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?
  • 数据可视化基础:让数据说话
  • 有哪些优化数据库性能的方法?如何定位慢查询?数据库性能优化全攻略:从慢查询定位到高效提升
  • C语言 | Leetcode C语言题解之第450题删除二叉搜索树中的节点
  • 智慧防灾,科技先行:EasyCVR平台助力地质灾害视频监测系统建设
  • 掌握C#核心概念:类、继承、泛型等
  • [VULFOCUS刷题]tomcat-pass-getshell 弱口令
  • golang rpc
  • A Learning-Based Approach to Static Program Slicing —— 论文笔记
  • 掌握 C# 中的委托与事件机制
  • 使用微服务Spring Cloud集成Kafka实现异步通信(消费者)
  • docker pull 超时Timeout失败的解决办法
  • YOLOv7改进之主干DAMOYOLO结构,结合 CReToNeXt 结构,打造高性能检测器
  • 进度条(倒计时)Linux
  • [每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别
  • 河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例
  • 22.1 k8s不同role级别的服务发现
  • OpenCV计算机视觉库
  • CentOS 系统中的文件挂载 U 盘
  • Lumerical脚本语言-变量操作(Manipulating variables)