论坛首页 综合技术论坛

把Queue/Stack存进Memcached

浏览 2682 次
精华帖 (0) :: 良好帖 (14) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-20  
实现Queue/Stack存进Memcached的方法很简单,就是把多个Item(Memcached基本存储单位,也就是Key/Value对)链表起来,并为此链表取一个名称(name)来代表此Queue/Stack(以下简称集合),以后的各种队列操作也要用到此名称.为Memcached增强对集合的一些功能操作新加的命令如下:

1, queue/stack name expiration length

    创建或修改 name 集合名称 以此为分布式依据. expiration 过期时间 <0时由过期为元素的过期时间 0时删除此集合(更新时) >0时元素的过期为 此值

2, queue/stack name expiration length key flags exp vlen

    创建及添加元素, 创建动作只发生在第一次调用 name expiration length 同上 key 元素的key 存储时会同集合名称组合一起存时Mem,格式为:name_key,所以用此格式为key也可以直接操作该元素,并且集合也适应此元素的变化. flags exp vlen 分别为Mem的常规属性. 只是在集合的expiration大于0时,exp设置无效,始终等于expiration值.

3, pops/pop name flags start len

    范围取元素 是实现pop peek popTail peekTail remove的基础 name 集合名称 flags 获取方式 1获取并删除 0只获取 start 集合开始的位置 从0开始 支持负数, -1为最后位. len 从start开始的长度

4, list name

    全部取

5, size name

    集合当前元素数

6, clear name

    清空所有元素

根据上面几种命令总结操作如下:
1,限定或不限定长度的存或取          适应场景:最新文章,好友动态 ,分页显示
2,支持某个元素的或存或取或删或修改  适应场景:评论,留言等.
3,集合元素同时或不同时失效,
4,Queue适应最旧数据
5,Stack适应最新数据.

C源码:  svn checkout http://qmemcached.googlecode.com/svn/trunk/main
java客户端: svn checkout http://qmemcached.googlecode.com/svn/trunk/java_client

不完全测试性能:
get 20 items escape time:16
get 30 items escape time:47
get 50 items escape time:47
get 100 items escape time:109
get 150 items escape time:110
get 200 items escape time:125
get 300 items escape time:178
get 400 items escape time:218
get 500 items escape time:234
get 600 items escape time:297
get 700 items escape time:328
get 1000 items escape time:641

相较于TT&TC的Btree Queue
TT&TC(Btree) 2023403 itmes getQueue 10 elements escape time:16
TT&TC(Btree) 2023403 itmes getQueue 30 elements escape time:31
TT&TC(Btree) 2023403 itmes getQueue 40 elements escape time:47
TT&TC(Btree) 2023403 itmes getQueue 60 elements escape time:78
TT&TC(Btree) 2023403 itmes getQueue 110 elements escape time:110
TT&TC(Btree) 2023403 itmes getQueue 180 elements escape time:125
TT&TC(Btree) 2023403 itmes getQueue 330 elements escape time:145

总的说集合取操作和TT&TC相差无几.
ps:TT&TC的Queue是通过Lua扩展来实现的.如本身实现的话还会更快些.

   发表时间:2010-10-10  
何必这么麻烦..直接用redis不就得了
0 请登录后投票
   发表时间:2010-10-12  
貌似没什么人关注,楼主这个可以提交给memcached作为patch看看。
0 请登录后投票
   发表时间:2010-11-09  
kula 写道
何必这么麻烦..直接用redis不就得了

redis的过期方式是针对整个集合的, 而且设置expire后再更新操作时会清除集合所有keys,而此项目集合元素是独立存在的,独立存在的意思是可以单独过期,删除,获取,更新等操作. 同时集合也会作相应改变的.另外集合还能实现定长集合.超过长度的集合或舍去或不添加不进集合.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics