ATS缓存数据结构
ATS缓存数据结构
HttpTunnel类
数据传输驱动器(data transfer driver),包含一个生产者(producer)集合,每个生产者连接到一个或是多个消费者(comsumer)。隧道(tunnel)处理事件和缓冲区以便数据能从生产者移动到消费者,数据会尽可能保存在引用计数类型的缓冲区中。只有数据发生变动,或者在数据源(它从ATS外部获取数据)和数据接收端(它将数据发送到ATS外部)的情况下,才会发生拷贝操作。
HTTPCacheAlt类
定义在HTTP.h中,它是一个缓存对象中单个副本的元数据(metadata)。包含下面的信息:
- 副本的earliest Doc对应的Dir
- 请求头和响应头信息
- 分片偏移表(fragment offset table)
- 源站请求和响应的时间戳(timestamp)
HTTPInfo类
定义在HTTP.h中,它是HTTPCacheAlt的包装类。它提供了外部API来访问包装类内部的数据,它只含有一个指向包装类实例的指针(可能为NULL)。
CacheHTTPInfo类
HTTPInfo类的typedef。
CacheHTTPInfoVector类
定义在P_CacheHttp.h中,它是HTTPInfo对象组成的数组,充当一个对象所有副本的信息仓库。
OpenDir类
一个打开的目录项(directory entry),包括一个Dir所有的信息,外加从first Doc中获取的额外信息。
CacheVC类
接收输入数据并写到缓存中的虚拟连接类。
- int CacheVC::openReadStartHead(int event, Event *e)
执行读取一个缓存对象(cached object)的初始化工作 - int CacheVC::openReadStartEarliest(int event, Event *e)
执行读取一个缓存对象的副本(alternate)的初始化工作
CacheVol类
保存volume.config配置文件中一行的数据的类,一行表示一个缓存分卷。
CacheControlResult类
保存cache.config配置文件中一行的数据的类。
EvacuationBlock类
用于记录疏散的相关信息(record for evacuation)。
Vol类
表示cache分卷内的一个存储单元(过时的叫法storage unit,现在叫作cache strip),也叫作volume,注意跟磁盘分卷的那个volume是有区别的。
- off_t Vol::segments
缓存带中的段的个数,由该缓存带中的所有目录项(directory entry)除以一个段中的目录项数得到,是个粗略估计值。 - off_t Vol::buckets
缓存带中的桶的个数,由目录段中的所有目录项(directory entry)除以DIR_DEPTH(当前为4)得到。是个粗略估计值,按照当前的定义值,这个数大约是16384(2^16/4),目录桶用来作为索引哈希(index hash)的目标。 - DLL<EvacuationBlock> Vol::evacuate
元素为EvacuationBlock的桶组成的数组,它按照大小排序,以便每个疏散带(evacuation span)都有一个EvacuationBlock桶。 - off_t len
缓存带的字节长度。 - int Vol::evac_range(off_t low, off_t high, int evac_phase)
假如从low到high的字节带上存在任何EvacuationBlock,就开始一次疏散。假如没有疏散发生,返回0,否则返回非零值。
Doc类
在P_CacheVol.h中定义。
- uint32_t Doc::magic
校验值,对合法文档(document)设为DOC_MAGIC。 - uint32_t Doc::len
包含HTTP头长度,分片表和Doc结构体的段的长度。 - Doc::total_len
整个文档的总长度,不包含元数据,但是包含HTTP头信息。 - Doc::first_key
文档(document)的首个索引键值,用于定位cache带中的缓存对象。 - Doc::key
分片的索引键值(index key),分片键值可以通过链式方法计算,使得下一个和上一个分片的键值可以从当前键值计算出来。 - uint32_t Doc::hlen
文档头(即元数据)长度,注意不是HTTP头的长度。 - uint8_t Doc::ftype
分片类型,当前只用到CACHE_FRAG_TYPE_HTTP,其它类型用于后续缓存扩展,目前还没有实现。 - uint24_t Doc::flen
分片表(fragment table)长度,假如存在分片表的话。一个缓存对象只有first
Doc分片中才含有分片表。分片表是从第一个分片首字节开始计算时,各分片中HTTP响应内容(不包含元数据和HTTP头)的相对字节偏移所组成的列表。分片表中的第一个元素表示的是第二个分片中的字节偏移,类似于数组从索引1开始计算,因为第一个分片的字节偏移是总是0,无须计算在内。这样做的目的是为了在range请求的快速查找。假如给定first
Doc分片,包含range请求首字节的分片将会直接计算和读取,不需要更多的磁盘访问。
ATS 3.3.0之后移除了。 - uint32_t Doc::sync_serial
- uint32_t Doc::write_serial
- uint32_t pinned
钉住对象(pinned object)的标志和计时器 - uint32_t checksum
ATS缓存数据结构的更多相关文章
- ats缓存规则
一. 用户访问过程:1. ats收到一个用户对web对象的请求;2. 使用该地址, ats尝试着在其对象数据库(缓存)中用被请求对象的地址来定位该对象;3. 如果对象在缓存中, ats会检查该对象是否 ...
- c++ 实现 key-value缓存数据结构
c++ 实现 key-value缓存数据结构 概述 最近在阅读Memcached的源代码,今天借鉴部分设计思想简单的实现了一个keyvalue缓存. 哈希表部分使用了unordered_map,用于实 ...
- ats 分层缓存
了解缓存层次结构 缓存层次结构由彼此通信的缓存级别组成.ats支持多种类型的缓存层次结构. 所有缓存层次结构都识别父和子的概念. 父缓存是层次结构中较高的缓存, ats可以 将请求转发到该缓存.子缓存 ...
- CRL快速开发框架系列教程五(使用缓存)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- LeetCode之LRU Cache 最近最少使用算法 缓存设计
设计并实现最近最久未使用(Least Recently Used)缓存. 题目描述: Design and implement a data structure for Least Recently ...
- mybatis0209 二级缓存
.1二级缓存 1.1.1原理 mybatis和spring整合后一级缓存就没有了,sqlSession在不关闭的前提下2次查询就会从缓存中取,一级缓存缓存在sqlSession对象里面,当多用户查询的 ...
- Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】
Mybatis缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. myba ...
- ATS日志说明
在ATS日志中我们经常遇到形形色色的缓存结果码,为了更清晰地认识它们,相关资料整理到这里: TCP_HIT 请求对象的一份合法拷贝被缓存,ATS将发送该对象给client TCP_MISS 请求对象未 ...
- Mybatis【逆向工程,缓存,代理】知识要点
前言 本文主要讲解Mybatis的以下知识点: Mybatis缓存 一级缓存 二级缓存 与Ehcache整合 Mapper代理 使用Mapper代理就不用写实现类了 逆向工程 自动生成代码 Mybat ...
随机推荐
- 基于input子系统的sensor驱动调试(一)
要想弄明白世界的本质,就要追根溯源:代码也是一样的道理: 最近调试几个sensor驱动,alps sensor驱动.compass sensor驱动.G-sensor驱动都是一样的架构: 一.基于in ...
- [PHP] PHP服务器接口SAPI中的结构体
SAPI:在各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口.例如命令行程序的实现,Apache的mod_php模块实现以及fastcgi的实现等等 1.结构体:使用结构体(Struc ...
- 在什么情况下使用@ResponseBody 注解?
@Controller @RequestMapping("/") public class HelloController { @RequestMapping(value = &q ...
- 在visual studio的工程项目应用中打开console控制窗口
在visual studio的工程项目应用中打开console控制窗口,这个可以方便我们在console中输出参数的值检查错误. 只需要在需要打开console的地方加入下面的代码即可. AllocC ...
- ECJTUACM16 Winter vacation training #1 题解&源码
//寒假训练赛,第一次拿第一,感觉很爽哦,AC3题! A------------------------------------------------------------------------ ...
- NYoj_171聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不 ...
- HDU_5504 GT and sequence
GT and sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- three.js 入门案例
最近公司需要用tree.js实现一个3D图的显示,就看了官方文档,正好有时间,就记录下来. 由于我们公司的前端框架用的是angular,所以我就把我的treejs封装在一个directives里面.后 ...
- 在.Net中将RocketMQ跑起来_入门篇【2】
上一篇讲了如何再控制台将RocketMQ跑起来,本篇讲解,在asp.net mvc种跑起来,含(发布.订阅). 本次将不挨个贴源码,直接展示目录,根据上一篇文章,进行相应的调整即可. 1.新建一个类库 ...
- jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...