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