极客兔兔Gee-Cache Day1

server/2024/12/22 1:15:12/

极客兔兔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中的数据,实现查找、删除、增加、修改功能

  • 代码

    • go">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.ppmy.cn/server/126811.html

相关文章

zy87_C#中基于流的try-catch-finally结构;利用委托进行文件处理的封装;using语句进行流的处理

文章目录 1.基于流的try-catch-finally结构1.1程序代码 2.利用委托进行文件处理的封装2.1 程序代码2.2 代码解释委托定义Main 方法UniversalFileProcess 方法DoSomething 方法 3.using语句进行流的处理3.1程序代码3.2代码解释 1.基于流的try-catch-finally结构 1.1程序代码 s…

远程分支与本地分支上传内容

title: 远程分支与本地分支上传内容 date: 2024-09-29 16:25:15 tags: git 1.创建远程分支 2.在本地查看远程分支 git remote show origin 3.将远程分支拉到本地 git fetch origin4.创建本地分支 这个分支是基于远程分支创建的&#xff0c;分支名可以和远程分支名一样 gi…

Pikachu-Sql-Inject -基于boolian的盲注

基于boolean的盲注: 1、没有报错信息显示&#xff1b; 2、不管是正确的输入&#xff0c;还是错误的输入&#xff0c;都只显示两种情况&#xff0c;true or false&#xff1b; 3、在正确的输入下&#xff0c;输入and 1 1/and 1 2发现可以判断&#xff1b; 布尔盲注常用函数&…

数据结构:并查集

数据结构&#xff1a;并查集 并查集原理实现框架初始化合并查询获取成员路径压缩其它 总代码 并查集 在生活中&#xff0c;经常会出现分组问题。比如一个班级分为多个小组&#xff0c;打篮球分为两方等等。在同一个组中的所有成员&#xff0c;就构成一个集合。对这种一个群体分…

pytorch中的TensorDataset和DataLoader

TensorDataset 详解 TensorDataset 主要用于将多个 Tensor 组合在一起&#xff0c;方便对数据进行统一处理。它可以用于简单地将特征和标签配对&#xff0c;也可以将多个特征张量组合在一起。 1. 将特征和标签组合 假设我们有一组图像数据&#xff08;特征&#xff09;和对应…

Unity初识+面板介绍

Unity版本使用 小版本号高&#xff0c;出现bug可能性更小&#xff1b;一台电脑可以安装多个版本的Unity&#xff0c;但是需要安装在不同路径&#xff1b;安装Unity时不能有中文路径&#xff1b;Unity项目路径也不要有中文。 Scene面板 相当于拍电影的片场&#xff0c;Unity程…

开发微信小程序 基础03

WXSS(类似CSS) 定义&#xff1a; WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML的组件样式&#xff0c;类似于网页开发中的 CSS。 分类&#xff1a; 全局样式&#xff1a;定义在 app.wxss 中的样式为全局样式&#xff0c;作用于每一个页面 局部样式&…

Linux——环境变量

文章目录 1.什么是环境变量2.常见环境变量3. 如何查看环境变量4. 测试PATH5.测试HOME6. 和环境变量有关的指令7.环境变量的组织方式8. 通过代码获取环境变量main函数的第3个参数 9. 环境变量具有全局属性 当我们在Linux操作系统进行操作时&#xff0c;我们会发现使用系统命令的…