Redis是一種基于鍵值對的NoSQL數(shù)據(jù)庫,它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五種基本數(shù)據(jù)結(jié)構(gòu)構(gòu)成,除此之外還支持一些其他的數(shù)據(jù)結(jié)構(gòu)和算法。key都是由字符串構(gòu)成的,那么這五種數(shù)據(jù)結(jié)構(gòu)的使用場景有哪些?一起來看看!
一 字符串
字符串類型是Redis最基礎的數(shù)據(jù)結(jié)構(gòu),字符串類型可以是JSON、XML甚至是二進制的圖片等數(shù)據(jù),但是最大值不能超過512MB。
1.1 內(nèi)部編碼
Redis會根據(jù)當前值的類型和長度決定使用哪種內(nèi)部編碼來實現(xiàn)。
字符串類型的內(nèi)部編碼有3種:
int:8個字節(jié)的長整型。
embstr:小于等于39個字節(jié)的字符串。
raw:大于39個字節(jié)的字符串。
1.2 使用場景
1.2.1 緩存
在web服務中,使用MySQL作為數(shù)據(jù)庫,Redis作為緩存。由于Redis具有支撐高并發(fā)的特性,通常能起到加速讀寫和降低后端壓力的作用。web端的大多數(shù)請求都是從Redis中獲取的數(shù)據(jù),如果Redis中沒有需要的數(shù)據(jù),則會從MySQL中去獲取,并將獲取到的數(shù)據(jù)寫入redis。
1.2.2 計數(shù)
Redis中有一個字符串相關的命令incr key,incr命令對值做自增操作,返回結(jié)果分為以下三種情況:
值不是整數(shù),返回錯誤
值是整數(shù),返回自增后的結(jié)果
key不存在,默認鍵為0,返回1
比如文章的閱讀量,視頻的播放量等等都會使用redis來計數(shù),每播放一次,對應的播放量就會加1,同時將這些數(shù)據(jù)異步存儲到數(shù)據(jù)庫中達到持久化的目的。
1.2.3 共享Session
在分布式系統(tǒng)中,用戶的每次請求會訪問到不同的服務器,這就會導致session不同步的問題,假如一個用來獲取用戶信息的請求落在A服務器上,獲取到用戶信息后存入session。下一個請求落在B服務器上,想要從session中獲取用戶信息就不能正常獲取了,因為用戶信息的session在服務器A上,為了解決這個問題,使用redis集中管理這些session,將session存入redis,使用的時候直接從redis中獲取就可以了。
1.2.4 限速
為了安全考慮,有些網(wǎng)站會對IP進行限制,限制同一IP在一定時間內(nèi)訪問次數(shù)不能超過n次。
二 哈希
Redis中,哈希類型是指一個鍵值對的存儲結(jié)構(gòu)。
2.1 內(nèi)部編碼
哈希類型的內(nèi)部編碼有兩種:
ziplist(壓縮列表):當哈希類型元素個數(shù)小于hash-max-ziplist-entries配置(默認512個)同時所有值都小于hash-max-ziplist-value配置(默認64字節(jié))時使用。ziplist使用更加緊湊的結(jié)構(gòu)實現(xiàn)多個元素的連續(xù)存儲,所以比hashtable更加節(jié)省內(nèi)存。
hashtable(哈希表):當ziplist不能滿足要求時,會使用hashtable。
2.2 使用場景
由于hash類型存儲的是一個鍵值對,比如數(shù)據(jù)庫有以下一個用戶表結(jié)構(gòu)
id | name | age |
---|---|---|
1 | Java旅途 | 18 |
將以上信息存入redis,用表明:id作為key,用戶屬性作為值:
hsetuser:1nameJava旅途age18
使用哈希存儲會比字符串更加方便直觀
三 列表
列表類型用來存儲多個有序的字符串,一個列表最多可以存儲2^32-1個元素,列表的兩端都可以插入和彈出元素。
3.1 內(nèi)部編碼
列表的內(nèi)部編碼有兩種:
ziplist(壓縮列表):當哈希類型元素個數(shù)小于list-max-ziplist-entries配置(默認512個)同時所有值都小于list-max-ziplist-value配置(默認64字節(jié))時使用。ziplist使用更加緊湊的結(jié)構(gòu)實現(xiàn)多個元素的連續(xù)存儲,所以比hashtable更加節(jié)省內(nèi)存。
linkedlist(鏈表):當ziplist不能滿足要求時,會使用linkedlist。
3.2 使用場景
3.2.1 消息隊列
列表用來存儲多個有序的字符串,既然是有序的,那么就滿足消息隊列的特點。使用lpush+rpop或者rpush+lpop實現(xiàn)消息隊列。除此之外,redis支持阻塞操作,在彈出元素的時候使用阻塞命令來實現(xiàn)阻塞隊列。
3.2.2 棧
由于列表存儲的是有序字符串,滿足隊列的特點,也就能滿足棧先進后出的特點,使用lpush+lpop或者rpush+rpop實現(xiàn)棧。
3.2.3 文章列表
因為列表的元素不但是有序的,而且還支持按照索引范圍獲取元素。因此我們可以使用命令lrange key 0 9分頁獲取文章列表
四 集合
集合類型也可以保存多個字符串元素,與列表不同的是,集合中不允許有重復元素并且集合中的元素是無序的。一個集合最多可以存儲2^32-1個元素。
4.1 內(nèi)部編碼
集合類型的內(nèi)部編碼有兩種:
intset(整數(shù)集合):當集合中的元素都是整數(shù)且元素個數(shù)小于set-max-intset-entries配置(默認512個)時,redis會選用intset來作為集合的內(nèi)部實現(xiàn),從而減少內(nèi)存的使用。
hashtable(哈希表):當intset不能滿足要求時,會使用hashtable。
4.2 使用場景
4.2.1 用戶標簽
例如一個用戶對籃球、足球感興趣,另一個用戶對橄欖球、乒乓球感興趣,這些興趣點就是一個標簽。有了這些數(shù)據(jù)就可以得到喜歡同一個標簽的人,以及用戶的共同感興趣的標簽。給用戶打標簽的時候需要①給用戶打標簽,②給標簽加用戶,需要給這兩個操作增加事務。
給用戶打標簽
saddusertagstag1tag2
給標簽添加用戶
saddtag1:usersuser:1 saddtag2:usersuser:1
使用交集(sinter)求兩個user的共同標簽
sinterusertagsusertags
4.2.2 抽獎功能
集合有兩個命令支持獲取隨機數(shù),分別是:
隨機獲取count個元素,集合元素個數(shù)不變
srandmember key [count]
隨機彈出count個元素,元素從集合彈出,集合元素個數(shù)改變
spop key [count]
用戶點擊抽獎按鈕,參數(shù)抽獎,將用戶編號放入集合,然后抽獎,分別抽一等獎、二等獎,如果已經(jīng)抽中一等獎的用戶不能參數(shù)抽二等獎則使用spop,反之使用srandmember。
五 有序集合
有序集合和集合一樣,不能有重復元素。但是可以排序,它給每個元素設置一個score作為排序的依據(jù)。最多可以存儲2^32-1個元素。
5.1 內(nèi)部編碼
有序集合類型的內(nèi)部編碼有兩種:
ziplist(壓縮列表):當有序集合的元素個數(shù)小于list-max-ziplist-entries配置(默認128個)同時所有值都小于list-max-ziplist-value配置(默認64字節(jié))時使用。ziplist使用更加緊湊的結(jié)構(gòu)實現(xiàn)多個元素的連續(xù)存儲,更加節(jié)省內(nèi)存。
skiplist(跳躍表):當不滿足ziplist的要求時,會使用skiplist。
5.2 使用場景
5.2.1 排行榜
用戶發(fā)布了n篇文章,其他人看到文章后給喜歡的文章點贊,使用score來記錄點贊數(shù),有序集合會根據(jù)score排行。流程如下
用戶發(fā)布一篇文章,初始點贊數(shù)為0,即score為0
有人給文章a點贊,遞增1
zincrbyuser:article1a
查詢點贊前三篇文章
zrevrangebyscoreuser:article02
查詢點贊后三篇文章
zrangebyscoreuser:article02
5.2.2 延遲消息隊列
下單系統(tǒng),下單后需要在15分鐘內(nèi)進行支付,如果15分鐘未支付則自動取消訂單。將下單后的十五分鐘后時間作為score,訂單作為value存入redis,消費者輪詢?nèi)ハM,如果消費的大于等于這筆記錄的score,則將這筆記錄移除隊列,取消訂單。
總結(jié)
在開發(fā)中,字符串類型是用的最多的數(shù)據(jù)類型,導致我們忽視了redis的其他四種數(shù)據(jù)類型,在具體場景下選擇具體的數(shù)據(jù)類型對提升redis性能有非常大的幫助。redis雖然支持消息隊列的實現(xiàn),但是并不支持ack。所以redis實現(xiàn)的消息隊列不能保證消息的可靠性,除非自己實現(xiàn)消息確認機制,不過這非常麻煩,所以如果是重要的消息還是推薦使用專門的消息隊列去做。
責任編輯:xj
原文標題:Redis 五大數(shù)據(jù)類型使用場景
文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
-
數(shù)據(jù)
+關注
關注
8文章
7139瀏覽量
89573 -
JAVA
+關注
關注
19文章
2974瀏覽量
105137 -
Redis
+關注
關注
0文章
378瀏覽量
10939
原文標題:Redis 五大數(shù)據(jù)類型使用場景
文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
站群服務器與VPS的適用場景有什么不同嗎
數(shù)據(jù)網(wǎng)絡分析儀的原理和應用場景
系統(tǒng)放大器的技術原理和應用場景
SD NAND在大數(shù)據(jù)時代的應用場景
![SD NAND在<b class='flag-5'>大數(shù)據(jù)</b>時代的應<b class='flag-5'>用場景</b>](https://file1.elecfans.com/web2/M00/0A/71/wKgZomcgkyCAGWMjAADg1F3Rb1Y589.png)
USB協(xié)議分析儀的技術原理和應用場景
labview數(shù)據(jù)類型的取值范圍是多少
常見的遙感數(shù)據(jù)類型有哪些
恒訊科技分析:云數(shù)據(jù)庫rds和redis區(qū)別是什么如何選擇?
技術干貨驛站 ▏深入理解C語言:基本數(shù)據(jù)類型和變量
![技術干貨驛站 ▏深入理解C語言:基本<b class='flag-5'>數(shù)據(jù)類型</b>和變量](https://file1.elecfans.com/web2/M00/FC/CD/wKgZomaWI5uASgBaAABuQHdMO4I302.png)
大數(shù)據(jù)采集系統(tǒng)分為幾類
工業(yè)物聯(lián)網(wǎng)平臺的應用場景有哪些
![工業(yè)物聯(lián)網(wǎng)平臺的應<b class='flag-5'>用場景</b><b class='flag-5'>有</b>哪些](https://file1.elecfans.com//web2/M00/ED/3C/wKgZomZqXr2AAdbNAADyVmp1_Ks818.jpg)
STM32待機模式適合用于那些應用場景?
GeminiDB 新特性:讓 Redis 廣告頻控愛不釋手的 exHASH
![GeminiDB 新特性:讓 <b class='flag-5'>Redis</b> 廣告頻控愛不釋手的 exHASH](https://file1.elecfans.com//web2/M00/C6/E9/wKgaomYELouAXiH4AAqJUmc8_5k47.webp)
C語言數(shù)據(jù)類型有哪些
![C語言<b class='flag-5'>數(shù)據(jù)類型</b><b class='flag-5'>有</b>哪些](https://file1.elecfans.com/web2/M00/C5/16/wKgZomX6UKqAb6q4AABHS7gAoYk070.png)
評論