再谈缓存

2023-11-15

凡是涉及管理数据的系统,都可以用图书馆来考虑,都要面临图书的位置查找和实际摆放两个问题,对应的两大组件就是就是index + store,所有的数据管理系统都包含这两部分。

缓存从过期又什么触发的角度分为容量触发和时间触发,

容量触发,就是缓存满了,需要换出一些空间,按换出策略又分为

LRU

LFU

TTL到期触发,又分为

1)固定TTL的过期,比如httpSession

2)每个项目单独指定TTL的过期,每个数据item单独指定过期时间


最基本的缓存可以只用一个map,index直接指向数据的物理地址(Object 的reference)。更general的情况是存一个locator,这个locator交给store能直接返回数据。因为缓存需要过期策略支持,不同的策略底层存放数据的方式也不同,比如FIFO就是用一个list按创建时间排队就好,缓存满了就过期队头;LRU在此之上,还要支持访问一次就从队列中间移动到队尾。

对于LFU,经典的做法是用一个key为访问次数的最小堆,访问一次freq ++, 然后 调整堆,堆顶永远是访问次数最少的item。get(), put()都是O(lgn)的。还有一种O(1)的方法, 利用freq每次只是++的特点,一个freq一个节点,挂一个访问次数为freq的数据节点的list,一个数据项被访问了,就把它移到freq->next下的list,如果freq->next 不是freq + 1,就创建之。具体方法见http://ju.outofmemory.cn/entry/50447


对于FIFO和LRU,底层的store结构都是list,从OO的角度,ExpireStrategy可以建立在store之上,看以是看作是内部的housekeeping,Index -> Store <-ExpireStrategy。对于FIFO,get(Key)的时候,没有什么额外的housekeeping工作, 对于LRU,则需要把那个被访问的Item移动到队尾。


 对于LFU,需要专门的store结构支持,OO的模型是 Index -> Store ->LFUStore


还有一种定时过期缓存, 在Session实现那篇文章讨论过,如果是都是一样的TTL(time to live),比如httpSession都是30分钟,则也是用list排队,和LRU类似,只是过期不是由缓存满触发,而是时间,要多存个时间戳,可以单独线程check也可以在每次操作时候顺带看看队头是否过期,反正是O(1)的。如果每个Item的可以单独指定TTL,那么就得用stl::set或者最小堆,维护最早due的Item. Java的DelayQueue就是专门干这个的。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

