我們爲什麼使用 Redis?

如果你從來沒使用過 Redis 數據庫,那你肯定會問,爲什麼我們要用 Redis 數據庫,我只使用 MySQL 或 Oracle 就夠了。其實 Redis 雖叫數據庫,可又不是傳統意義上的關係型數據庫,Redis 是一個高性能的 Key-value 數據庫。

到了今天,Redis 已經進入了成熟期。數以千計的開發者都在開發和使用這個數據庫,Redis 擁有非常完善的文檔。大家知道,要想在幾百萬用戶中找到某條數據,是很難通過關係數據庫在十幾秒查詢到的。於是我選擇了 Redis,在不斷優化後每次操作可以控制在 1 秒鐘甚至更短,帶給我相當大的震撼。

1、認識 Redis

在 Redis 之前,很多互聯網公司會使用 MySql + Memcached 架構,這個架構雖然適合於海量數據存儲,但隨着業務的增加,會出現很多問題,例如,MySQL 數據庫經常拆表,導致 Memcached 也不斷擴容;同步問題;命中率低,導致直接穿透 Memcached 進入 DB 查詢,DB資源池是有限的,進而宕機。這些問題都會導致 Memcached 其實並不好用。

Redis 就在這種時代背景中產生,你會發現 Memcached 遇到的問題都被 Redis 給解決了。如果你用過 Memcached,你就會感受到 Redis 絕對不是簡單的 Key-value 數據,還有 list、set、哈希等各種數據類型的存儲,同時支持冷熱備份和主從複製,不但解決了數據庫的容錯,還能輕易地將數據分佈到多個 Redis 實例中。

2、Redis 的八大特性

特性一,速度極快。由於 Redis 是開源的,當你打開源代碼,就會發現 Redis 都是用 C 語言寫的,C 語言是最接近計算機語言的代碼,而且只有區區 5 萬行,保證了 Redis 的速度。同時一個 Redis 只是一個單線程,其真正的原因還是因爲單線程在內存中是效率最高的。

特性二,持久化。Redis 的持久化可以保證將內存中的數據每隔一段時間就保存於磁盤中,重啓的時候會再次加載到內存。

特性三,支持多種數據結構。分別支持哈希、集合、BitMaps,還有位圖(多用於活躍用戶數等統計)、HyperLogLog(超小內存唯一值計數,由於只有 12K,是有一定誤差範圍的)、GEO(地理信息定位)。

特性四,支持多種編程語言。支持Java、PHP、Python、Ruby、Lua、Nodejs。

特性五,功能豐富。如發佈訂閱、Lua 腳本、事務、Pipeline。

特性六,簡單。不依賴外部庫、單線程、只有 23000 行 Code。

特性七,主從複製。主節點的數據做副本,這是做高可用的基石。

特性八,高可用和分佈式。Redis-Sentinel(v2.8)支持高可用,Redis-Cluster(v3.0)支持分佈式。

3、那麼 Redis 用在哪些場景呢?

Redis 最大的作用是增加你原來的訪問性能問題,試想如果項目已經搭建好,這個項目一般是不太可能更換的。但是 Redis 獨特的存在是只需要增加一層,把常用的數據存放在 Redis 即可。

無論是什麼架構,你都可以將 Redis 融入項目中來,這可以解決很多關係數據庫無法解決的問題。比如,現有數據庫處理緩慢的任務,或者在原有的基礎上開發新的功能,都可以使用 Redis。接下來,我們一起看看 Redis 的典型使用場景。

1. 緩存系統。這是 Redis 使用最多的場景。Redis 能夠替代 Memcached,讓你的緩存從只能存儲數據變得能夠更新數據,因此你不再需要每次都重新生成數據。網絡中總是能夠看到這個技術更新換代,Redis 的原生命令,儘管簡單卻功能強大,把它們加以組合,能完成的功能是無法想象的。

2. 計數器。如轉發數、評論數,有了原子遞增(Atomic Increment),你可以放心的加上各種計數,用 GETSET 重置,或者是讓它們過期。目前新浪是號稱史上最大的 Redis 集羣。

3.消息隊列系統。雖然 Kafka 更強,但是簡單的可以使用 Redis。運行穩定並且快速,支持模式匹配,能夠實時訂閱與取消頻道。

Redis 還有阻塞隊列的命令,能夠讓一個程序在執行時被另一個程序添加到隊列。你也可以做些更有趣的事情,比如一個旋轉更新的 RSS Feed 隊列。

4.排行榜及相關問題。實際就是一種有序集合。對於 Redis 來說,如果你要在幾百萬個用戶中找到排名,其他數據庫查詢是非常慢的,因爲每過幾分鐘,就會有幾百萬個不同的數據產生變化,但是 Redis 卻可以輕鬆解決。

5.社交網絡。Redis 可以非常好地與社交網絡相結合,如新浪微博、Twiter等,比如QQ和用戶交互的時候,用戶和狀態消息將會聚焦很多有用的信息,很多交互如實時聊天就是通過 Redis 來實現的。

6.按照用戶投票和時間排序。Reddit 的排行榜,得分會隨着時間變化。LPUSH 和 LTRIM 命令結合運用,把文章添加到一個列表中。一項後臺任務用來獲取列表,並重新計算列表的排序,ZADD 命令用來按照新的順序填充生成列表。列表可以實現非常快速的檢索,即使是負載很重的站點。

7.過期項目處理。通過 Unix 時間作爲關鍵字,用來保持列表能夠按時間排序。對 currenttime 和 timeto_live 進行檢索,完成查找過期項目的艱鉅任務。另一項後臺任務使用 ZRANGE...WITHSCORES 進行查詢,刪除過期的條目。

8.實時系統。使用位圖來做布隆過濾器,例如實現垃圾郵件過濾系統的開發變的非常容易。

綜上所述, Redis 的應用是非常廣泛的,而且在實際使用中是非常有價值的。你可以讓網站向 100 萬用戶推薦新聞、可以實時顯示最新的項目列表、在遊戲中實時獲得排名、獲得全球排名等等。

Redis 的出現,解決了傳統關係數據庫的短板,讓開發變的更加簡單和高效,大大提高了開發效率,也在用戶體驗上獲得更加實時的體驗。隨着 Redis 的使用越來越廣泛,將會有更多的開發者加入 Redis 的使用和開發上來。

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