Redis入門 - Redis概念和基礎(chǔ)

Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲系統(tǒng)??捎糜诰彺?,事件發(fā)布或訂閱,高速隊(duì)列等場景。支持網(wǎng)絡(luò),提供字符串,哈希,列表,隊(duì)列,集合結(jié)構(gòu)直接存取,基于內(nèi)存,可持久化。

什么是Redis

Redis是一款內(nèi)存高速緩存數(shù)據(jù)庫。Redis全稱為:Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)服務(wù)),使用C語言編寫,Redis是一個key-value存儲系統(tǒng)(鍵值存儲系統(tǒng)),支持豐富的數(shù)據(jù)類型,如:String、list、set、zset、hash。

Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲系統(tǒng)??捎糜诰彺妫录l(fā)布或訂閱,高速隊(duì)列等場景。支持網(wǎng)絡(luò),提供字符串,哈希,列表,隊(duì)列,集合結(jié)構(gòu)直接存取,基于內(nèi)存,可持久化。

官方資料

Redis官網(wǎng):http://redis.io/

Redis官方文檔:http://redis.io/documentation

Redis教程:http://www.w3cschool.cn/redis/redis-intro.html

Redis下載:http://redis.io/download

為什么要使用Redis

一個產(chǎn)品的使用場景肯定是需要根據(jù)產(chǎn)品的特性,先列舉一下Redis的特點(diǎn):

  • 讀寫性能優(yōu)異
    • Redis能讀的速度是110000次/s,寫的速度是81000次/s (測試條件見下一節(jié))。
  • 數(shù)據(jù)類型豐富
    • Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
  • 原子性
    • Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執(zhí)行。
  • 豐富的特性
    • Redis支持 publish/subscribe, 通知, key 過期等特性。
  • 持久化
    • Redis支持RDB, AOF等持久化方式
  • 發(fā)布訂閱
    • Redis支持發(fā)布/訂閱模式
  • 分布式
    • Redis Cluster

(PS: 具體再結(jié)合下面的使用場景理解下)

下面是官方的bench-mark根據(jù)如下條件獲得的性能測試(讀的速度是110000次/s,寫的速度是81000次/s

  • 測試完成了50個并發(fā)執(zhí)行100000個請求。
  • 設(shè)置和獲取的值是一個256字節(jié)字符串。
  • Linux box是運(yùn)行Linux 2.6,這是X3320 Xeon 2.5 ghz。
  • 文本執(zhí)行使用loopback接口(127.0.0.1)。

Redis的使用場景

redis應(yīng)用場景總結(jié)redis平時我們用到的地方蠻多的,下面就了解的應(yīng)用場景做個總結(jié):

熱點(diǎn)數(shù)據(jù)的緩存

緩存是Redis最常見的應(yīng)用場景,之所有這么使用,主要是因?yàn)镽edis讀寫性能優(yōu)異。而且逐漸有取代memcached,成為首選服務(wù)端緩存的組件。而且,Redis內(nèi)部是支持事務(wù)的,在使用時候能有效保證數(shù)據(jù)的一致性。

作為緩存使用時,一般有兩種方式保存數(shù)據(jù):

  • 讀取前,先去讀Redis,如果沒有數(shù)據(jù),讀取數(shù)據(jù)庫,將數(shù)據(jù)拉入Redis。
  • 插入數(shù)據(jù)時,同時寫入Redis。

方案一:實(shí)施起來簡單,但是有兩個需要注意的地方:

  • 避免緩存擊穿。(數(shù)據(jù)庫沒有就需要命中的數(shù)據(jù),導(dǎo)致Redis一直沒有數(shù)據(jù),而一直命中數(shù)據(jù)庫。)
  • 數(shù)據(jù)的實(shí)時性相對會差一點(diǎn)。

方案二:數(shù)據(jù)實(shí)時性強(qiáng),但是開發(fā)時不便于統(tǒng)一處理。

當(dāng)然,兩種方式根據(jù)實(shí)際情況來適用。如:方案一適用于對于數(shù)據(jù)實(shí)時性要求不是特別高的場景。方案二適用于字典表、數(shù)據(jù)量不大的數(shù)據(jù)存儲。

限時業(yè)務(wù)的運(yùn)用

