成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis 是什么?架構是怎么樣的?

數據庫 Redis
有沒有辦法在 MySQL 不被壓垮的同時,讓商品服務支持每秒 1w 次查詢 ?當然有,沒有什么是加一層中間層不能解決的,如果有,那就再加一層。這次我們要加的中間層是Redis。

你是一個程序員,你維護了一個 商品服務,它背后直連 mysql 數據庫。
假設商品服務需要對外提供 每秒 1w 次查詢,但背后的 mysql 卻只能提供每秒 5k 次查詢,那 mysql 根本頂不??!分分鐘會被壓垮。

這類大流量查詢場景非常常見,比如雙十一秒殺和春節搶車票。
那么問題就來了,有沒有辦法在 mysql 不被壓垮的同時,讓商品服務支持每秒 1w 次查詢 ?
當然有,沒有什么是加一層中間層不能解決的,如果有,那就再加一層。
這次我們要加的中間層是Redis。

本地緩存

我們知道,查詢內存的速度比查詢磁盤要快, mysql 數據主要存放在磁盤里,如果能將 mysql 里的數據放內存里,查詢完全不走磁盤,那必然能大大提升查詢性能。

我們很容易想到,可以在商品服務的內存中,申請一個字典,在 python 里叫 dict,在 java 里叫 map。

key 是商品 ID,value 是商品數據。通過商品 ID, 就能查到商品數據。

發生查詢時,優先去查內存字典,沒結果再跑到 mysql 數據庫里查詢,再將結果順手放內存字典里,下次就又能從內存里查出來啦。

像這樣,放在服務內部的緩存,就是所謂的本地緩存。
有了本地緩存的加持,真正打到 mysql 的查詢量就跟你喜歡的女生回你的消息字數一樣少,將查詢請求干到 1w qps 是很輕松的事情。

遠程緩存

但問題又來了,為了保證系統高可用,商品服務經常不止一個實例,如果每個實例都重復緩存一份本地內存,那就有些浪費內存條了。
所以更好的解決方案是將這部分字典內存抽出來,單獨做成一個服務。它就是所謂的遠程緩存服務。

但這就引入另外一個問題,多個商品服務通過網絡去讀寫同一份遠程緩存,會存在并發問題。怎么辦呢?
很簡單!對外不管有多少有個網絡連接,收到讀寫命令后,都統一塞到一個線程上,在一個線程上對字典進行讀寫,什么并發問題和線程切換開銷,完全不存在!

這個遠程緩存服務足以滿足大部分場景,但它屬實過于簡陋,我們來看下怎么優化它。

多種數據類型支持

現在緩存服務里,只有一個字典類型。key 和 value 都是字符串。但我們平時寫代碼的時候,還會用到很多其他內存里的數據結構,是不是也可以在緩存服務里提供類似的數據結構?
于是我們對字段的 value 進行擴展,除了 字符串, 還支持先進先出的隊列 List 和用于去重的 Set 類型,再加入可以做排行榜的 ZSet,現在緩存服務就更強了。

內存過期策略

緩存服務支持的數據結構變多了之后,塞到內存里的數據就越來越多了,內存又小又貴,遲早扛不住。
怎么辦呢?我們可以給緩存里的數據加個過期時間,一旦數據過期,就從內存里刪掉,可以很大程度緩解掉內存增長速度。
但問題又又來了,我怎么知道哪些數據該設置多長過期時間呢?
完全沒辦法,只能交給調用方去做判斷,讓用戶通過 expire 命令的形式來指定哪些數據多久過期。

緩存淘汰

但你不能指望每個調用方都是老實人,如果都不設置過期時間,那內存還是得炸。
有解法嗎?
有!在內存接近上限的時候,根據一些策略刪除掉一些內存。比如可以將最近最少使用的內存刪掉,也就是所謂的 LRU,這樣不僅解決了內存過大的問題,還讓 redis 里的數據全是熱點數據。真是一箭雙雕。

持久化

現在內存過大的問題是解決了。但還有個問題,mysql 之所以過得那么舒服,那是因為前面有個緩存服務擋住了大部分流量。一旦緩存服務重啟,那內存就全丟了,這時候流量會全都打到 mysql 身上,疼得它嗷嗷叫。

所以我們還需要給 redis 加入最大程度的持久化保證。確保服務重啟后不至于什么數據都沒有。
于是可以在緩存服務里加個異步線程,定期將全量內存數據定期持久化到磁盤文件里,而這種將內存數據生成快照保存到文件的方式,就是所謂的 RDB,Redis Database Backup。

它可以每隔幾分鐘記錄下緩存服務 的全量數據,類似于游戲的"存檔"。
這樣就算進程掛了,重啟的時候,通過加載快照文件,就能復原大部分數據。
之所以說是大部分,是因為"存檔"之后寫入的數據可能會丟。
那還有其他方式可以保留更多數據嗎?有!
全量數據備份當然耗時,那我們化整為零,在每次寫入數據時,順手將數據記錄到文件緩存中,并每秒將文件緩存刷入磁盤,這種持久化機制叫 AOF,Append Only File,服務啟動時跟著文件重新執行一遍就能將大部分數據還原,最大程度保證了數據持久化。

