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)

    假如从lowhigh的字节带上存在任何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
时间: 2024-10-18 14:49:26

ATS缓存数据结构的相关文章

ats缓存规则

一. 用户访问过程:1. ats收到一个用户对web对象的请求;2. 使用该地址, ats尝试着在其对象数据库(缓存)中用被请求对象的地址来定位该对象;3. 如果对象在缓存中, ats会检查该对象是否过期,如果对象没有过期, ats以缓冲命中的方式用该对象来响应用户;4. 如果缓存中的数据已经过期, ats连接源服务器并检查该对象是否仍然可用(重新生效).如果生效,ats直接发送缓存中的对象给用户;5. 如果对象没有在缓存中(缓存未命中)或者源服务器显示缓存中的对象已经失效,ats会从源服务器重

透过ATS缓存配置看如何判断HTTP资源是否可缓存方法论

缓存有个大原则,就是在不影响用户.不触犯法律的前提下,尽量多的将资源缓存到本地.哪些HTTP资源可以cache哪些不能cache,ATS对可缓存性有一套系统的判断机制,设置灵活,可以对全局进行配置也可以对个别资源单独配置,可以针对单个url进行配置也可以针对文件后缀类型进行配置,可以对正常资源进行配置也可以对故障信息(状态码400以上)进行配置,可以对静态资源进行配置也可以对动态资源单独配置,现在就剖开看一下. 一.HTTP响应头信息缓存级别 任何cache系统大多数资源都是通过HTTP头信息来

ATS缓存概述

在volume.config里面可以配置多个volume,比如说有4块磁盘,配了3个volume.每块磁盘都有3个volume,一个磁盘的一个volume是一个stripe,stripe是磁盘级别的最小单位.stripe存着若干个存储对象,默认每个对象最小占8000字节(proxy.config.cache.min_average_object_size),每个存储对象标示为一个fragment,默认大小是1M(proxy.config.cache.target_fragment_size),每

C# ListPool 缓存数据结构

可重复使用(缓存)结构 1.利用静态类&静态方法获取某个数据结构. 2.利用静态变量在所有类成员中公用的原理,达到使用时(分情况)获取,不使用时不释放而是缓存以便下次使用的目的. 适用环境 1.该数据结构存储的数据为临时数据,短时间使用后会被释放. 2.某一帧内多次重复使用同一数据结构.(例如for循环中,当然你用循环外临时变量也是ok的) 3.某些特殊情况,比如多线程的频繁交互. 使用方式: 1.通过静态方法获取数据结构 2.用完还给静态方法(一定记住) 代码: 使用方式: private v

缓存框架Guava Cache部分源码分析

在本地缓存中,最常用的就是OSCache和谷歌的Guava Cache.其中OSCache在07年就停止维护了,但它仍然被广泛的使用.谷歌的Guava Cache也是一个非常优秀的本地缓存,使用起来非常灵活,功能也十分强大,可以说是当前本地缓存中最优秀的缓存框架之一.之前我们分析了OSCache的部分源码,本篇就通过Guava Cache的部分源码,来分析一下Guava Cache的实现原理. 在分析之前,先弄清数据结构的使用.之前的文章提到,OSCache使用了一个扩展的HashTable,作

缓存框架OSCache部分源码分析

在并发量比较大的场景,如果采用直接访问数据库的方式,将会对数据库带来巨大的压力,严重的情况下可能会导致数据库不可用状态,并且时间的消耗也是不能容忍的.在这种情况下,一般采用缓存的方式.将经常访问的热点数据提前加载到内存中,这样能够大大降低数据库的压力. OSCache是一个开源的缓存框架,虽然现在已经停止维护了,但是对于OSCache的实现还是值得学习和借鉴的.下面通过OSCache的部分源码分析OSCache的设计思想. 缓存数据结构 通常缓存都是通过<K,V>这种数据结构存储,但缓存都是应

那些年我们一起追过的缓存写法(转)

出处:http://www.codeceo.com/article/cache-01.html ------------------------------------------------------------------------------ 介绍 本篇主要说下楼主平常项目中缓存使用经验和遇到过的问题. 目录 一: 基本写法 二:缓存雪崩 1:全局锁,实例锁 2:字符串锁 三:缓存穿透 四:再谈缓存雪崩 五:总结 一:基本写法 为了方便演示,我们用Runtime.Cache做缓存容器,

mybatis0209 二级缓存

1.1二级缓存 1.1.1原理 mybatis和spring整合后一级缓存就没有了,sqlSession在不关闭的前提下2次查询就会从缓存中取,一级缓存缓存在sqlSession对象里面,当多用户查询的时候就用到二级缓存了.UserMapper缓存:会把根据id和根据name查询的用户信息写进缓存,如果有人发了insert语句则会把所有的用户信息清空,二级缓存是命名空间级别的. 二级缓存的范围是mapper级别(mapper同一个命名空间的缓存,在UserMapper.xml里面有一个命名空间<

那些年我们一起追过的缓存写法(三)

目录 一:分析设计 二:O(1)LRU实现 三:过期删除策略 四: 总结 一:分析设计 假设有个项目有一定并发量,要用到多级缓存,如下: 在实际设计一个内存缓存前,我们需要考虑的问题: 1:内存与Redis的数据置换,尽可能在内存中提高数据命中率,减少下一级的压力. 2:内存容量的限制,需要控制缓存数量. 3:热点数据更新不同,需要可配置单个key过期时间. 4:良好的缓存过期删除策略. 5:缓存数据结构的复杂度尽可能的低. 关于置换及命中率:我们采用LRU算法,因为它实现简单,缓存key命中率