会员登录
PHP文件型缓存解决方案secache学习memcache
来源:互联网 作者:未知 时间:2011-01-22 23:03:35 点击:104130 评论:5
本文地址:http://pslib.com/index.php?mod=skill&action=detail&id=43935 [复制]

PHP文件型缓存解决方案secache secache logo

太极刀客: 前两天发现的东西, 不同于一般的PHP文件缓存实现手法. 写得不错.类似Memcahced, 单文件实现, 支持并发, 比传统分离小文件缓存方式性能提高一倍.
由于缓存文件只有一个,PHP最大寻址能力是2G,过大会指针溢出, 所以只能支持1G的缓存.

以下是官方网站的介绍
secache是一个PHP编写的文件型缓存解决方案

  • 纯php实现, 无须任何扩展,支持php4 / 5
  • 使用lru算法自动清理过期内容
  • 可以安全用于多进程并发
  • 最大支持1G缓存文件
  • 使用hash定位,读取迅速

项目及下载地址 : http://code.google.com/p/secache/

secache使用方法

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 '<li>'.$key.'=>'.$return.'</li>';
}else{
 
echo '<li>Data get failed! <b>'.$key.'</b></li>';

基于性能考虑,几点约束:

  • 键需要自己做hash处理,最长32位.
  • 值必须是字符串。如果要存对象,请自己serialize

下面详细说明secache的实现原理

secache是一个采用拉链法的hash结构。整个文件分成2个主要部分。

  1. 结构信息区
    1. 保留空间 20字节,放置一个
    2. 防止文件被下载

  2. 保留空间 20字节,放置文件的版本信息,最大容量
  3. 20字节保留区域
  4. 结构信息 16种slab结构,每个需要24字节,占用空间:24*16=384字节
  5. 索引信息区
    1. 索引计数器数据 40-44
    2. 数据最大空间指针 44-48
    3. 空闲链表入口地址 48-52
    4. hash索引入口地址 (16^4)*4 = 256k
  • 数据区(混杂)
    1. 索引链表
    2. 数据链表

系统将要存储的数据最多可分为16中大小,然后分别创建数据空间。避免一条数据被拆分到多个数据块中的复杂度。我们一共预设了13组slab结构,预设的数据大小和预分配的条目为:

因此secache要求数据空间最小为10M。当超过这个值时,secache会根据存放数据的频率动态增加各个slab的数据块数量,直到增长到 配置好 的最大数据量为止。当增长到极限时,各slab的数据块分布将不再变动。如果想重建结构,需要删除缓存文件,重新生成。当无法申请到新的空间之后,将采用 lru的策略删除相对不活跃的缓存条目,为新的缓存请求腾出数据空间。

每个slab结构占用24个字节,组成为:

再看一下hash索引表的结构。所有进入secache的数据,key的前4位必须是16进制数据,即0000

-ffff, 共65536种前缀, 每个前缀的索引占用4字节的入口, 所以索引入口区占用空间为65536*4=256k空间。可以看到,secache的地址数据都是4字节,即最大支持256^4=4G的寻址空间,但是由 于PHP在32位系统下的大数上限约为二十亿。所以保险起见,我们强制secache最大仅支持1G空间。

数据区的数据有两种,一种是实际数据,一种是索引节点数据。实际数据空间占用情况依照slab不同而不同,索引节点的长度是定长:56Bytes。

索引节点结构:

最新评论
共有 5 位网友发表了评论