Redis現在是比較流行的快取資料庫,一般剛接觸的時候都會發現其可以儲存字串(string)、雜湊表(hash)、列表(list)、集合(set)、有序集合(sorted set)等。redis是一個key-value儲存,value可以包含上面列出的多種結構,但是key都是字串。也就是說key是string類型,value為上面類型的一種。
由於以上每種資料結構的儲存指令在redis中都不一樣,單個看來想要使用redis必須要先區分要儲存的對象的結構,然後選擇相應的指令。但是這樣使用起來確實是很不利的,如果一次要存入多種形式的值,我就要實現多種儲存方式。
為了便於開發和使用redis引入了對象,即Object Storage Service。上面的每種資料結構都是一種對象,所以,在項目中只需要實現對象的儲存即可。
Redis中每個對象都有一個redisObject結構,該結構中和儲存資料相關的三種屬性分別是儲存資料的類型type、值的編碼屬性encoding和指標ptr屬性:
typedef struct redisObject{//類型unsigned type:4;//編碼unsigned encoding:4;//指向底層實現資料結構的指標void *ptr//虛擬記憶體和其他資訊等.....}robj;
類型常量 |
對象的名稱 |
type值 |
REDIS_STRING |
字串對象 |
string |
REDIS_LIST |
列表對象 |
list |
REDIS_HASH |
雜湊對象 |
hash |
REDIS_SET |
集合對象 |
set |
REDIS_ZSET |
有序集合對象 |
zset |
擷取儲存值的類型編碼指令:
TYPE key
如,我在redis中存入一個字串的值:
[root@iZ8vb8r420ejxfron03cj7Z ~]# redis-cli127.0.0.1:6379> set msg "rhett" OK127.0.0.1:6379> get msg"rhett"127.0.0.1:6379> type msgstring
編碼常量 |
對象的名稱 |
type值 |
REDIS_ENCODING_INT |
整數 |
int |
REDIS_ENCODING_EMBSTR |
embstr編碼的簡單動態字串(SDS) |
list |
REDIS_ENCODING_RAW |
簡單動態字串 |
raw |
REDIS_ENCODING_HT |
字典 |
hashtable |
REDIS_ENCODING_LINKEDLIST |
雙端鏈表 |
linkedlist |
REDIS_ENCODING_ZIPLIST |
壓縮列表 |
ziplist |
REDIS_ENCODING_INTSET |
整數集合 |
intset |
REDIS_ENCODING_SKIPLIST |
跳躍表和字典 |
skiplist |
redis中的樣本:
[root@iZ8vb8r420ejxfron03cj7Z ~]# redis-cli127.0.0.1:6379> set msg "rhett" OK127.0.0.1:6379> object encoding msg"embstr"
參考書籍:《Redis設計與實現》