Redis入門 - 數據類型:5種基礎數據類型詳解

Redis所有的key(鍵)都是字符串。我們在談基礎數據結構時,討論的是存儲值的數據類型,主要包括常見的5種數據類型,分別是:String、List、Set、Zset、Hash

Redis數據結構簡介

Redis基礎文章非常多,關於基礎數據結構類型,我推薦你先看下官方網站內容,然後再看下面的小結

首先對redis來說,所有的key(鍵)都是字符串。我們在談基礎數據結構時,討論的是存儲值的數據類型,主要包括常見的5種數據類型,分別是:String、List、Set、Zset、Hash。

結構類型 結構存儲的值 結構的讀寫能力
String字符串 可以是字符串、整數或浮點數 對整個字符串或字符串的一部分進行操作;對整數或浮點數進行自增或自減操作;
List列表 一個鏈表,鏈表上的每個節點都包含一個字符串 對鏈表的兩端進行push和pop操作,讀取單個或多個元素;根據值查找或刪除元素;
Set集合 包含字符串的無序集合 字符串的集合,包含基礎的方法有看是否存在添加、獲取、刪除;還包含計算交集、並集、差集等
Hash散列 包含鍵值對的無序散列表 包含方法有添加、獲取、刪除單個元素
Zset有序集合 和散列一樣,用於存儲鍵值對 字符串成員與浮點數分數之間的有序映射;元素的排列順序由分數的大小決定;包含方法有添加、獲取、刪除單個元素以及根據分值範圍或成員來獲取元素

基礎數據結構詳解

內容其實比較簡單,我覺得理解的重點在於這個結構怎麼用,能夠用來做什麼?所以我在梳理時,圍繞圖例命令執行場景來闡述。@pdai

String字符串

String是redis中最基本的數據類型,一個key對應一個value。

String類型是二進制安全的,意思是 redis 的 string 可以包含任何數據。如數字,字符串,jpg圖片或者序列化的對象。

  • 圖例

下圖是一個String類型的實例,其中鍵爲hello,值爲world

  • 命令使用
命令 簡述 使用
GET 獲取存儲在給定鍵中的值 GET name
SET 設置存儲在給定鍵中的值 SET name value
DEL 刪除存儲在給定鍵中的值 DEL name
INCR 將鍵存儲的值加1 INCR key
DECR 將鍵存儲的值減1 DECR key
INCRBY 將鍵存儲的值加上整數 INCRBY key amount
DECRBY 將鍵存儲的值減去整數 DECRBY key amount
  • 命令執行
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
"3"
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
"103"
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
"102"
  • 實戰場景
    • 緩存: 經典使用場景,把常用信息,字符串,圖片或者視頻等信息放到redis中,redis作爲緩存層,mysql做持久化層,降低mysql的讀寫壓力。
    • 計數器:redis是單線程模型,一個命令執行完纔會執行下一個,同時數據可以一步落地到其他的數據源。
    • session:常見方案spring session + redis實現session共享,

List列表

Redis中的List其實就是鏈表(Redis用雙端鏈表實現List)。

使用List結構,我們可以輕鬆地實現最新消息排隊功能(比如新浪微博的TimeLine)。List的另一個應用就是消息隊列,可以利用List的 PUSH 操作,將任務存放在List中,然後工作線程再用 POP 操作將任務取出進行執行。

  • 圖例

  • 命令使用
命令 簡述 使用
RPUSH 將給定值推入到列表右端 RPUSH key value
LPUSH 將給定值推入到列表左端 LPUSH key value
RPOP 從列表的右端彈出一個值,並返回被彈出的值 RPOP key
LPOP 從列表的左端彈出一個值,並返回被彈出的值 LPOP key
LRANGE 獲取列表在給定範圍上的所有值 LRANGE key 0 -1
LINDEX 通過索引獲取列表中的元素。你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。 LINEX key index
  • 使用列表的技巧

    • lpush+lpop=Stack(棧)
    • lpush+rpop=Queue(隊列)
    • lpush+ltrim=Capped Collection(有限集合)
    • lpush+brpop=Message Queue(消息隊列)
  • 命令執行

127.0.0.1:6379> lpush mylist 1 2 ll ls mem
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "mem"
2) "ls"
3) "ll"
4) "2"
5) "1"
127.0.0.1:6379> lindex mylist -1
"1"
127.0.0.1:6379> lindex mylist 10        # index不在 mylist 的區間範圍內
(nil)
  • 實戰場景
    • 微博TimeLine: 有人發佈微博,用lpush加入時間軸,展示新的列表信息。
    • 消息隊列

