Redis hash數據類型操作


  Redis hash是一個string類型的field和value的映射表.一個key可對應多個field,一個field對應一個value。將一個對象存儲 為hash類型,較於每個字段都存儲成string類型更能節省內存。新建一個hash對象時開始是用zipmap(又稱為small hash)來存儲的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些元數據存儲開銷。盡管zipmap的添加,刪除,查找都是 O(n),但是由於一般對象的field數量都不太多。所以使用zipmap也是很快的,也就是說添加刪除平均還是O(1)。如果field或者 value的大小超出一定限制后,Redis會在內部自動將zipmap替換成正常的hash實現.。這個限制在redis.conf中配置如下:

 

[plain] view plain copy print ?
 
  1. 421 # Hashes are encoded in a special way (much more memory efficient) when they  
  2. 422 # have at max a given numer of elements, and the biggest element does not  
  3. 423 # exceed a given threshold. You can configure this limits with the following  
  4. 424 # configuration directives.  
  5. 425 hash-max-zipmap-entries 512  
  6. 426 hash-max-zipmap-value 64  

 

  • 操作

1. hset

 

HSET key field value

將哈希表 key中的域 field的值設為 value。如果 key不存在,一個新的哈希表被創建並進行hset操作。如果域 field已經存在於哈希表中,舊值將被覆蓋。

 

2. hget


HGET key field


返回哈希表key中指定的field的值。


3. hsetnx

 

HSETNX key field value

將哈希表 key中的域 field的值設置為 value,當且僅當域 field不存在。若域 field已經存在,該操作無效。如果 key不存在,一個新哈希表被創建並執行hsetnx命令。

 

4. hmset

 

HMSET key field value [field value ...]

 

同時將多個field - value(域-值)對設置到哈希表key中。此命令會覆蓋哈希表中已存在的域。如果key不存在,一個空哈希表被創建並執行hmset操作。

5. hmget


HMGET key field [field ...]

 

返回哈希表key中,一個或多個給定域的值。如果給定的域不存在於哈希表,那么返回一個nil值。因為不存在的key被當作一個空哈希表來處理,所以對一個不存在的key進行hmget操作將返回一個只帶有nil值的表。

 

6. hgetall

 

HGETALL key
返回哈希表 key中,所有的域和值。在返回值里,緊跟每個域名(field name)之后是域的值(value),所以返回值的長度是哈希表大小的兩倍。

 

7. hdel

 

HDEL key field [field ...]
刪除哈希表 key中的一個或多個指定域,不存在的域將被忽略。

 

8. hlen


HLEN key

返回哈希表key對應的field的數量。


9. hexists

 

HEXISTS key field
查看哈希表 key中,給定域 field是否存在。

 

10. hkeys


HKEYS key

獲得哈希表中key對應的所有field。


11. hvals


HVALS key

獲得哈希表中key對應的所有values。


12. hincrby

 

為哈希表key中的域field的值加上增量increment。增量也可以為負數,相當於對給定域進行減法操作。如果key不存在,一個新的哈希表被創建並執行hincrby命令。如果域field不存在,那么在執行命令前,域的值被初始化為0。對一個儲存字符串值的域field執行hincrby命令將造成一個錯誤。本操作的值限制在64位(bit)有符號數字表示之內。

更多詳細信息請參照:http://redis.readthedocs.org/en/2.4/hash.html

下面是利用redis c++客戶端編寫的測試程序:

 

[cpp] view plain copy print ?
 
  1. #include "redisclient.h"  
  2.   
  3. #include "tests/functions.h"  
  4.   
  5. #include <iostream>  
  6.   
  7. #include <boost/date_time.hpp>  
  8.   
  9. #define OUT(x) std::cout<<#x<<" = "<<x<<std::endl;  
  10.   
  11. boost::shared_ptr<redis::client> init_non_cluster_client();  
  12. void test_hash(redis::client & c);  
  13.   
  14. int main(int argv, char* argc[])   
  15. {  
  16.     boost::shared_ptr<redis::client> shared_c;  
  17.   
  18.     shared_c = init_non_cluster_client();  
  19.   
  20.     redis::client& c = *shared_c;  
  21.   
  22.     test_hash(c);  
  23.   
  24.     return 0;  
  25. }  
  26. void test_hash(redis::client & c)  
  27. {  
  28.     test("test hash type");  
  29.   
  30.     test("hset & hget & hsetnx");  
  31.     {  
  32.         // hset: key, field, value  
  33.         OUT(c.hset("favorites", "taobao", "www.taobao.com"));  
  34.         OUT(c.hset("favorites", "taobao", "www.taobao.com#"));  
  35.         OUT(c.hget("favorites", "taobao"));  
  36.         OUT(c.hsetnx("favorites", "taobao", "www.taobao.com"));  
  37.         OUT(c.hget("favorites", "taobao"));  
  38.     }  
  39.   
  40.     test("hmset & hmget & hgetall & hdel & hexists");  
  41.     {  
  42.         redis::client::string_vector fields, values, getvalues;  
  43.         fields.push_back("tmall");  
  44.         fields.push_back("alibaba");  
  45.         values.push_back("www.tmall.com");  
  46.         values.push_back("www.1688.com");  
  47.         c.hmset("favorites", fields, values);  
  48.         // 類型錯誤,報錯  
  49.         c.set("string_key", "string_value");  
  50.         //c.hmset("string_key", fields, values);  
  51.         fields.push_back("etao");  
  52.         c.hmget("favorites", fields, getvalues);  
  53.         OUT(getvalues.size());  
  54.         for(int i=0; i<getvalues.size(); ++i) {  
  55.             OUT(getvalues[i]);  
  56.         }  
  57.   
  58.         redis::client::string_pair_vector pairs;  
  59.         c.hgetall("favorites", pairs);  
  60.         OUT(pairs.size());  
  61.         for(int i=0; i<pairs.size(); ++i) {  
  62.             OUT(pairs[i].first);  
  63.             OUT(pairs[i].second);  
  64.         }  
  65.   
  66.         OUT(c.hset("favorites", "etao", "www.etao.com"));  
  67.         OUT(c.hlen("favorites"));  
  68.         pairs.clear();  
  69.         c.hdel("favorites", "etao");  
  70.         c.hdel("favorites", "koubei");  
  71.         c.hgetall("favorites", pairs);  
  72.         OUT(pairs.size());  
  73.         for(int i=0; i<pairs.size(); ++i) {  
  74.             OUT(pairs[i].first);  
  75.             OUT(pairs[i].second);  
  76.         }  
  77.   
  78.         OUT(c.hexists("favorites", "taobao"));  
  79.         OUT(c.hexists("favorites", "koubei"));  
  80.     }  
  81.   
  82.     test("hincrby & hkeys & hvals");  
  83.     {  
  84.         OUT(c.hset("lists", "age", "20"));  
  85.         OUT(c.hincrby("lists", "age", 5));  
  86.         redis::client::string_vector keys;  
  87.         c.hkeys("lists", keys);  
  88.         for(size_t i=0; i<keys.size(); ++i) {  
  89.             OUT(keys[i]);  
  90.         }  
  91.         redis::client::string_vector vals;  
  92.         c.hvals("lists", vals);  
  93.         for(size_t i=0; i<keys.size(); ++i) {  
  94.             OUT(vals[i]);  
  95.         }  
  96.     }  
  97. }  


 


免責聲明!

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



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