Redis入門 - 數(shù)據(jù)類型:5種基礎(chǔ)數(shù)據(jù)類型詳解

Redis所有的key(鍵)都是字符串莉御。我們在談基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)時撇吞,討論的是存儲值的數(shù)據(jù)類型,主要包括常見的5種數(shù)據(jù)類型礁叔,分別是:String牍颈、List、Set琅关、Zset煮岁、Hash

Redis數(shù)據(jù)結(jié)構(gòu)簡介

Redis基礎(chǔ)文章非常多,關(guān)于基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)類型涣易,我推薦你先看下官方網(wǎng)站內(nèi)容画机,然后再看下面的小結(jié)

首先對redis來說,所有的key(鍵)都是字符串新症。我們在談基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)時步氏,討論的是存儲值的數(shù)據(jù)類型,主要包括常見的5種數(shù)據(jù)類型徒爹,分別是:String荚醒、List芋类、Set、Zset界阁、Hash侯繁。

image
結(jié)構(gòu)類型 結(jié)構(gòu)存儲的值 結(jié)構(gòu)的讀寫能力
String字符串 可以是字符串、整數(shù)或浮點數(shù) 對整個字符串或字符串的一部分進(jìn)行操作泡躯;對整數(shù)或浮點數(shù)進(jìn)行自增或自減操作贮竟;
List列表 一個鏈表,鏈表上的每個節(jié)點都包含一個字符串 對鏈表的兩端進(jìn)行push和pop操作精续,讀取單個或多個元素坝锰;根據(jù)值查找或刪除元素;
Set集合 包含字符串的無序集合 字符串的集合重付,包含基礎(chǔ)的方法有看是否存在添加顷级、獲取、刪除确垫;還包含計算交集弓颈、并集、差集等
Hash散列 包含鍵值對的無序散列表 包含方法有添加、獲取、刪除單個元素
Zset有序集合 和散列一樣人断,用于存儲鍵值對 字符串成員與浮點數(shù)分?jǐn)?shù)之間的有序映射;元素的排列順序由分?jǐn)?shù)的大小決定纤子;包含方法有添加、獲取款票、刪除單個元素以及根據(jù)分值范圍或成員來獲取元素

基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)詳解

內(nèi)容其實比較簡單控硼,我覺得理解的重點在于這個結(jié)構(gòu)怎么用,能夠用來做什么艾少?所以我在梳理時卡乾,圍繞圖例命令缚够,執(zhí)行場景來闡述幔妨。@pdai

String字符串

String是redis中最基本的數(shù)據(jù)類型,一個key對應(yīng)一個value谍椅。

String類型是二進(jìn)制安全的误堡,意思是 redis 的 string 可以包含任何數(shù)據(jù)。如數(shù)字雏吭,字符串锁施,jpg圖片或者序列化的對象。

  • 圖例

下圖是一個String類型的實例思恐,其中鍵為hello沾谜,值為world

image
  • 命令使用
命令 簡述 使用
GET 獲取存儲在給定鍵中的值 GET name
SET 設(shè)置存儲在給定鍵中的值 SET name value
DEL 刪除存儲在給定鍵中的值 DEL name
INCR 將鍵存儲的值加1 INCR key
DECR 將鍵存儲的值減1 DECR key
INCRBY 將鍵存儲的值加上整數(shù) INCRBY key amount
DECRBY 將鍵存儲的值減去整數(shù) DECRBY key amount
  • 命令執(zhí)行
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"
  • 實戰(zhàn)場景
    • 緩存: 經(jīng)典使用場景,把常用信息胀莹,字符串基跑,圖片或者視頻等信息放到redis中,redis作為緩存層描焰,mysql做持久化層媳否,降低mysql的讀寫壓力。
    • 計數(shù)器:redis是單線程模型荆秦,一個命令執(zhí)行完才會執(zhí)行下一個篱竭,同時數(shù)據(jù)可以一步落地到其他的數(shù)據(jù)源。
    • session:常見方案spring session + redis實現(xiàn)session共享步绸,

List列表

Redis中的List其實就是鏈表(Redis用雙端鏈表實現(xiàn)List)掺逼。

使用List結(jié)構(gòu),我們可以輕松地實現(xiàn)最新消息排隊功能(比如新浪微博的TimeLine)瓤介。List的另一個應(yīng)用就是消息隊列吕喘,可以利用List的 PUSH 操作,將任務(wù)存放在List中刑桑,然后工作線程再用 POP 操作將任務(wù)取出進(jìn)行執(zhí)行氯质。

  • 圖例
