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"
- 實戰場景
- 排行榜:有序集合經典使用場景。例如小說視頻等網站需要對用戶上傳的小說視頻做排行榜,榜單可以按照用戶關注數,更新時間,字數等打分,做排行。
參考文章
- http://ddrv.cn/a/260579
- https://www.cnblogs.com/haoprogrammer/p/11065461.html
- https://www.pianshen.com/article/6479421770/
- https://www.runoob.com/redis/redis-sorted-sets.html
知識體系
知識體系
相關文章
首先,我們通過學習Redis的概念基礎,瞭解它適用的場景。
- Redis入門 - Redis概念和基礎
- Redis是一種支持key-value等多種數據結構的存儲系統。可用於緩存,事件發佈或訂閱,高速隊列等場景。支持網絡,提供字符串,哈希,列表,隊列,集合結構直接存取,基於內存,可持久化。
其次,這些適用場景都是基於Redis支持的數據類型的,所以我們需要學習它支持的數據類型;同時在redis優化中還需要對底層數據結構瞭解,所以也需要了解一些底層數據結構的設計和實現。
- Redis入門 - 數據類型:5種基礎數據類型詳解
- Redis所有的key(鍵)都是字符串。我們在談基礎數據結構時,討論的是存儲值的數據類型,主要包括常見的5種數據類型,分別是:String、List、Set、Zset、Hash
- Redis入門 - 數據類型:3種特殊類型詳解
- Redis除了上文中5種基礎數據類型,還有三種特殊的數據類型,分別是 HyperLogLogs(基數統計), Bitmaps (位圖) 和 geospatial (地理位置)
- Redis入門 - 數據類型:Stream詳解
- Redis5.0 中還增加了一個數據結構Stream,它借鑑了Kafka的設計,是一個新的強大的支持多播的可持久化的消息隊列。
- Redis進階 - 底層數據結構:對象機制詳解
- 我們在前文已經闡述了Redis 5種基礎數據類型詳解,分別是字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset),以及5.0版本中Redis Stream結構詳解;那麼這些基礎類型的底層是如何實現的呢?Redis的每種對象其實都由對象結構(redisObject) 與 對應編碼的數據結構組合而成, 本文主要介紹對象結構(redisObject) 部分。。
- Redis進階 - 底層數據結構:底層數據結構詳解
- 前文是第一部分底層設計:對象機制詳解, 本文主要介紹底層數據結構 部分。
- Redis進階 - 底層數據結構: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官網:http://redis.io/
-
Redis官方文檔:http://redis.io/documentation
-
Redis下載:http://redis.io/download
-
redis英文文檔 https://redis.io/topics/data-types
-
redis中文文檔 http://www.redis.cn/documentation.html
-
《redis設計與實現 3.0版本》 http://redisbook.com/index.html
-
redis源碼解讀 3.2.8版本 https://blog.csdn.net/men_wen/article/details/75668345
除此之外,我還推薦你看下 極客時間 《Redis核心技術與實戰》(作者:蔣德鈞)的相關內容,它是我看到的爲數不多的含有實戰經驗比較多的專欄,部分文章中圖片也來源於這個系列。
本篇文章由一文多發平臺ArtiPub自動發佈