Set集合

Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據。

Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。

  • 圖例

  • 命令使用
命令 簡述 使用
SADD 向集合添加一個或多個成員 SADD key value
SCARD 獲取集合的成員數 SCARD key
SMEMBER 返回集合中的所有成員 SMEMBER key member
SISMEMBER 判斷 member 元素是否是集合 key 的成員 SISMEMBER key member

其它一些集合操作,請參考這裏https://www.runoob.com/redis/redis-sets.html

  • 命令執行
127.0.0.1:6379> sadd myset hao hao1 xiaohao hao
(integer) 3
127.0.0.1:6379> smember myset
1) "xiaohao"
2) "hao1"
3) "hao"
127.0.0.1:6379> sismember myset hao
(integer) 1
  • 實戰場景
    • 標籤(tag),給用戶添加標籤,或者用戶給消息添加標籤,這樣有同一標籤或者類似標籤的可以給推薦關注的事或者關注的人。
    • 點贊,或點踩,收藏等,可以放到set中實現

Hash散列

Redis hash 是一個 string 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用於存儲對象。

  • 圖例

  • 命令使用
命令 簡述 使用
HSET 添加鍵值對 HSET hash-key sub-key1 value1
HGET 獲取指定散列鍵的值 HGET hash-key key1
HGETALL 獲取散列中包含的所有鍵值對 HGETALL hash-key
HDEL 如果給定鍵存在於散列中,那麼就移除這個鍵 HDEL hash-key sub-key1
  • 命令執行
127.0.0.1:6379> hset user name1 hao
(integer) 1
127.0.0.1:6379> hset user email1 [email protected]
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "[email protected]"
127.0.0.1:6379> hget user user
(nil)
127.0.0.1:6379> hget user name1
"hao"
127.0.0.1:6379> hset user name2 xiaohao
(integer) 1
127.0.0.1:6379> hset user email2 [email protected]
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "[email protected]"
5) "name2"
6) "xiaohao"
7) "email2"
8) "[email protected]"
  • 實戰場景
    • 緩存: 能直觀,相比string更節省空間,的維護緩存信息,如用戶信息,視頻信息等。

Zset有序集合

Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來爲集合中的成員進行從小到大的排序。

有序集合的成員是唯一的,但分數(score)卻可以重複。集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。

  • 圖例

  • 命令使用
命令 簡述 使用
ZADD 將一個帶有給定分值的成員添加到哦有序集合裏面 ZADD zset-key 178 member1
ZRANGE 根據元素在有序集合中所處的位置,從有序集合中獲取多個元素 ZRANGE zset-key 0-1 withccores
ZREM 如果給定元素成員存在於有序集合中,那麼就移除這個元素 ZREM zset-key member1

更多命令請參考這裏 https://www.runoob.com/redis/redis-sorted-sets.html

  • 命令執行
127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao
(integer) 2
127.0.0.1:6379> ZRANGE myscoreset 0 -1
1) "xiaohao"
2) "hao"
127.0.0.1:6379> ZSCORE myscoreset hao
"100"
  • 實戰場景
    • 排行榜:有序集合經典使用場景。例如小說視頻等網站需要對用戶上傳的小說視頻做排行榜,榜單可以按照用戶關注數,更新時間,字數等打分,做排行。

參考文章

知識體系

知識體系

相關文章

首先,我們通過學習Redis的概念基礎,瞭解它適用的場景。

  • Redis入門 - Redis概念和基礎
    • Redis是一種支持key-value等多種數據結構的存儲系統。可用於緩存,事件發佈或訂閱,高速隊列等場景。支持網絡,提供字符串,哈希,列表,隊列,集合結構直接存取,基於內存,可持久化。

其次,這些適用場景都是基於Redis支持的數據類型的,所以我們需要學習它支持的數據類型;同時在redis優化中還需要對底層數據結構瞭解,所以也需要了解一些底層數據結構的設計和實現。