image
  • 命令使用
命令 簡述 使用
RPUSH 將給定值推入到列表右端 RPUSH key value
LPUSH 將給定值推入到列表左端 LPUSH key value
RPOP 從列表的右端彈出一個值,并返回被彈出的值 RPOP key
LPOP 從列表的左端彈出一個值祠斧,并返回被彈出的值 LPOP key
LRANGE 獲取列表在給定范圍上的所有值 LRANGE key 0 -1
LINDEX 通過索引獲取列表中的元素闻察。你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個元素琢锋, -2 表示列表的倒數(shù)第二個元素辕漂,以此類推。 LINEX key index
  • 使用列表的技巧
    • lpush+lpop=Stack(棧)
    • lpush+rpop=Queue(隊列)
    • lpush+ltrim=Capped Collection(有限集合)
    • lpush+brpop=Message Queue(消息隊列)
  • 命令執(zhí)行
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 的區(qū)間范圍內(nèi)
(nil)
  • 實戰(zhàn)場景
    • 微博TimeLine: 有人發(fā)布微博吩蔑,用lpush加入時間軸钮热,展示新的列表信息。
    • 消息隊列

Set集合

Redis 的 Set 是 String 類型的無序集合烛芬。集合成員是唯一的隧期,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。

Redis 中集合是通過哈希表實現(xiàn)的赘娄,所以添加仆潮,刪除,查找的復(fù)雜度都是 O(1)遣臼。

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

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

  • 命令執(zhí)行
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
  • 實戰(zhàn)場景
    • 標(biāo)簽(tag),給用戶添加標(biāo)簽,或者用戶給消息添加標(biāo)簽揍堰,這樣有同一標(biāo)簽或者類似標(biāo)簽的可以給推薦關(guān)注的事或者關(guān)注的人鹏浅。
    • 點贊嗅义,或點踩,收藏等隐砸,可以放到set中實現(xiàn)

Hash散列

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

  • 圖例
image
  • 命令使用
命令 簡述 使用
HSET 添加鍵值對 HSET hash-key sub-key1 value1
HGET 獲取指定散列鍵的值 HGET hash-key key1
HGETALL 獲取散列中包含的所有鍵值對 HGETALL hash-key
HDEL 如果給定鍵存在于散列中季希,那么就移除這個鍵 HDEL hash-key sub-key1
  • 命令執(zhí)行
127.0.0.1:6379> hset user name1 hao
(integer) 1
127.0.0.1:6379> hset user email1 hao@163.com
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "hao@163.com"
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 xiaohao@163.com
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "hao@163.com"
5) "name2"
6) "xiaohao"
7) "email2"
8) "xiaohao@163.com"
  • 實戰(zhàn)場景
    • 緩存: 能直觀褪那,相比string更節(jié)省空間,的維護(hù)緩存信息式塌,如用戶信息博敬,視頻信息等。

Zset有序集合

Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復(fù)的成員峰尝。不同的是每個元素都會關(guān)聯(lián)一個 double 類型的分?jǐn)?shù)偏窝。redis 正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。

有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)武学。集合是通過哈希表實現(xiàn)的囚枪,所以添加,刪除劳淆,查找的復(fù)雜度都是 O(1)链沼。

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

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

  • 命令執(zhí)行
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"
  • 實戰(zhàn)場景
    • 排行榜:有序集合經(jīng)典使用場景括勺。例如小說視頻等網(wǎng)站需要對用戶上傳的小說視頻做排行榜,榜單可以按照用戶關(guān)注數(shù)曲掰,更新時間疾捍,字?jǐn)?shù)等打分,做排行栏妖。

參考文章

知識體系

知識體系

image

相關(guān)文章

首先乱豆,我們通過學(xué)習(xí)Redis的概念基礎(chǔ),了解它適用的場景吊趾。

  • Redis入門 - Redis概念和基礎(chǔ)
    • Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲系統(tǒng)宛裕。可用于緩存论泛,事件發(fā)布或訂閱揩尸,高速隊列等場景。支持網(wǎng)絡(luò)屁奏,提供字符串岩榆,哈希,列表,隊列勇边,集合結(jié)構(gòu)直接存取犹撒,基于內(nèi)存,可持久化粒褒。

