SDS簡單動態字串

struct sdshdr {

// 記錄buf陣列中已使用位元組的數量

// 等於SDS所儲存字串的長度

int len;

// 記錄buf陣列中未使用位元組的數量

int free;

// 位元組陣列,用於儲存字串

char buf[];

}

  • free表示這個SDS沒有分配 未使用空間。

  • len表示SDS儲存了無位元組長的字串。

  • buf是一個char陣列。

SDS與C字串區別

  1. O(1)複雜度獲取字串長度。

  2. 防止緩衝區溢位。

  3. 減少修改字串時帶來的記憶體重分配次數。

字串

命令

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"

使用場景

  1. 快取

  2. 計數

  3. Session集中管理

  4. 限速

雜湊

命令

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就會用連結串列來實現。

使用場景

  1. 訊息佇列

  2. 文章列表

集合

用來儲存多個的字串元素,不允許重複元素,無序。

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開發與運維》