再谈缓存 的相关文章

  • OOD七大原则

    1 单一职责原则 xff08 Single Responsibility Principle xff09 一个类或一个接口只有一个职责 xff0c 有且仅有一个原因引起变化 2 开闭原则 xff08 Open Closed Principl
  • 自己动手写一个key value store

    一涉及到persistent 哪怕只是最基本的需求 很多人都会依赖数据库 或是其他现成的库或工具 确实 对于文件 大部分人很少直接打交道 或者只是诸如整体反序列化 序列化 按行读取 append new line等有限的操作 一个persi
  • random_queue:支持push, popRamdom的数据结构

    pop哪一个元素 决定了queue stack priority queue的不同 新加一个random queue 等概率的从集合里取出一个元素pop 1 先用rand int l int r 得到一个随机位置 2 和top交换 3 to
  • 二叉树 level order 遍历问题汇总

    一 如何确定层结束 1 维护一个levelEnd 如果当前结点等于level end 更新levelEnd 为queue back 注意先判断queue是否empty 最后一层结束后 queue就空了 2 维护一个curLevelNum 和
  • 电梯系统OO设计

    理论上应该先黑盒用例 分析需要求 系统边界的输入输出 再白盒类图 但是对于现实世界模拟的OO 个人感觉先emulate现实世界 初步识别类和类之间的关系 再用用例和顺序图丰富 修正类图 识别类 最主要的原则是封装 数据和数据的操作封装成一个
  • 算法的三种练习

    除了具体写代码 做这些练习 1 循环不变式 用循环不变式去解释算法 2 递归 动归的 递推式 3 搜索问题的隐式图构造 隐式树还是图 一个前驱 多个前驱 点是什么 边是什么 怎么扩展
  • 最少砝码问题(用一部分数的和/差表示区间上所有的整数)

    问题1 需要表示 1 N 的所有重量 最少需要多少砝码 答案 需要 1 2 4 ceiling logN 每个砝码代表二进制数的一位 N有ceiling logN 个二进制位 问题2 需要表示 1 N 的所有重量 手头已有一些砝码 问 怎样
  • 一致性的3种协议,并发,事务

    Two Phase Commit MVCC Paxos TPC对应于传统数据库上的local cluster的一致性 分布式事务 每个节点上的local事务可以是不同的亦可以是相同的 replica MVCC的思想是抓住Transactio
  • 一个完整的语法分析、词法分析例子——Universal Pasrser

    需求 用户用formal notation指定语法 词法 然后可以匹配相应的文本 用法类似正则表达式 只需给出formal notation 不需要为每一种格式的文本单独写匹配器 formal notation主要是3个部分 1 BNF 列
  • 算法也要面向对象OO

    直接去模糊的去写 通过调试 一步步改 就算最后写出来了也不知道怎么写出来的 一定要先有整体思路 面向操作会很凌乱 算法也要面向对象 识别出变量 定义有确切含义的变量 以及这边变量之间互动的关系 时刻维护变量意义的正确性 也就是invaria
  • 搜索提示是如何实现的

    经典的想法就是一个Trie的 keysWithPrefix 问题 更高级的 进一步考察 keysWithPrefix需要做prefix下的inOrder遍历 但是每当用户type下一个字符 那个提示列表瞬间就显示出来了 不像是遍历很大一棵树
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • 面向对象课程学习

    设计一般流程 黑盒 1用例分析 白盒 2 识别类 分析阶段只identify 问题领域的类 设计阶段可能添加软件世界特有的类 或者 3 识别类之间的关系 关联 泛化 聚合 组合 依赖 4 画顺序图 结合用例图 完善类图 类图是结构设计 顺序
  • redis中hashtable 的 rehash/ resizing 策略

    依赖于连续存储的数据结构 具体的 就是依赖array 都有一个resizing问题 对于vector 一般的策略就是满的时候double and copy 降到1 4时候 halve and copy Hashtable也可以这么做 均摊的
  • 双向BFS搜索和A*算法

    双向BFS适合给出起点和终点 求最短路径的问题 分别从起点和终点扩展 找交点 每次选择待扩展节点少的那个方向进行扩展 一次扩展一层 扩展一个节点的时候 如果节点也在另一个方向的待扩展队列里 找到交点 int doubleBFS vector
  • 打表法经典2题:小于n的质数和第k个丑数

    1 求小于n的所有质数 1 开一个大小为n的bool数组A 下标代表整数 值true代表被mark过 有因子 非素数 2 i 从 2开始到n 1 如果A i 没被mark A i 就是质数 然后mark有A i 因子的数 2 A i 3 A
  • 面向对象OO 设计、架构终极理解, 以及如何学习一个领域

    程序就是一些互相引用的内存快 互相发消息 每个内存块就是一个状态机 状态的迁移规则是定制好的一些消息 方法 构造函数用来初始化状态 一个内存块的方法除了改变自身状态 也有可能向引用的别内存快发消息 引起别的内存块发生状态转移 重点不在过程化
  • mds的 labelIndex 静态预排序

    一般排序是数据 doc resultItem 取出来之后 按某个某个字段的值排序 也就是必须拿到doc resultItem之后才能排序 mds排序的特点是在取resultItem之前就排序 不是对resultItem排序 而是对docId
  • 再谈缓存

    凡是涉及管理数据的系统 都可以用图书馆来考虑 都要面临图书的位置查找和实际摆放两个问题 对应的两大组件就是就是index store 所有的数据管理系统都包含这两部分 缓存从过期又什么触发的角度分为容量触发和时间触发 容量触发 就是缓存满了
  • 有限自动机总结

    有限自动机A用来识别字符串 它由5部分组成 1 alphabet 字符集 2 states 状态集合 3 init 初始状态 4 trans s ch 状态转移函数 5 end 可接受state 集合 A str true的意思是 A可以接