其次油航,這些適用場景都是基于Redis支持的數(shù)據(jù)類型的,所以我們需要學(xué)習(xí)它支持的數(shù)據(jù)類型怀浆;同時在redis優(yōu)化中還需要對底層數(shù)據(jù)結(jié)構(gòu)了解,所以也需要了解一些底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計和實現(xiàn)怕享。

image

再者称开,需要學(xué)習(xí)Redis支持的核心功能,包括持久化,消息鳖轰,事務(wù)清酥,高可用;高可用方面包括蕴侣,主從焰轻,哨兵等;高可拓展方面昆雀,比如 分片機制等辱志。

  • Redis進(jìn)階 - 持久化:RDB和AOF機制詳解
    • 為了防止數(shù)據(jù)丟失以及服務(wù)重啟時能夠恢復(fù)數(shù)據(jù),Redis支持?jǐn)?shù)據(jù)的持久化狞膘,主要分為兩種方式揩懒,分別是RDB和AOF; 當(dāng)然實際場景下還會使用這兩種的混合模式。
  • Redis進(jìn)階 - 消息傳遞:發(fā)布訂閱模式詳解
    • Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息挽封,訂閱者(sub)接收消息已球。
  • Redis進(jìn)階 - 事件:Redis事件機制詳解
    • Redis 采用事件驅(qū)動機制來處理大量的網(wǎng)絡(luò)IO。它并沒有使用 libevent 或者 libev 這樣的成熟開源方案辅愿,而是自己實現(xiàn)一個非常簡潔的事件驅(qū)動庫 ae_event智亮。
  • Redis進(jìn)階 - 事務(wù):Redis事務(wù)詳解
    • Redis 事務(wù)的本質(zhì)是一組命令的集合。事務(wù)支持一次執(zhí)行多個命令点待,一個事務(wù)中所有命令都會被序列化阔蛉。在事務(wù)執(zhí)行過程,會按照順序串行化執(zhí)行隊列中的命令癞埠,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中馍忽。
  • Redis進(jìn)階 - 高可用:主從復(fù)制詳解
    • 我們知道要避免單點故障,即保證高可用燕差,便需要冗余(副本)方式提供集群服務(wù)遭笋。而Redis 提供了主從庫模式,以保證數(shù)據(jù)副本的一致徒探,主從庫之間采用的是讀寫分離的方式瓦呼。本文主要闡述Redis的主從復(fù)制。
  • Redis進(jìn)階 - 高可用:哨兵機制(Redis Sentinel)詳解
    • 在上文主從復(fù)制的基礎(chǔ)上测暗,如果注節(jié)點出現(xiàn)故障該怎么辦呢央串? 在 Redis 主從集群中,哨兵機制是實現(xiàn)主從庫自動切換的關(guān)鍵機制碗啄,它有效地解決了主從復(fù)制模式下故障轉(zhuǎn)移的問題质和。
  • Redis進(jìn)階 - 高可拓展:分片技術(shù)(Redis Cluster)詳解
    • 前面兩篇文章,主從復(fù)制和哨兵機制保障了高可用稚字,就讀寫分離而言雖然slave節(jié)點來擴(kuò)展主從的讀并發(fā)能力饲宿,但是寫能力和存儲能力是無法進(jìn)行擴(kuò)展的厦酬,就只能是master節(jié)點能夠承載的上限。如果面對海量數(shù)據(jù)那么必然需要構(gòu)建master(主節(jié)點分片)之間的集群瘫想,同時必然需要吸收高可用(主從復(fù)制和哨兵機制)能力仗阅,即每個master分片節(jié)點還需要有slave節(jié)點,這是分布式系統(tǒng)中典型的縱向擴(kuò)展(集群的分片技術(shù))的體現(xiàn)国夜;所以在Redis 3.0版本中對應(yīng)的設(shè)計就是Redis Cluster减噪。

