Memcached

  许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。

  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

  memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。
 
  memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程式码更新memcached内的资料。
 
  为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

(百度百科)

incr/decr是memcached 1.2.4加入的原子性整数操作(changelog:2006-10-03)。这个功能常用于分布式项目中的计数。

1. incr/decr在memcached中的保存方式是:字符串(十进制)表示的无符号64bit整数。

Increment and Decrement. If an item stored is the string representation of a 64bit integer, you may run incr or decr commands to modify that number. You may only incr by positive values, or decr by positive values. They does not accept negative values.

2. incr/decr操作无法刷新过期时间。

   memcached的协议可以看这里。incr/decr操作无法刷新过期时间,所以过期时间以初始化的时间为准。

    最开始以为spy的memcacheClient的incr(String key, int by, long def, int exp)可以刷新过期时间,后来才发现,此方法是封装了incr/decr和add的组合操作。这个exp指的是,若incr失败,则将def值add到此key,并使用这个过期时间exp,如果成功,过期时间不变!

   因此,如果使用memcached作为长期的计数器,必须用额外的机制定时刷新item。memcached协议提供了touch方法,只刷新时间,不对值作修改,最新的spymemcached 客户端中提供了这个功能。

3. 如果对应值不存在,incr/decr会失败,而不会从0开始计数。

   telnet下输入:

1
2
incr b 1
NOT_FOUND

   返回NOT_FOUND,没有incr成功。memcachedClient.incr(key,delta)调用之后,若key不存在,则返回-1。

原文地址:https://www.cnblogs.com/zhulin-jun/p/5063686.html