Redis入門 - Redis概念和基礎

Redis是一種支持key-value等多種數據結構的存儲系統。可用於緩存,事件發佈或訂閱,高速隊列等場景。支持網絡,提供字符串,哈希,列表,隊列,集合結構直接存取,基於內存,可持久化。

什麼是Redis

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

Redis是一種支持key-value等多種數據結構的存儲系統。可用於緩存,事件發佈或訂閱,高速隊列等場景。支持網絡,提供字符串,哈希,列表,隊列,集合結構直接存取,基於內存,可持久化。

官方資料

Redis官網:http://redis.io/

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

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

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

爲什麼要使用Redis

一個產品的使用場景肯定是需要根據產品的特性,先列舉一下Redis的特點:

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

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

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

  • 測試完成了50個併發執行100000個請求。
  • 設置和獲取的值是一個256字節字符串。
  • Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。
  • 文本執行使用loopback接口(127.0.0.1)。

Redis的使用場景

redis應用場景總結redis平時我們用到的地方蠻多的,下面就瞭解的應用場景做個總結:

熱點數據的緩存

緩存是Redis最常見的應用場景,之所有這麼使用,主要是因爲Redis讀寫性能優異。而且逐漸有取代memcached,成爲首選服務端緩存的組件。而且,Redis內部是支持事務的,在使用時候能有效保證數據的一致性。

作爲緩存使用時,一般有兩種方式保存數據:

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

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

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

方案二:數據實時性強,但是開發時不便於統一處理。

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

限時業務的運用

redis中可以使用expire命令設置一個鍵的生存時間,到時間後redis會刪除它。利用這一特性可以運用在限時的優惠活動信息、手機驗證碼等業務場景。

計數器相關問題

redis由於incrby命令可以實現原子性的遞增,所以可以運用於高併發的秒殺活動、分佈式序列號的生成、具體業務還體現在比如限制一個手機號發多少條短信、一個接口一分鐘限制多少請求、一個接口一天限制調用多少次等等。

分佈式鎖

這個主要利用redis的setnx命令進行,setnx:"set if not exists"就是如果不存在則成功設置緩存同時返回1,否則返回0 ,這個特性在俞你奔遠方的後臺中有所運用,因爲我們服務器是集羣的,定時任務可能在兩臺機器上都會運行,所以在定時任務中首先 通過setnx設置一個lock,
如果成功設置則執行,如果沒有成功設置,則表明該定時任務已執行。 當然結合具體業務,我們可以給這個lock加一個過期時間,比如說30分鐘執行一次的定時任務,那麼這個過期時間設置爲小於30分鐘的一個時間就可以,這個與定時任務的週期以及定時任務執行消耗時間相關。

在分佈式鎖的場景中,主要用在比如秒殺系統等。

延時操作

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

當然我們也可以利用rabbitmq、activemq等消息中間件的延遲隊列服務實現該需求。

排行榜相關問題

關係型數據庫在排行榜方面查詢速度普遍偏慢,所以可以藉助redis的SortedSet進行熱點數據的排序。

比如點贊排行榜,做一個SortedSet, 然後以用戶的openid作爲上面的username, 以用戶的點贊數作爲上面的score, 然後針對每個用戶做一個hash, 通過zrangebyscore就可以按照點贊數獲取排行榜,然後再根據username獲取用戶的hash信息,這個當時在實際運用中性能體驗也蠻不錯的。

點贊、好友等相互關係的存儲

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

在微博應用中,每個用戶關注的人存在一個集合中,就很容易實現求兩個人的共同好友功能。

簡單隊列

由於Redis有list push和list pop這樣的命令,所以能夠很方便的執行隊列操作。

參考文章

知識體系

知識體系

相關文章

首先,我們通過學習Redis的概念基礎,瞭解它適用的場景。

  • Redis入門 - Redis概念和基礎
    • Redis是一種支持key-value等多種數據結構的存儲系統。可用於緩存,事件發佈或訂閱,高速隊列等場景。支持網絡,提供字符串,哈希,列表,隊列,集合結構直接存取,基於內存,可持久化。

其次,這些適用場景都是基於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核心技術與實戰》(作者:蔣德鈞)的相關內容,它是我看到的爲數不多的含有實戰經驗比較多的專欄,部分文章中圖片也來源於這個系列。

本篇文章由一文多發平臺ArtiPub自動發佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章