Redis五大数据结构
1、Redis介紹
Redis是REmote DIctionary Server的縮寫,作者定位于一個內存KV存儲數據庫(In-memory key-value Store),讓Redis自豪的并不是那每秒10K的讀寫速度,而是它那可以應對很多情況的數據結構,我這里就簡單的介紹一下它五大數據結構,也可以方便的讓自個翻翻API,并給以后翻閱源碼打下一個基礎。
2、Strings
1)簡介
String是Redis最基本的數據結構,它的String是二進制安全的,即String中可以存放任意的二進制數據,比如說JPG圖片、序列化對象等。String值長度最大可到512mb。
2)結構定義
| struct sdshdr{ long len; long free; char buf[]; } |
3)支持命令
APPEND、GET、GETBIT、GETRANGE、GETSET、STRLEN
MGET、MSET、MSETNX、SET、SETBIT、SETEX、SETNX、SETRANGE
INCR、INCRBY、DECR、DECRBY
3、Hashes
1)簡介
Hashes中存放了多個鍵值對(field/value),所以Hash結構可方便的表示一個對象。如:
HMSET user:00001 username wikie password gender male
一個Hash可以存放2^32 – 1個鍵值對。Hash對象是用zipmap存儲的,查找、刪除均為O(n),但一般來說對象的field對象不會大多,所以說操作評價還是近似O(1)。如果field/value的大小超過一定限制后,Redis會在內部自動將zipmap替換成正常的Hash實現,可在配置文件中指定:
hash-max-zipmap-entries 64 # 字段最多64個
hash-max-zipmap-value 512 # value最大為512字節
2)結構定義
| //Please check in dict.h typedef struct dictht { dictEntry table; unsigned long size; unsigned long sizemask; unsigned long used; } dictht; |
3)支持命令
HDEL、HEXISTS、HGET、HGETALL、HINCRBY、HKEYS、HLEN
HMGET、HMSET、HSET、HSETNX、HVALS
4、Lists
1)簡介
Lists是一個簡單的strings類型的雙向鏈表,按照插入順序排序。
最大長度支持2^32-1,可以通過命令從頭部或者尾部添加刪除元素,即可很方便的實現棧與隊列操作。List還可以阻塞,很容易就實現了一個工作隊列,而不用輪詢。
2)結構定義
| // Check in adlist.h typedef struct listNode { struct listNode *prev; struct listNode *next; void *value; } listNode; typedef struct listIter { listNode *next; int direction; } listIter; typedef struct list { listNode *head; listNode *tail; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr, void *key); unsigned int len; } list; |
3)支持命令
BLPOP?、BRPOP?、BRPOPLPUSH、LINDEX、LINSERT、LLEN
LPOP、LPUSH、LPUSHX、LRANGE、LREM、LSET、LTRIM
RPOP、RPOPLPUSH、RPUSH、RPUSHX
5、Sets
1)簡介
與數學的中的集合概念類似,沒有重復的值,對其有添加刪除操作,可對都個結合求交、并等操作,key理解為集合的名字。新浪微博中的:“我和她都關注了”只需要一個SINTER命令就可以實現。
Sets通過Hash Table實現,添加刪除的時間復雜度均為O(n),HashTable會隨著添加或者刪除自動調整大小。需要注意的是,調整HashTable大小需要同步(獲取寫鎖)阻塞讀寫操作,后期可能會采用SkipList(無序如何使用SkipList?)實現。
和其它類型一樣,最大支持2^32-1個元素。
2)結構定義
與Hashes中的dict一致。
3)支持的方法
SADD、SCAR、SDIFF、SDIFFSTORE、SINTER、SISMEMBER
SMEMBERS、SMOVE、SPOP、SRANDMEMBER、SREM
SUNION、SUNIONSTORE
6、ZSets
1)簡介
ZSets為Set的升級版本,即排序的Sets,在Set的基礎之上增加了順序(Score)屬性,每次插入均需要指定,且會自動重新調整值的順序。Score為double類型,ZSets實現為SkipList與HashTable的混合體。
元素到Score的映射是添加在HashTable中的,所以給定一個元素獲取Score開銷為O(1),Score到元素的映射則為SkipList。
2)結構定義
| /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode { robj *obj; double score; struct zskiplistNode *backward; struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; } level[]; } zskiplistNode; typedef struct zskiplist { struct zskiplistNode *header, *tail; unsigned long length; int level; } zskiplist; typedef struct zset { dict *dict; // Value to Score zskiplist *zsl; // Score to Value } zset; |
3)支持命令
ZADD、ZCARD、ZCOUNT、ZINCRBY、ZINTERSTORE
ZRANGE、ZRANGEBYSCORE、ZRANK、ZREM
ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREVRANGE
ZREVRANGEBYSCORE、ZREVRANK、ZSCORE、ZUNIONSTORE
參考資料:
Redis.io
The Little Redis Book
?
from:?http://yihongwei.com/2012/03/redis-data-strutrue/
總結
以上是生活随笔為你收集整理的Redis五大数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery滑动效果实例
- 下一篇: Linux时间子系统之三:时间的维护者: