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侯繁。
結(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
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
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í)行氯质。
- 圖例
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
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)遣臼。
- 圖例
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
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 特別適合用于存儲對象。
- 圖例
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
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)链沼。
- 圖例
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
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ù)等打分,做排行栏妖。
參考文章
- 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
知識體系
知識體系
相關(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)怕享。
-
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ù)類型:3種特殊類型詳解
- Redis除了上文中5種基礎(chǔ)數(shù)據(jù)類型谨敛,還有三種特殊的數(shù)據(jù)類型究履,分別是 HyperLogLogs(基數(shù)統(tǒng)計), Bitmaps (位圖) 和 geospatial (地理位置)
-
Redis入門 - 數(shù)據(jù)類型:Stream詳解
- Redis5.0 中還增加了一個數(shù)據(jù)結(jié)構(gòu)Stream脸狸,它借鑒了Kafka的設(shè)計最仑,是一個新的強大的支持多播的可持久化的消息隊列。
-
Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):對象機制詳解
- 我們在前文已經(jīng)闡述了Redis 5種基礎(chǔ)數(shù)據(jù)類型詳解炊甲,分別是字符串(string)泥彤、列表(list)、哈希(hash)卿啡、集合(set)吟吝、有序集合(zset),以及5.0版本中Redis Stream結(jié)構(gòu)詳解颈娜;那么這些基礎(chǔ)類型的底層是如何實現(xiàn)的呢剑逃?Redis的每種對象其實都由對象結(jié)構(gòu)(redisObject) 與 對應(yīng)編碼的數(shù)據(jù)結(jié)構(gòu)組合而成, 本文主要介紹對象結(jié)構(gòu)(redisObject) 部分。官辽。
-
Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):底層數(shù)據(jù)結(jié)構(gòu)詳解
- 前文是第一部分底層設(shè)計:對象機制詳解, 本文主要介紹底層數(shù)據(jù)結(jié)構(gòu) 部分炕贵。
-
Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):redis對象與編碼(底層結(jié)構(gòu))對應(yīng)關(guān)系詳解
- 在學(xué)習(xí)完底層數(shù)據(jù)結(jié)構(gòu)之后,我們終于可以結(jié)合前文內(nèi)容闡述redis對象及編碼之間的關(guān)系了野崇。
再者称开,需要學(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官網(wǎng):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設(shè)計與實現(xiàn) 3.0版本》 http://redisbook.com/index.html
redis源碼解讀 3.2.8版本 https://blog.csdn.net/men_wen/article/details/75668345
除此之外,我還推薦你看下 極客時間 《Redis核心技術(shù)與實戰(zhàn)》(作者:蔣德鈞)的相關(guān)內(nèi)容裆熙,它是我看到的為數(shù)不多的含有實戰(zhàn)經(jīng)驗比較多的專欄端礼,部分文章中圖片也來源于這個系列。
本篇文章由一文多發(fā)平臺ArtiPub自動發(fā)布