SDS簡單動態字串
struct sdshdr {
// 記錄buf陣列中已使用位元組的數量
// 等於SDS所儲存字串的長度
int len;
// 記錄buf陣列中未使用位元組的數量
int free;
// 位元組陣列,用於儲存字串
char buf[];
}
-
free表示這個SDS沒有分配 未使用空間。
-
len表示SDS儲存了無位元組長的字串。
-
buf是一個char陣列。
SDS與C字串區別
-
O(1)複雜度獲取字串長度。
-
防止緩衝區溢位。
-
減少修改字串時帶來的記憶體重分配次數。
字串
命令
set key value [ex seconds] [px milliseconds] [nx|xx]
內部編碼
字串型別的內部編碼有3種:
-
int:8個位元組長整型。
-
embstr:小於等於39個位元組的字串。
-
raw:大於39個位元組的字串。
Redis會根據當前值的型別和長度決定使用哪種內部編碼實現。
整數:
set key 8653
ok
object encoding key
"int"
短字元:
set key "hello"
ok
object encoding key
"embstr"
長字元:
set key "40 bytes"
ok
object encoding key
"raw"
使用場景
-
快取
-
計數
-
Session集中管理
-
限速
雜湊
命令
hset key field value
hset uset:1 name tom
hget key field
hget uset:1 name
"tom"
內部編碼
- ziplist(壓縮列表):雜湊型別元素個數小於hash-max-ziplist-entries預設512個、同時所有值都小於hash-max-
ziplist-value配置時,Redis會使用ziplist實現,節省記憶體方面比hashtable優秀。
- hashtable:雜湊型別無法滿足ziplist條件時,會用這個,hashtable的讀寫時間複雜度都是O(1)。
hset hashkey f3 "bigger than 64 bytes"
object encoding hashkey
"hashtable"
hmset hashkey f1 v1 f2 v2 f3 v3 ...... f513 v513
object encoding hashkey
"hashtable"
列表
從右邊插入元素:rpush key value
lrange listkey 0 -1
從左邊插入元素:lpush key value
linsert key before | after pivot value
查詢:lrange key start end
刪除:lpop key
內部編碼
-
ziplist:元素個數小於list-max-ziplist-entries,同時每個值都小於list-max-ziplist-value,Redis選用壓縮列表減少記憶體。
-
linkedlist:無法滿足ziplist就會用連結串列來實現。
使用場景
-
訊息佇列
-
文章列表
集合
用來儲存多個的字串元素,不允許重複元素,無序。
sadd key a b c 新增key
3
srem key a b 刪除key
2
scard key 計算key
1
smembers key 獲取所有元素
sinter key 求交集
suinon key 求並集
sdiff key 求差集
內部編碼
-
intset(整數集合)
-
hashtable
使用場景
標籤(tag)
給使用者新增標籤
sadd user:1:tags tag1 tag2 tag3
sadd uset:1:tags tag1 tag2 tag3
給標籤新增使用者
sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2
計算使用者共同感興趣的標籤
sinter user:1:tag2 user:2:tag
有序集合
不能重複,可以排序的set,給每個元素設定了一個score作為排序的依據。
列表、集合和有序集合三者異同點
命令
zadd key score member 新增成員
zadd user:ranking 251 tom
有序集合提供排序欄位,產生代價,zadd複雜度為Ologn,sadd為O1。
zcard user:ranking 計算成員數
zscore key member 返回某個成員分數
zrank key member 計算成員的排名
zrem key member 刪除成員
zrange ...
集合間的操作
(1)交集
(2)並集
內部編碼
-
壓縮列表
-
跳躍表
使用場景
新增使用者贊數:
zadd user:ranking:2016_03_15 mike 3
獲得贊後:
zincrby user:ranking:2016_03_15 mike 1
取消贊:
zrem
獲取贊數最多的十個使用者:
zrevrangebyrank user:ranking:2016_0315 0 9
展示使用者資訊以及使用者分數:
此功能將使用者名稱作為鍵字尾,將使用者資訊儲存在雜湊型別中,至於使用者的分數和排名可以使用zscore和zrank
hgetall user:info:tom
zscore user:ranking:2016_03_15 mike
zrank user:ranking:2016_03_15 mike
待更新:
Bitmaps
HyperLogLog
GEO
Reference
《Redis設計與實現》
《Redis開發與運維》