再者,需要學習Redis支持的核心功能,包括持久化,消息,事務,高可用;高可用方面包括,主從,哨兵等;高可拓展方面,比如 分片機制等。

  • Redis進階 - 持久化:RDB和AOF機制詳解
    • 爲了防止數據丟失以及服務重啓時能夠恢復數據,Redis支持數據的持久化,主要分爲兩種方式,分別是RDB和AOF; 當然實際場景下還會使用這兩種的混合模式。
  • Redis進階 - 消息傳遞:發佈訂閱模式詳解
    • Redis 發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
  • Redis進階 - 事件:Redis事件機制詳解
    • Redis 採用事件驅動機制來處理大量的網絡IO。它並沒有使用 libevent 或者 libev 這樣的成熟開源方案,而是自己實現一個非常簡潔的事件驅動庫 ae_event。
  • Redis進階 - 事務:Redis事務詳解
    • Redis 事務的本質是一組命令的集合。事務支持一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會按照順序串行化執行隊列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
  • Redis進階 - 高可用:主從複製詳解
    • 我們知道要避免單點故障,即保證高可用,便需要冗餘(副本)方式提供集羣服務。而Redis 提供了主從庫模式,以保證數據副本的一致,主從庫之間採用的是讀寫分離的方式。本文主要闡述Redis的主從複製。
  • Redis進階 - 高可用:哨兵機制(Redis Sentinel)詳解
    • 在上文主從複製的基礎上,如果注節點出現故障該怎麼辦呢? 在 Redis 主從集羣中,哨兵機制是實現主從庫自動切換的關鍵機制,它有效地解決了主從複製模式下故障轉移的問題。
  • Redis進階 - 高可拓展:分片技術(Redis Cluster)詳解
    • 前面兩篇文章,主從複製和哨兵機制保障了高可用,就讀寫分離而言雖然slave節點來擴展主從的讀併發能力,但是寫能力和存儲能力是無法進行擴展的,就只能是master節點能夠承載的上限。如果面對海量數據那麼必然需要構建master(主節點分片)之間的集羣,同時必然需要吸收高可用(主從複製和哨兵機制)能力,即每個master分片節點還需要有slave節點,這是分佈式系統中典型的縱向擴展(集羣的分片技術)的體現;所以在Redis 3.0版本中對應的設計就是Redis Cluster。

最後,就是具體的實踐以及實踐中遇到的問題和解決方法了:在不同版本中有不同特性,所以還需要了解版本;以及性能優化,大廠實踐等。

  • Redis進階 - 緩存問題:一致性, 穿擊, 穿透, 雪崩, 污染等
    • Redis最常用的一個場景就是作爲緩存,本文主要探討作爲緩存,在實踐中可能會有哪些問題?比如一致性, 穿擊, 穿透, 雪崩, 污染等
  • Redis進階 - 版本特性: Redis4.0、5.0、6.0特性整理
    • 在學習Redis知識體系時,我們難免會需要查看版本實現之間的差異,本文主要整理Redis較爲新的版本的特性。
  • Redis進階 - 運維監控:Redis的監控詳解
    • Redis實戰中包含開發,集羣 和 運維,Redis用的好不好,如何讓它更好,這是運維要做的;本文主要在 Redis自身狀態及命令可視化監控工具,以及Redis監控體系等方面幫助你構建對redis運維/監控體系的認知,它是性能優化的前提。
  • Redis進階 - 性能調優:Redis性能調優詳解
    • Redis 的性能問題,涉及到的知識點非常廣,幾乎涵蓋了 CPU、內存、網絡、甚至磁盤的方方面面;同時還需要對上文中一些基礎或底層有詳細的瞭解。針對Redis的性能調優,這裏整理分享一篇水滴與銀彈(公衆號)的文章,這篇文章可以幫助你構築Redis性能調優的知識體系。
  • Redis大廠經驗 - 微博:萬億級日訪問量下,Redis在微博的9年優化歷程
    • 再分享一篇微博使用redis的經驗的文章,因爲Redis在微博內部分佈在各個應用場景,比如像現在春晚必爭的“紅包飛”活動,還有像粉絲數、用戶數、閱讀數、轉評贊、評論蓋樓、廣告推薦、負反饋、音樂榜單等等都有用到Redis;我們可以通過大廠使用redis的經驗來強化對redis使用上的認知。

學習資料

除此之外,我還推薦你看下 極客時間 《Redis核心技術與實戰》(作者:蔣德鈞)的相關內容,它是我看到的爲數不多的含有實戰經驗比較多的專欄,部分文章中圖片也來源於這個系列。

本篇文章由一文多發平臺ArtiPub自動發佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章