许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加剧、数据库响应恶化、网站显示延迟等重大影响。git
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提升动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,可是客户端能够用任何语言来编写,并经过memcached协议与守护进程通讯。github
(百度百科)算法
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。