redis:hash資料類型與操作

來源:互聯網
上載者:User

  Redis hash是一個string類型的field和value的映射表.一個key可對應多個field,一個field對應一個value。將一個Object Storage Service為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 ? 421 # Hashes are encoded in a special way (much more memory efficient) when they   422 # have at max a given numer of elements, and the biggest element does not   423 # exceed a given threshold. You can configure this limits with the following   424 # configuration directives.   425 hash-max-zipmap-entries 512   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 ? #include "redisclient.h"      #include "tests/functions.h"      #include <iostream>      #include <boost/date_time.hpp>      #define OUT(x) std::cout<<#x<<" = "<<x<<std::endl;      boost::shared_ptr<redis::client> init_non_cluster_client();   void test_hash(redis::client & c);      int main(int argv, char* argc[])    {       boost::shared_ptr<redis::client> shared_c;          shared_c = init_non_cluster_client();          redis::client& c = *shared_c;          test_hash(c);          return 0;   }   void test_hash(redis::client & c)   {       test("test hash type");     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.