redis中可以使用expire命令設(shè)置一個鍵的生存時間,到時間后redis會刪除它。利用這一特性可以運(yùn)用在限時的優(yōu)惠活動信息、手機(jī)驗(yàn)證碼等業(yè)務(wù)場景。

計數(shù)器相關(guān)問題

redis由于incrby命令可以實(shí)現(xiàn)原子性的遞增,所以可以運(yùn)用于高并發(fā)的秒殺活動、分布式序列號的生成、具體業(yè)務(wù)還體現(xiàn)在比如限制一個手機(jī)號發(fā)多少條短信、一個接口一分鐘限制多少請求、一個接口一天限制調(diào)用多少次等等。

分布式鎖

這個主要利用redis的setnx命令進(jìn)行,setnx:"set if not exists"就是如果不存在則成功設(shè)置緩存同時返回1,否則返回0 ,這個特性在俞你奔遠(yuǎn)方的后臺中有所運(yùn)用,因?yàn)槲覀兎?wù)器是集群的,定時任務(wù)可能在兩臺機(jī)器上都會運(yùn)行,所以在定時任務(wù)中首先 通過setnx設(shè)置一個lock,
如果成功設(shè)置則執(zhí)行,如果沒有成功設(shè)置,則表明該定時任務(wù)已執(zhí)行。 當(dāng)然結(jié)合具體業(yè)務(wù),我們可以給這個lock加一個過期時間,比如說30分鐘執(zhí)行一次的定時任務(wù),那么這個過期時間設(shè)置為小于30分鐘的一個時間就可以,這個與定時任務(wù)的周期以及定時任務(wù)執(zhí)行消耗時間相關(guān)。

在分布式鎖的場景中,主要用在比如秒殺系統(tǒng)等。

延時操作

比如在訂單生產(chǎn)后我們占用了庫存,10分鐘后去檢驗(yàn)用戶是夠真正購買,如果沒有購買將該單據(jù)設(shè)置無效,同時還原庫存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允許客戶訂閱Pub/Sub頻道,以便以某種方式接收影響Redis數(shù)據(jù)集的事件。 所以我們對于上面的需求就可以用以下解決方案,我們在訂單生產(chǎn)時,設(shè)置一個key,同時設(shè)置10分鐘后過期, 我們在后臺實(shí)現(xiàn)一個監(jiān)聽器,監(jiān)聽key的實(shí)效,監(jiān)聽到key失效時將后續(xù)邏輯加上。

當(dāng)然我們也可以利用rabbitmq、activemq等消息中間件的延遲隊(duì)列服務(wù)實(shí)現(xiàn)該需求。

排行榜相關(guān)問題

關(guān)系型數(shù)據(jù)庫在排行榜方面查詢速度普遍偏慢,所以可以借助redis的SortedSet進(jìn)行熱點(diǎn)數(shù)據(jù)的排序。

比如點(diǎn)贊排行榜,做一個SortedSet, 然后以用戶的openid作為上面的username, 以用戶的點(diǎn)贊數(shù)作為上面的score, 然后針對每個用戶做一個hash, 通過zrangebyscore就可以按照點(diǎn)贊數(shù)獲取排行榜,然后再根據(jù)username獲取用戶的hash信息,這個當(dāng)時在實(shí)際運(yùn)用中性能體驗(yàn)也蠻不錯的。

點(diǎn)贊、好友等相互關(guān)系的存儲

Redis 利用集合的一些命令,比如求交集、并集、差集等。

在微博應(yīng)用中,每個用戶關(guān)注的人存在一個集合中,就很容易實(shí)現(xiàn)求兩個人的共同好友功能。

簡單隊(duì)列

由于Redis有l(wèi)ist push和list pop這樣的命令,所以能夠很方便的執(zhí)行隊(duì)列操作。

參考文章

知識體系

知識體系

image

相關(guān)文章

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

  • Redis入門 - Redis概念和基礎(chǔ)
    • Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲系統(tǒng)。可用于緩存,事件發(fā)布或訂閱,高速隊(duì)列等場景。支持網(wǎng)絡(luò),提供字符串,哈希,列表,隊(duì)列,集合結(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è)計和實(shí)現(xiàn)。

image

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

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

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

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容