腾讯CMEM的PHP扩展
本文最后更新于 4838 天前,其中的信息可能已经有所发展或是发生改变。

题外话
最近公司在做相关的业务,由于Memcached协议缺少返回码,为了保证业务数据的安全性,不得已只好自己写个扩展来实现需求。

基于memcache扩展的2.2.6的稳定版开发而来。代码已经开源,有需要的朋友请拿走,License是PHP License,请自觉遵守。项目主页:http://code.google.com/p/cmem/

CMEM是什么
CMEM全称为Cloud Memory,是腾讯提供的高性能内存级持久化存储服务,适用于数据量小、访问量高、key-value存储的场景。
CMEM基于一个存储键/值对的hashmap,数据使用内存存储,并保证数据的持久性。

CMEM PHP Extension是什么
CMEM基于标准的Memcached协议以及接口,只是将数据获取接口增加返回值设定。
Memcached的Get协议没有设计返回码,所以Memcached API返回NO_DATA时,有可能是网络原因造成的,不能完全信任。

使用如下流程将是非常危险的,将造成用户数据初始化:

if(NO_DATA) {
    InitData();
}

为解决上述问题,CMEM提供了Memcahced文本扩展协议,增加两个扩展的命令get_ext, gets_ext,使客户端可以根据返回码判断数据是否存在。 这样可以避免网络和设备故障时get不到数据而导致用户数据被误初始化。

CMEM如何使用
在get具体的数据使用,传入两个引用变量$flag、$code:

flag是Memcache原有扩展自带的,在发送set命令时设置的标志项,使用和用法和以前一致;code是CMEM扩展新增的:当且仅当$code返回值为0时,get到的数据是可信的,其他情况,均不可信;

具体使用,请参见如下代码:

//初始化CMEM类
$mem = new CMEM;

//连接CMEM服务
$mem->connect("127.0.0.1", 11211);

//保存key为cmem的数据
$mem->set('cmem', 'CMEM work nice', 0, 86400);

//初始化$flag、$code,为引用传入准备
$flag = $code = -1;

//get方法,同时支持传入key组成的数组,同样返回的$code也是数组
$returnValue = $mem->get('cmem', &$flag, &$code);

//当且仅当$code返回值为0时,get到的数据是可信的,其他情况,均不可信
if($code == 0) {
        echo "the value is safe, value is: {$returnValue}";
} else {
        echo "the value is not safe, don't use it";
}

更多内容,比如类的使用以及方法对比、函数的使用以及函数对比请访问项目主页:http://code.google.com/p/cmem/

评论

  1. 13 年前
    2011-7-19 13:04:23

    不懂php啊……

  2. Platinum
    13 年前
    2011-7-20 10:54:09

    关于 memcache,PHP 有两个 PECL 扩展,memcache 和 memcached,后者该有的全都有了……

    http://www.php.net/manual/en/memcached.getresultcode.php

    http://hi.baidu.com/thinkinginlamp/blog/item/717cd42a11f6e491023bf67a.html

    • 博主
      Platinum
      13 年前
      2011-7-20 17:25:12

      @Platinum, 不太一样,CMEM这个协议是支持取数据的时候根据返回值来判断数据是否可用。

      • Platinum
        Kimi
        13 年前
        2011-7-20 18:35:10

        @kimi, 你真的点过链接了么,getResultCode 方法

  3. Kimijun
    13 年前
    2011-7-20 11:16:50

    kimi啊,有问题请教你,加我QQ:418716814

  4. Zengpu
    13 年前
    2011-7-20 15:18:07

    如何持久化呢

    • 博主
      Zengpu
      13 年前
      2011-7-20 17:26:45

      @Zengpu, CMEM是支持持久化的

  5. 博主
    13 年前
    2011-7-20 17:27:15

    @kimijun, 呃,加QQ,也太直接了吧。

  6. 博主
    13 年前
    2011-7-20 19:29:24

    @Platinum, 呃,两点区别,
    第一:
    memcached这个PECL扩展所接受的memcached服务器端返回数据是

    VALUE key flags bytes\r\n
    data block\r\n

    而带返回值的CMEM服务器返回的数据包格式是

    VALUE key result flags bytes\r\n
    data block\r\n

    多了一个 返回值

    所以,我写的的CMEM扩展是服务端直接返回的,而memcached这个PECL扩展,可以归类为客户端判断出来的。

    第二:
    至少在异步队列的时候,两种返回方式对代码的影响是不一样的,不过这个我们线上业务用的较少。

    刚顺带看了下源码,getResultCode的实现是这样的。

    static PHP_METHOD(Memcached, getResultCode)
    {
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) {
    return;
    }
    RETURN_LONG(MEMC_G(rescode));
    }

    可以认定,如果修改memcached这个PECL扩展的get方法,是可以即时返回code的,但是两个code的来源不同。

    • 博主
      Kimi
      13 年前
      2011-10-18 18:43:26

      测试下嵌套评论,到底有没有问题

      test

  7. taogogo
    13 年前
    2011-8-17 13:18:32

    俺是php,你博客内容真好,膜拜下

  8. 13 年前
    2011-9-02 12:39:07

    关于TX啥都不想说 它太牛X

  9. 13 年前
    2011-9-03 7:40:11

    PHP高手啊,改天叫朋友来看。看步懂呢。

  10. 13 年前
    2011-9-03 9:14:22

    看不懂

  11. ruby
    13 年前
    2011-10-15 13:51:12

    学习了,原本以为很难,看起来也满简单的,继续努力,谢谢~

  12. vancett
    13 年前
    2011-10-19 14:10:22

    test

  13. 13 年前
    2011-11-11 13:36:04

    我这边的团队就是在处理这个东西了..因为社交类的网站的写的量过大..单纯用mc+mysql的方式..可能无法处理,所以需要纯异步写库

  14. 甜面酱
    13 年前
    2012-1-30 9:30:00

    “CMEM全称为Cloud Memory,是腾讯提供的高性能内存级持久化存储服务”
    请问如何清除过期的数据呢?有什么可操作的方法?

    • laurentzhao
      甜面酱
      11 年前
      2014-3-14 16:13:31

      数据写入的时候支持过期时间

  15. s
    11 年前
    2013-6-21 15:02:07

    >sss

  16. Cx
    10 年前
    2014-12-19 11:05:51

    一般用到CMEM,从系统架构层面说都是太过倚重memcache了

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