memcached 是个好东西,但是有些注意点需要引起我们的注意:


  1. 最大缓存时间

    memcached 设置key的过期时间最大为30d


  2. 单条缓存项的最大值

    单个缓存项不能超过1M,可以客户端压缩。

3. key的长度大于250字符

       针对这个限制需要注意的事,在文本协议时,有这个限制;但是二进制协议会使用2个字节的长度表示key的长度,因此key的长度可以不超过65535个字符;但是我们通常也不会搞这么长的key;

4. 不能能够遍历memcached中所有的item 

5. memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?

  实际上,这是一个编译时选项。默认会使用内部的slab分配器,而且确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。

6. memcached是原子的吗?

    所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的。然是,命令序列不是原子的。如果首先通过get命令获取了一个item,修改了它,然后再把它set回memcached,系统不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果使用gets命令查询某个key的item,memcached会返回该item当前值的唯一标识。如果客户端程序覆写了这个item并想把它写回到memcached中,可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致,写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在memcached中的唯一标识将会改变,写操作就会

失败。