那問題就來了,AOF 文件會不會很大?沒事,定期重寫壓縮就行,比如 a 被依次賦值 a=1,a=2,最終保留 a=2 就夠了。

簡化網絡協議

剛剛提到遠程緩存服務對外提供讀寫能力,那是對外提供的 HTTP 接口嗎?
當然不是!
我們知道, HTTP 是基于 TCP 做的通信,實現了很多笨重的特性。
既然當初是為了性能,特地上的緩存服務,那就索性徹底點,拋棄 HTTP,直接基于 TCP 做傳輸就好!傳輸協議也設計得簡單點,比如只要通過 TCP 傳入 SET key value,就能完成寫入。傳入"GET key" 就能獲得對應的 value。非常簡潔。
那傳輸協議的解析需要我們自己寫代碼去實現嗎?
完全不需要,redis 官方提供了一個命令行工具,redis-cli,通過它,我們可以輸入一些命令,讀寫 Redis 服務器里的各種內存數據。

不想用命令行也沒關系,各路大神已經用各種語言將 redis-cli 支持的命令實現了一遍,完全不需要自己手寫。

Redis 是什么?

好了,到這里,當初那個簡陋的遠程緩存服務,就成了一個高性能,支持多種數據類型和各種緩存淘汰策略,并提供一定持久化能力的超強緩存服務,沒錯,它就是我們常說的 Redis,全稱 Remote Dictionary Server,這名字就很精辟了,說白了 redis 就是個遠程的字典服務。

redis 作為架構中最常用的提速神器,是萬金油一般的存在,將它放在 mysql 面前擋一道查詢只是最基礎的用法。
通過擴展插件,還能實現各種高階玩法。
比如 RedisJSON 支持復雜的 JSON 查詢和更新,說白了就是內存版本的 MongoDB。
RediSearch 支持全文搜索,說白了就是內存丐版的 es。
RedisGraph 支持圖數據庫功能,類似 Neo4j,RedisTimeSeries 處理時間序列數據,也就是內存版 InfluxDB。大有一種要在內存里將所有中間件都實現一遍的味道。

現在大家通了嗎?

總結

  • redis 本質上就是個遠程字典服務,所有讀寫命令等核心邏輯,都在一個線程上完成。什么并發問題和線程切換開銷,完全不存在!
  • redis 支持多種數據類型、內存過期策略和多種緩存失效策略,通過 TCP 對外提供了一套非常簡單的傳輸協議。
  • redis 加入了最大程度的持久化保證。將數據持久化為 rdb 和 AOF,確保服務重啟后不至于什么數據都沒有。
  • redis 支持多種擴展,玩法非常多,比如 RediSearch 和 RedisJSON。
責任編輯:姜華 來源: 小白debug
相關推薦

2024-12-16 08:20:00

2025-06-20 08:03:36

Hadoopmysql數據庫

2025-01-20 07:00:00

2025-02-03 08:00:00

HDFS架構存儲數據

2024-06-24 00:07:00

開源es搜索引擎

2024-03-04 08:03:50

k8sClusterNode

2024-05-22 08:02:30

2025-06-11 08:35:00

數據倉庫數倉分層架構

2022-08-12 17:14:46

元宇宙

2023-05-15 10:17:03

2009-12-24 14:05:06

Fedora core

2014-08-25 10:11:18

極致用戶體驗

2017-10-17 15:02:35

RS-485總線布線雙絞線

2014-02-18 11:24:07

云計算PaaS

2020-08-13 12:02:13

前端培訓學習

2019-01-11 10:39:24

軟件架構虛擬空間機器人

2011-05-31 17:27:58

網站權重

2016-03-09 11:25:39

前端開發工程師簡歷

2024-01-03 13:06:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩免费观看 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 日韩一区中文字幕 | 国产精品一区二区日韩 | av网站免费看 | 盗摄精品av一区二区三区 | 亚洲精品一区二区 | 九九久久这里只有精品 | 精品国产成人 | 日韩一三区 | 天天干,夜夜操 | 黄色片在线 | 欧美高清hd | 国产精品视频一区二区三区 | 亚洲视频在线观看 | 91精品久久久久 | 在线观看www高清视频 | 男人天堂国产 | 国产精品久久一区二区三区 | 国产成人91视频 | 亚洲精品中文字幕中文字幕 | 在线观看黄色大片 | 最新日韩av | 久久九七| 操人网站 | 中文亚洲视频 | 精品一区二区三区四区外站 | 国产精品久久久久久婷婷天堂 | 午夜一区二区三区在线观看 | 欧美视频偷拍 | 99pao成人国产永久免费视频 | 日韩一区二区三区四区五区六区 | 不卡一区 | 免费视频中文字幕 | 欧美99| 国产精品久久久久久妇女 | 搞黄网站在线观看 | 日本精品一区二区三区在线观看视频 | 中文字幕在线二区 | 国产精品高潮呻吟久久久久 | 欧美综合久久 |