随机推荐

  • 求最小生成树——Kruskal算法和Prim算法

    给定一个带权值的无向图 要求权值之和最小的生成树 常用的算法有Kruskal算法和Prim算法 这两个算法其实都是贪心思想的使用 但又能求出最优解 代码借鉴http blog csdn net u014488381 一 Kruskal算法
  • Java中构造方法的继承问题

    1 父类的构造方法是不会被子类继承的 但是子类的构造方法中会有一个隐式的super 来调用父类中的无参数构造方法 验证代码如下 public class FatherClass int a int b public FatherClass
  • 图解ARP协议(四)代理ARP:善意的欺骗

    首发于 跟杰哥学网络与安全 写文章 登录 图解ARP协议 四 代理ARP 善意的欺骗 拼客学院陈鑫杰 24 天前 一 代理ARP概述 我 当电脑要访问互联网上的服务器 目标MAC是什么 很多小伙伴在刚学习网络协议的时候 经常这样直接回应 不
  • [413]notepad把多行转换为一行和内容去重

    文章目录 notepad中如何把多行转换为一行 notepad 文件内容去重 notepad中如何把多行转换为一行 ctrl f 然后替换 扩展按钮 or 正则表达式 先 n 替换为空 后 r 替换为空 notepad 文件内容去重 方法1
  • PyCharm中无法调用numpy,报错ModuleNotFoundError: No module named ‘numpy‘

    原因分析 pycharm所使用的解释器并不是已经安装的python3 6 而是自带了python exe解释器 解决方法 在PyCharm的settings File gt settings gt project 当前项目名 gt Proj
  • idea配置jdbc连接MySQL的全部详细步骤(包含运行代码)

    前言必读 读者手册 必读 云边的快乐猫的博客 CSDN博客 一 导包 1 打开idea 在左上角找到当前使用的这个模块 右键打开新建一个Directory 2 这个目录包命名为lib 3 在本地磁盘中找到下载的MySQL的这个jar包 点击
  • vscode常用插件-Auto Close Tag

    1 插件作者 Jun Han 2 作用 自动补全结束标签 输入
  • seata分布事务

    Seata是什么 官网解释 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 为用户打造一站式的分布式解决方案 用咱们理解的说 s
  • [Pandas]Dataframe中的多条件切片为什么不能使用and运算符

    对于Dataframe中同一列 如果有多个条件 则不能使用and运算符 需要使用 位运算符 示例如下 import pandas as pd df pd DataFrame name a a b b classes 1 2 3 4 pric
  • [哲学部分]马克思主义基本原理概论思维导图

    2020 3 3 更新 之前链接关了补一个 链接 https pan baidu com s 1tsmAkdRG7jE1eMz34Ea4qQ 提取码 7y2j 2019 10 23 更新 由于最近比较忙 没时间一一回复大家的评论和邮件 我把
  • 用选择法对数组中n个整数按由小到大排序

    include
  • 判断python字典中key是否存在的两种方法

    今天来说一下如何判断字典中是否存在某个key 一般有两种通用做法 下面为大家来分别讲解一下 第一种方法 使用自带函数实现 在python的字典的属性方法里面有一个has key 方法 这个方法使用起来非常简单 在python的字典的属性方法
  • 前几天面了个30岁左右的测试员,年薪50w问题基本都能回答上,必是刷了不少八股文···

    互联网行业竞争是一年比一年严峻 作为测试工程师的我们唯有不停地学习 不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水 进入心仪的企业 阿里 字节 美团 腾讯等大厂 所以 大家就迎来了一堆问题 自己目前的能力能不能够支撑自己晋升 如果
  • 2022年11月26日-12月15日(CesiumGeospatial源码抄写+其他视频教程,本周10小时,合计1757小时,剩余8243小时)

    远程办公中 目前 视频教程进行到了mysql 7 1 tf1 4 4 oss 12 1 蓝图反射 1 7 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 41 按照月计划 制定周计划如下 1 cesi
  • 关于浏览器主页被https://hao.360.com/?src=lm&ls=n78852a3c9b劫持

    一 起因 是我的vscode不支持html文件夹右键用vscode打开 后来百度了下 有两种方法 一种是重新下载vscode 一种是在注册表注册vscode信息 鉴于我的vscode里用很多插件了 懒得再下载就决定使用第二种方法 结果设置到
  • java学习路线

    阶段一 第一阶段 Java 基础 第二阶段 数据库 第三阶段 Java Web 第四阶段 主流框架 第五阶段 服务器中间件 第六阶段 微服务和分布式 第七阶段 练手项目 第一阶段 Java 基础 最开始要学习的是 Java 基础 学习了这部
  • Java实现一个简单的Kafka消息测试程序

    记录一下最近做的一个小程序 模拟很多辆车不定时上报里程等状态数据到Kafka 从而对后端的批处理应用进行性能测试 车辆的上报消息是JSON格式 假设包含如下字段 telemetry engineStatus 1 odometer 120 d
  • Always On 数据库无法自动同步的问题

    问题 在给客户的SQL Server 2019 配置好Always On 之后 不久就出现高可用组里的一个库无法正常同步 第一次出现 以为是偶发性问题 直接右键点击恢复数据同步 没一会就同步好了 过了一个月问题又出现了 这次右键恢复数据同步
  • 计算机网络 概念

    一 计算机网络概念 计算机网络的组成 有若干个节点和连接的节点的链路组成 主机的概念 与网络相连接的计算机称为主机 计算机网络 是一个将分散的 具有独立功能的计算机系统 通过通信设备和线路 由功能完善的软件实现资源共享和信息传递 计算机网络
  • 再谈缓存

    凡是涉及管理数据的系统 都可以用图书馆来考虑 都要面临图书的位置查找和实际摆放两个问题 对应的两大组件就是就是index store 所有的数据管理系统都包含这两部分 缓存从过期又什么触发的角度分为容量触发和时间触发 容量触发 就是缓存满了