最后,就是具體的實踐以及實踐中遇到的問題和解決方法了:在不同版本中有不同特性车吹,所以還需要了解版本筹裕;以及性能優(yōu)化,大廠實踐等窄驹。

  • Redis進(jìn)階 - 緩存問題:一致性, 穿擊, 穿透, 雪崩, 污染等
    • Redis最常用的一個場景就是作為緩存朝卒,本文主要探討作為緩存,在實踐中可能會有哪些問題馒吴?比如一致性, 穿擊, 穿透, 雪崩, 污染等
  • Redis進(jìn)階 - 版本特性: Redis4.0、5.0瑟曲、6.0特性整理
    • 在學(xué)習(xí)Redis知識體系時饮戳,我們難免會需要查看版本實現(xiàn)之間的差異,本文主要整理Redis較為新的版本的特性洞拨。
  • Redis進(jìn)階 - 運維監(jiān)控:Redis的監(jiān)控詳解
    • Redis實戰(zhàn)中包含開發(fā)扯罐,集群 和 運維,Redis用的好不好烦衣,如何讓它更好歹河,這是運維要做的;本文主要在 Redis自身狀態(tài)及命令花吟,可視化監(jiān)控工具秸歧,以及Redis監(jiān)控體系等方面幫助你構(gòu)建對redis運維/監(jiān)控體系的認(rèn)知,它是性能優(yōu)化的前提衅澈。
  • Redis進(jìn)階 - 性能調(diào)優(yōu):Redis性能調(diào)優(yōu)詳解
    • Redis 的性能問題键菱,涉及到的知識點非常廣,幾乎涵蓋了 CPU今布、內(nèi)存经备、網(wǎng)絡(luò)、甚至磁盤的方方面面部默;同時還需要對上文中一些基礎(chǔ)或底層有詳細(xì)的了解侵蒙。針對Redis的性能調(diào)優(yōu),這里整理分享一篇水滴與銀彈(公眾號)的文章傅蹂,這篇文章可以幫助你構(gòu)筑Redis性能調(diào)優(yōu)的知識體系纷闺。
  • Redis大廠經(jīng)驗 - 微博:萬億級日訪問量下算凿,Redis在微博的9年優(yōu)化歷程
    • 再分享一篇微博使用redis的經(jīng)驗的文章,因為Redis在微博內(nèi)部分布在各個應(yīng)用場景急但,比如像現(xiàn)在春晚必爭的“紅包飛”活動澎媒,還有像粉絲數(shù)、用戶數(shù)波桩、閱讀數(shù)戒努、轉(zhuǎn)評贊、評論蓋樓镐躲、廣告推薦储玫、負(fù)反饋、音樂榜單等等都有用到Redis萤皂;我們可以通過大廠使用redis的經(jīng)驗來強化對redis使用上的認(rèn)知撒穷。

學(xué)習(xí)資料

除此之外,我還推薦你看下 極客時間 《Redis核心技術(shù)與實戰(zhàn)》(作者:蔣德鈞)的相關(guān)內(nèi)容裆熙,它是我看到的為數(shù)不多的含有實戰(zhàn)經(jīng)驗比較多的專欄端礼,部分文章中圖片也來源于這個系列。

本篇文章由一文多發(fā)平臺ArtiPub自動發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末入录,一起剝皮案震驚了整個濱河市蛤奥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僚稿,老刑警劉巖凡桥,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚀同,居然都是意外死亡缅刽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蠢络,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衰猛,“玉大人,你說我怎么就攤上這事刹孔⊥笾叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵芦疏,是天一觀的道長冕杠。 經(jīng)常有香客問我,道長酸茴,這世上最難降的妖魔是什么分预? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮薪捍,結(jié)果婚禮上笼痹,老公的妹妹穿的比我還像新娘配喳。我一直安慰自己,他們只是感情好凳干,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布晴裹。 她就那樣靜靜地躺著,像睡著了一般救赐。 火紅的嫁衣襯著肌膚如雪涧团。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天经磅,我揣著相機與錄音泌绣,去河邊找鬼。 笑死预厌,一個胖子當(dāng)著我的面吹牛阿迈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轧叽,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苗沧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炭晒?” 一聲冷哼從身側(cè)響起待逞,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腰埂,沒想到半個月后飒焦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜈膨,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡屿笼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翁巍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驴一。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灶壶,靈堂內(nèi)的尸體忽然破棺而出肝断,到底是詐尸還是另有隱情,我是刑警寧澤驰凛,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布胸懈,位于F島的核電站,受9級特大地震影響恰响,放射性物質(zhì)發(fā)生泄漏趣钱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一胚宦、第九天 我趴在偏房一處隱蔽的房頂上張望首有。 院中可真熱鬧燕垃,春花似錦、人聲如沸井联。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烙常。三九已至轴捎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間军掂,已是汗流浹背轮蜕。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝗锥,地道東北人跃洛。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像终议,于是被迫代替她去往敵國和親汇竭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容