免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 34484 | 回复: 57
打印 上一主题 下一主题

[算法] 发布我的开源cache库ccache [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-24 11:18 |只看该作者 |倒序浏览
ccache(common cache)是一个使用共享内存实现的cache静态库,在节点数据不足时采用LRU算法进行节点的淘汰.
与memcache的区别在于,首先memcache是一个完整的server程序,不仅有cache的处理操作,还需要监听及处理客户端的操作请求,而ccache只是一个静态库,只关心cache的处理操作;其次,memcache采用了内存去管理数据,程序一旦停止,其中的数据全部丢失,而ccache采用了mmap的方式去管理数据,也就是每个cache都用一个与之对应的文件,一定程度上保证了数据不至于在程序停止的时候丢失;第三,memcache实现了对不定长key和data的支持,而cache目前(version 0.1)只支持定长的key和data,也就是同一个cache只能管理一个类型的key和data.

当前的版本(version0.1)采用hash-list的形式管理数据,LRU算法在节点数据不足时进行淘汰数据.
今后的版本需要完成的主要功能:
1)实现对不定长key和data的处理支持.
2)降低锁粒度,目前ccache在对数据进行操作时,都是对cache全局加锁,以后希望能做到降低这个加锁的粒度,使效率更高.
3)加入hash-rbtree的形式管理数据.

test/testcache.c是一个演示如何使用ccache的程序,目前仅在多进程的情况下进行测试,由于我本人对多线程不太熟悉,所以没有做多线程情况下的测试.
另外,由于使用了线程锁,所以在编译的时候需要链接pthread库.

项目地址:http://code.google.com/p/commoncache/
(注:请下载其中的ccache0.1.rar文件包,原先的cache.rar有一些问题)

2008.08.07发布0.3版本:
changelog:
加入对可变长key/value的支持.
shm.h/.c文件更名为memory.h/.c文件 create_shm/destroy_shm 更名为create_mmap/destroy_mmap
加入头文件config.h, 可用于配置一些参数
加入error.h/error.c 可以保存一些出错的信息

在使用时, 采用create_ccache函数创建ccache_t对象指针,其中的参数min_size和max_size分别指定cache中保存数据的最小和最大尺寸, min_size<=max_size, 当min_size = max_size时, 则是特殊情况, 可用于固定key/value的cache来使用, 节省了不少空间.(当然, 如果你想使用min_size和max_size不相同的cache来存放固定key/value的数据,也是可以的,只不过会浪费一些空间).

在插入/查询/删除数据等操作时,需要将数据封装到一个数据结构中:
typedef struct data_t
{
    int     datasize;               /* the size of the data */
    int     keysize;                /* the size of the key */
    char*   data;                   /* the pointer of the data */
    char*   key;                    /* the pointer of the key */
}data_t;

注释中对每个字段的含义解释的很清楚.

具体如何使用ccache来操作可变或者固定key/value的数据,请参看test文件夹下面用于压力测试的两个示例文件.

0.4版本(2008-10-31)
1)将原先的线程锁改成了线程读写锁,这个变化会让操作更快些,在查找,遍历操作的时候使用的是读锁,插入,删除,更新,替换等
会改变cache中元素的操作使用的是写锁.
2)将原先的API命名方式做了改变,变为ccache_***方式的命名, 这也是很多项目的命名方式, 但是其他未向外公开的API没有改变
命名方式,我在想是不是要把所有的函数都改成ccache_***的命名方式, 似乎这样更加统一一些.
3)另外, 原来的一个API, update_or_insert_data,命名方式太丑陋了, 改成了replace, 按照现在的命名方式, 这个API的名字
就是ccache_replace.
4)原先的operator.h/.c文件被删除, 取而代之的是functor.h/.c文件, 同时将插入,替换,更新,查找,删除,访问等操作作为函数指针封装到functor_t结构体
中, 这样以后采用其他的数据结构只要初始化不同的函数指针就可以了.

0.5版本(2008-11-14)
1) 加入对红黑树的支持, 可以在编译的时候决定使用的是hash-list还是hash-rbtree结构体进行数据的存储,具体请见makefile
2) 加入了一个数据结构对insert,find,erase,update,replace等操作进行统计, 参见ccache.h中的ccache_stat_t的结构体,另外在
测试程序中也加入了演示打印这些数据的函数,参见test中的测试代码.
3) 对hash-list算法进行了改进, 在访问到某一个节点的时候, 会让这个节点所在的链表位置向前走一步, 这样访问越频繁的节点就越靠近
链表头部,参见ccache_lis.c中的ccache_list_advance函数, 每次访问了某个节点就会去调用该函数.
4) 同样的,LRU链表算法也进行了改善,之前是访问的节点马上就更新到该LRU链表的头部, 现在也更改为每次向前走一步,
参见ccache_lrulist.c中的ccache_lrulist_advance函数.
5) 代码风格的调整, 所有的文件名,函数名, 宏名, 自定义类型名称都加上了"ccache_"前缀.

点击这里下载.

发布了这个版本之后,貌似我想不到其他比较大的feature, 最近的一段时间内除非有bug的改正, 否则不会发布新的版本了,我将抽时间整理出一份文档讲解ccache的实现.


ccache库项目地址:
http://code.google.com/p/commoncache/

[ 本帖最后由 converse 于 2008-11-14 16:56 编辑 ]

评分

参与人数 1可用积分 +2 收起 理由
大大狗 + 2 感谢分享

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-03-24 14:31 |只看该作者
标记一下,下个星期学习代码

论坛徽章:
0
3 [报告]
发表于 2008-03-24 14:59 |只看该作者
贊一個

论坛徽章:
0
4 [报告]
发表于 2008-03-24 15:26 |只看该作者
up

论坛徽章:
0
5 [报告]
发表于 2008-03-24 15:35 |只看该作者
友情帮顶。
楼上的个性签名

论坛徽章:
0
6 [报告]
发表于 2008-03-27 13:08 |只看该作者
学习一下。

论坛徽章:
0
7 [报告]
发表于 2008-03-27 13:20 |只看该作者
看标题还以为是这个 ccache.samba.org
重名了

论坛徽章:
0
8 [报告]
发表于 2008-04-01 09:27 |只看该作者

XXXX

你要是加上SQL语句的支持就牛了。。 嘿嘿。

论坛徽章:
0
9 [报告]
发表于 2008-04-01 09:53 |只看该作者

一点小建议

建议用 zip 格式来发布。记得以前看过 zip 和 rar 格式的一些八卦,提到 rar 是有版权的,目前免费的 rar 软件也不多。

论坛徽章:
0
10 [报告]
发表于 2008-04-01 10:00 |只看该作者
支持,有空学习~~
PS:又是google code。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP