Redis五大数据结构
1、Redis介紹
Redis是REmote DIctionary Server的縮寫,作者定位于一個(gè)內(nèi)存KV存儲(chǔ)數(shù)據(jù)庫(In-memory key-value Store),讓Redis自豪的并不是那每秒10K的讀寫速度,而是它那可以應(yīng)對很多情況的數(shù)據(jù)結(jié)構(gòu),我這里就簡單的介紹一下它五大數(shù)據(jù)結(jié)構(gòu),也可以方便的讓自個(gè)翻翻API,并給以后翻閱源碼打下一個(gè)基礎(chǔ)。
2、Strings
1)簡介
String是Redis最基本的數(shù)據(jù)結(jié)構(gòu),它的String是二進(jìn)制安全的,即String中可以存放任意的二進(jìn)制數(shù)據(jù),比如說JPG圖片、序列化對象等。String值長度最大可到512mb。
2)結(jié)構(gòu)定義
| 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中存放了多個(gè)鍵值對(field/value),所以Hash結(jié)構(gòu)可方便的表示一個(gè)對象。如:
HMSET user:00001 username wikie password gender male
一個(gè)Hash可以存放2^32 – 1個(gè)鍵值對。Hash對象是用zipmap存儲(chǔ)的,查找、刪除均為O(n),但一般來說對象的field對象不會(huì)大多,所以說操作評價(jià)還是近似O(1)。如果field/value的大小超過一定限制后,Redis會(huì)在內(nèi)部自動(dòng)將zipmap替換成正常的Hash實(shí)現(xiàn),可在配置文件中指定:
hash-max-zipmap-entries 64 # 字段最多64個(gè)
hash-max-zipmap-value 512 # value最大為512字節(jié)
2)結(jié)構(gòu)定義
| //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是一個(gè)簡單的strings類型的雙向鏈表,按照插入順序排序。
最大長度支持2^32-1,可以通過命令從頭部或者尾部添加刪除元素,即可很方便的實(shí)現(xiàn)棧與隊(duì)列操作。List還可以阻塞,很容易就實(shí)現(xiàn)了一個(gè)工作隊(duì)列,而不用輪詢。
2)結(jié)構(gòu)定義
| // 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)簡介
與數(shù)學(xué)的中的集合概念類似,沒有重復(fù)的值,對其有添加刪除操作,可對都個(gè)結(jié)合求交、并等操作,key理解為集合的名字。新浪微博中的:“我和她都關(guān)注了”只需要一個(gè)SINTER命令就可以實(shí)現(xiàn)。
Sets通過Hash Table實(shí)現(xiàn),添加刪除的時(shí)間復(fù)雜度均為O(n),HashTable會(huì)隨著添加或者刪除自動(dòng)調(diào)整大小。需要注意的是,調(diào)整HashTable大小需要同步(獲取寫鎖)阻塞讀寫操作,后期可能會(huì)采用SkipList(無序如何使用SkipList?)實(shí)現(xiàn)。
和其它類型一樣,最大支持2^32-1個(gè)元素。
2)結(jié)構(gòu)定義
與Hashes中的dict一致。
3)支持的方法
SADD、SCAR、SDIFF、SDIFFSTORE、SINTER、SISMEMBER
SMEMBERS、SMOVE、SPOP、SRANDMEMBER、SREM
SUNION、SUNIONSTORE
6、ZSets
1)簡介
ZSets為Set的升級(jí)版本,即排序的Sets,在Set的基礎(chǔ)之上增加了順序(Score)屬性,每次插入均需要指定,且會(huì)自動(dòng)重新調(diào)整值的順序。Score為double類型,ZSets實(shí)現(xiàn)為SkipList與HashTable的混合體。
元素到Score的映射是添加在HashTable中的,所以給定一個(gè)元素獲取Score開銷為O(1),Score到元素的映射則為SkipList。
2)結(jié)構(gòu)定義
| /* 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/
總結(jié)
以上是生活随笔為你收集整理的Redis五大数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery滑动效果实例
- 下一篇: SQL的事务回滚操作带案例分析