secache (ecstore缓存)单文件缓存工作原理

2015-12-02 09:18:00
hainuo
原创 2545
摘要:seCache是ShopEx设计的用于虚机等无法使用memCached等缓存机制情况下的由php编写的key-value单文件缓存系统,缓存数据文件是一个独立的二进制文件,事实上是一个key-value型数据库。
seCache是ShopEx设计的用于虚机等无法使用memCached等缓存机制情况下的由php编写的key-value单文件缓存系统,缓存数据文件是一个独立的二进制文件,事实上是一个key-value型数据库。seCache机制的设计目标是在固定存储空间下实现对shopex缓存文件的快速查找、调度删除、更新机制。其目的是解决文件分散存储情况下小文件过多、空间无限膨胀、管理不方便的弊端。seCache存储系统仅由一个文件组成,其中存储了缓存文件索引(seCache key )与缓存文件数据(seCache data)。这样我们可以方便地控制总缓存空间的大小.seCache存储结构对于每一个缓存文件,都会有一个根据链接、运行环境得出的唯一的md5值作为标识。我们使用hash索引方式快速查找定位到相应的文件在数据文件中的位置。hash索引算法采用取余法,值域为0-64K,即取值md5值的最后四位。同义词冲突算法采用基于单向hash链表的拉链法解决。存储分配算法采用固定空间分配算法,把存储数据文件的空间划分为多个存储区,每一存储区只能存储小于指定块大小的文件,各存储区指定的块大小各不相同,一般各指定块大小按序排列时,会形成一个菲波那契数列,也可按实际情况调整。当seCache data中的某一存储区中数据超过限制时,我们会根据LRU算法得出该存储区中需要淘汰的缓存文件以供新文件的存入。现根据经验默认预设为8个存储区(schema),块大小分别为:512,3K,8K, 20K,30K,50K, 80K,256K。 各存储区占用的空间大小分别为:2M,3M,3M,5M,5M,5M,3M,4M,共30M空间。后台增加空间,按此比例调整。存储区最大可设置至16个。在代码中是这样定义的?```$this->_bsize_list = array( 512=>10, 3<<10=> 10, 8<<10=> 10, 20<<10=> 4, 30<<10=> 2, 50<<10=> 2, 80<<10=> 2, 96<<10=> 2, 128<<10=> 2, 224<<10=> 2, 256<<10=> 2, 512<<10=> 1, 1024<<10=> 1,);```在seCache索引区中存在8组指针:分别是数据文件中对应存储区的存储分配起始地址(Store Start)及终止地址指针(Store End)、已分配区域底部指针(Store Break)。[![](http://blog.hainuo.info/data/upload/201512/f_b0db10b03c33eca0b886e35f09979bf0.jpg)](http://blog.hainuo.info)上图中,左侧为各存储区的指针组,记录在seCache 索引文件中,右侧为数据文件的各存储区示意图,由上图可以看到,Size 1存储区、Size 2存储区、Size N存储区分别处于未分配完毕、已分配完毕、未分配状态。LRU双向链表分为8个,空闲块单向链表也为8个,同时还有8组指针,每一组指针分别是指向对应LRU链表头的指针(LRU top)、LRU链表尾的指针(LRU bottom)和指向对应空闲块链表入口的指针(Free pointer)。节点的数据结构如下:| 序号 | 属性名称 || -- | -- || 1 | LRU LEFT || 2 | HASH LEFT || 3 | 文件MD5标识 || 4 | 本文件在数据文件中的存储位置 || 5 | 文件长度 || 6 | HASH RIGHT || 7 | LRU RIGHT |经PACK后总长为32字节。[![](http://blog.hainuo.info/data/upload/201512/f_8583e450bf624bb9a83ac09beb018306.jpg)](http://blog.hainuo.info)缓存系统索引示意图seCache key区域结构如下:| 序号 | 说明 || - | - || 1 | 保留区域(10 Bytes) || 2 | LRU链表栈顶地址(4 Bytes) || 3 | LRU链表栈底地址(4 Bytes) || 4 | 回收链表队列入口地址(4 Bytes) || 5 | 保留区域(100 Bytes) || 6 | Hash索引区(256K) || 7 | Hash链表区 |#其他说明secache是一个PHP编写的文件型缓存解决方案1. 纯 php实现, 无须任何扩展,支持php4 / 51. 使用lru算法自动清理过期内容1. 可以安全用于多进程并发1. 最大支持1G缓存文件1. 使用hash定位,读取迅速项目及下载地址 : http://www.phpclasses.org/package/6078-PHP-Store-and-retrieve-cached-values-from-single-file.html#informationsecache使用方法```require('../secache/secache.php');$cache = new secache;$cache->workat('cachedata');$key = md5('test'); //必须自己做hash,前4位是16进制0-f,最长32位。$value = '值数据'; //必须是字符串$cache->store($key,$value);if($cache->fetch($key,$return)){echo '
  • '.$key.'=>'.$return.'
  • ';}else{echo '
  • Data get failed! '.$key.'
  • ';}```
    发表评论
    柒 减 拾 =
    评论通过审核后显示。