memcached如果在add后立即get,有时候获取不到,是不是因为add操作是异步的啊?在一个页面内的代码:
$mc->add($key,'asdqew');
echo($mc->get($key));即add后立马get有时候能echo出来,有时候就没有数据,这是怎么回事啊?

解决方案 »

  1.   

    即使在add和get间插入一个代码 sleep(1)也有时候获取不到数据,很是奇怪,难道是memcached不稳定?
      

  2.   

    存储时间过了,add()设个时间
      

  3.   

    Memcache::add — 增加一个条目到缓存服务器说明
    bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
    Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器。 同样可以使用函数memcache_add()。 参数key 
    将要分配给变量的key。 var 
    将要被存储的变量。字符串和整型被以原文存储,其他类型序列化后存储。 flag 
    使用MEMCACHE_COMPRESSED标记对数据进行压缩(使用zlib)。 expire 
    当前写入缓存的数据的失效时间。如果此值设置为0表明此数据永不过期。你可以设置一个UNIX时间戳或 以秒为单位的整数(从当前算起的时间差)来说明此数据的过期时间,但是在后一种设置方式中,不能超过 2592000秒(30天)。 
    返回值
    成功时返回 TRUE, 或者在失败时返回 FALSE. 如果这个key已经存在返回FALSE。 Memcache::add()方法的其他行为类似 Memcache::set()。 
    建议使用set方法强制写入

    Memcache::set
    (PECL memcache >= 0.2.0)Memcache::set — Store data at the server说明
    bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
    Memcache::set()向key存储一个元素值为 var。参数expire是以秒为单位的失效时间, 如果设置为0表明该元素永不过期(但是它可能会因为为了给其他项分配空间而被删除)。如果你希望存储的元素 经过压缩(使用zlib),你可以设置flag的值为MEMCACHE_COMPRESSED。 Note: 谨记:资源类型变量(比如文件或连接)不能被存储在缓存中,因为它们在序列化状态不能被完整描述。 
    同样你也可以使用函数memcache_set()。 参数key 
    要设置值的key。 var 
    要存储的值,字符串和数值直接存储,其他类型序列化后存储。 flag 
    使用MEMCACHE_COMPRESSED指定对值进行压缩(使用zlib)。 expire 
    当前写入缓存的数据的失效时间。如果此值设置为0表明此数据永不过期。你可以设置一个UNIX时间戳或 以秒为单位的整数(从当前算起的时间差)来说明此数据的过期时间,但是在后一种设置方式中,不能超过 2592000秒(30天)。 
    返回值
    成功时返回 TRUE, 或者在失败时返回 FALSE. 最后要注意设置好缓存过期时间
      

  4.   

    会不会是写入的时候失败了,你把add的返回值dump出来看一下
      

  5.   

    对memcached服务器只有你这个程序处理吗? 有没有其他客户端干扰?
      

  6.   

    这个问题我也遇到过,单步调试可以get到数据,但是直接运行,就get不到数据