目前廣泛使用的分布式緩存Redis和Memcached均支持對整數型Value值的增減,對應到具體命令中就是incr和decr命令。
incr/decr是原子性操作(memcached 1.2.4及以后版本加入/redis),其被廣泛應用於計數器和限速器。
一、分布式緩存Redis和Memcached在這兩個命令的具體語法上的不同
Redis的incr命令語法分兩種:
1)incr key,即將指定主鍵key的value值加一;
2)incrby key increment,即將指定主鍵key的value值加上increment。
Redis的decr命令語法同樣分為兩種:
1)decr key,即將指定主鍵key的value值減一;
2)decrby key decrement,即將指定主鍵key的value值減去decrement。
Memcached的incr命令語法
1)incr key integer,即將指定主鍵key的value值加上給定的integer,
2)decr命令語法為decr key interger,即將指定主鍵key的value值減去給定的interger。
二、分布式緩存Redis和Memcached支持的整型數值的不同
Redis支持的整數型Value值的具體類型為字符串(十進制)表示的帶符號64-bit整數,
Memcached支持的整數型Value值的具體類型為字符串(十進制)表示的無符號64-bit整數,
這就導致兩個系統支持的整數型Value值的取值范圍是不一樣的。Redis支持的整數型Value值范圍是-9223372036854775808~9223372036854775807,而Memcached的范圍則是0~18446744073709551615。
1、key內存儲的字符串被解釋為十進制
#Server
Memcached_version: 1.2.6
# Server
redis_version:3.1.999
從上述對Memcached和Redis的實驗可以看到,對incr命令保存為字符串。
2、Redis帶符號64-bit整數,Memcached無符號64-bit整數
看下Memcached情況又會如何
三、分布式緩存Redis和Memcached,incr/decr的差異
1、Redis如果對應的key不存在,incr/decr不會失敗,而會從0開始計數
2、Memcached如果對應值不存在,incr/decr會失敗,而不會從0開始計數
上面的測試是基於Memcached 文本協議的做法。因為文本協議不允許incr 設置不存在的key。
如xmemcached中,memcachedClient.incr("a",5,1),memcachedClient.incr("a",5)
incr和decr都有三個參數的方法,第一個參數指定遞增的key名稱,第二個參數指定遞增的幅度大小,第三個參數指定當key不存在的情況下的初始值。
兩個參數的重載方法省略了第三個參數,默認指定為0。
3、incr/decr操作無法刷新過期時間
Redis,我們知道set、getset命令為鍵值賦值同時會消除鍵值的生存時間、persist命令把一個設置過過期時間的鍵取消過期時間設置,如果需要可以重新使用expire命令為鍵設置生存時間。而其他對鍵的操作命令(如incr、lpush、hset、zrem)都不會影響鍵的生存時間。
Memcached,incr/decr操作無法刷新過期時間,所以過期時間以初始化的時間為准。
因此,如果使用memcached作為長期的計數器,必須用額外的機制定時刷新item。memcached協議提供了touch方法,只刷新時間,不對值作修改。
如果是二進制協議,則可以直接用incr命令設置初始值,過期時間。
Memcached官方協議看這里 。
參考:http://blog.sina.com.cn/s/blog_48c95a190101772i.html
由於本人經驗有限,文章中難免會有錯誤,請瀏覽文章的您指正或有不同的觀點共同探討!