Redis與Memcached的incr/decr差異對比


      目前廣泛使用的分布式緩存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整數

1)先為一個key max賦一個帶符號64-bit整數最大值9223372036854775807;
redis 127.0.0.1:6379> set max 9223372036854775807
OK
2)將該主鍵的值加一,系統提示此加一動作會導致向上溢出,由此可見Redis支持的最大整數型Value值確實為9223372036854775807;
redis 127.0.0.1:6379> incr max
(error) ERR increment or decrement would overflow
3)再為一個key min賦一個帶符號64-bit整數最小值-9223372036854775808;
redis 127.0.0.1:6379> set min -9223372036854775808
OK
4)將該主鍵的值減一,系統提示此減一操作會導致向下溢出,由此可見Redis支持的最小整數型Value值確實為-9223372036854775808;
redis 127.0.0.1:6379> decr min
(error) ERR increment or decrement would overflow

      

      看下Memcached情況又會如何

1)先為一個key max賦一個無符號64-bit整數最大值 18446744073709551615;
set max 0 0 20
18446744073709551615
STORED
2)將該主鍵的值加一,系統的執行結果為0,即系統自身會自動避免向上溢出,由此可見Memcached支持的最大整數型Value值確實應該為18446744073709551615;
incr max 1
CLIENT_ERROR cannot increment or decrement non-numeric value 
 
疑問:遞增1后問什么沒有溢出,反而提示了 “對非數字的緩存操作才會返回的錯誤信息”
 
3)再為一個key min賦一個無符號64-bit整數最小值0;
set min 0 0 1
0
STORED
4)將該主鍵的值減一,系統的執行結果還是0,即系統自身會自動避免向下溢出,由此可見Memcached支持的最小整數型Value值確實應該為0;
decr min 1
0

      

     三、分布式緩存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

 

由於本人經驗有限,文章中難免會有錯誤,請瀏覽文章的您指正或有不同的觀點共同探討!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM