redis資料型別及應用場景

AprMay發表於2021-03-30

一、redis特點

1.所有的資料都儲存在記憶體中,高速的讀寫。
2.redis的所有操作都是原子性的,支援多個操作合併後的原子性執行,支援事務。
3.提供資料持久化,RDB和AOF。
4.提供了豐富的資料型別,主要5大資料型別:string、hash、list、set、sort set……
5.支援資料備份,即master-slave模式的資料備份。
6.豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

二、redis5大資料型別的設計及應用場景

string

string介紹

string型別是redis的基本資料型別,key-value結構,key是某個資料的在redis中的唯一標識,value是具體的資料,redis的string在底層實現是SDS(simple dynamic string)

set name "hello world"

實際上在redis內部建立了兩個SDS,一個為name的key的SDS,一個為hello world的SDS

struct sdshdr {
// 記錄buf陣列中已使用位元組的數量,等於SDS所儲存字串長度
int len;
// 記錄buf陣列中未使用位元組數量
int free;
// 位元組陣列,使用者儲存字串
char buf[]
}

sds資料結構

應用場景

資料表user結構

id name email
1 jack jack@126.com
2 mary mary@163.com

儲存表中某個欄位的值

set user:id:1 email jack@126.com

儲存物件
將物件以json的格式或者其他物件格式化的字串

set user:id:1 '[{"id":1,"name":"jack","email":jack@126.com}]'

Hash

Hash介紹

redis的Hash型別很像一張關係型資料庫的資料表,Hash的key是一個唯一值,Value則是一個Hashmap的結構,Hash也有兩種資料結構,分別是ziplist和雜湊表,當資料量較小的時候採用ziplist進行儲存,當資料超過512個,單個長度大於64位元組將採用雜湊表,這裡雜湊表採用的是murmurhash2演算法,採用鏈地址法來解決hash衝突問題。此外,Redis還支援雜湊表的動態擴容、縮容。注意,這裡在redis裡面擴容是分批進行的,避免一次性擴容進行資料搬遷造成服務停頓現象。

應用場景

Hashmap
Hash資料型別在儲存上圖中資料時比string型別更加的靈活,string需要轉json或者其他格式的字串,而Hashmap則不需要,而且記憶體開銷佔優勢。

hmset user:1 name jack email jack@126.com

獲取設定的值

hget user:1 email

List

List介紹

list是按照插入的順序的字串連結串列,List的底層是雙項鍊表實現的,兩端新增元素的複雜度O(1)。
雙向連結串列

應用場景

訊息佇列

注意點

雙向連結串列從頭或者尾部插入資料效能非常高,複雜度O(1),如果從中間插入,會複雜一些,必須要修改前一個和後一個的節點指標,由圖可以看出來

SET

SET介紹

set資料型別是一個不重複的集合(沒有排序),可以對set集合進行新增,刪除,判斷是否存在的,可以對多個set進行集合的差集,交集,並集,補集操作,set的底層結構。
在redis中,我們可以檢視intset.h檔案,這是一個儲存整數的集合,其結構如下:

typedef strut intset{
uint32_t encoding;
uint32_t length
int8_t contents
}intset;

其中各欄位含義如下:

  • encoding:資料編碼格式,表示每個資料元素用幾個位元組儲存(可取的值有2、4,和8)
  • length:元素個數
  • contents:柔性陣列,這部分記憶體單獨分配,不包含在intset中

具體的操作我們就不詳細展開了,瞭解集合這種資料結構的應該都很清楚,我們這裡說一下,intset有一個資料升級的概念,比方說我們有一個16位整數的set,這時候插入了一個32位整數,所以就導致整個集合都升級為32位整數,但是反過來卻不行,這也就是柔性陣列的由來如果集合過大,會採用dict的方式來進行儲存

應用場景

共同好友

ZSET

ZSET介紹

ZSET在SET的基礎之上給集合的每個元素關聯了一個分數,往集合中插入資料的時候會根據這個分數排序,底層的儲存方式一種是ziplist/zipmap的格式,還有一種是skiplist跳躍表感興趣可以去了解下。

ZSET應用

好友列表的排序(根據一些特性設定,親密度等)等

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章