国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Redis 這么火,它都解決了哪些問題?

存儲 存儲軟件 Redis
Redis是一個基于BSD開源的項目,是一個把結構化的數據放在內存中的一個存儲系統,你可以把它作為數據庫,緩存和消息中間件來使用。

 [[261796]]

先看一下Redis是一個什么東西。官方簡介解釋到:

Redis是一個基于BSD開源的項目,是一個把結構化的數據放在內存中的一個存儲系統,你可以把它作為數據庫,緩存和消息中間件來使用。同時支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和geospatial indexes等數據類型。它還內建了復制,lua腳本,LRU,事務等功能,通過redis sentinel實現高可用,通過redis cluster實現了自動分片。以及事務,發布/訂閱,自動故障轉移等等。

綜上所述,Redis提供了豐富的功能,初次見到可能會感覺眼花繚亂,這些功能都是干嘛用的?都解決了什么問題?什么情況下才會用到相應的功能?那么下面從零開始,一步一步的演進來粗略的解釋下。

1.從0開始

最初的需求非常簡單,我們有一個提供熱點新聞列表的api:http://api.xxx.com/hot-news,api的消費者抱怨說每次請求都要2秒左右才能返回結果。

隨后我們就著手于如何提升一下api消費者感知的性能,很快最簡單粗暴的***個方案就出來了:為API的響應加上基于HTTP的緩存控制 cache-control:max-age=600 ,即讓消費者可以緩存這個響應十分鐘。

如果api消費者如果有效的利用了響應中的緩存控制信息,則可以有效的改善其感知的性能(10分鐘以內)。但是還有2個弊端:***個是在緩存生效的10分鐘內,api消費者可能會得到舊的數據;第二個是如果api的客戶端無視緩存直接訪問API依然是需要2秒,治標不治本吶。

2.基于本機內存的緩存

為了解決調用API依然需要2秒的問題,經過排查,其主要原因在于使用SQL獲取熱點新聞的過程中消耗了將近2秒的時間,于是乎,我們又想到了一個簡單粗暴的解決方案,即把SQL查詢的結果直接緩存在當前api服務器的內存中(設置緩存有效時間為1分鐘)。后續1分鐘內的請求直接讀緩存,不再花費2秒去執行SQL了。

假如這個api每秒接收到的請求時100個,那么一分鐘就是6000個,也就是只有前2秒擁擠過來的請求會耗時2秒,后續的58秒中的所有請求都可以做到即使響應,而無需再等2秒的時間。

其他API的小伙伴發現這是個好辦法,于是很快我們就發現API服務器的內存要爆滿了。。。

3.服務端的Redis

在API服務器的內存都被緩存塞滿的時候,我們發現不得不另想解決方案了。最直接的想法就是我們把這些緩存都丟到一個專門的服務器上吧,把它的內存配置的大大的。然后我們就盯上了redis。。。至于如何配置部署redis這里不解釋了,redis官方有詳細的介紹。隨后我們就用上了一臺單獨的服務器作為Redis的服務器,API服務器的內存壓力得以解決。

3.1 持久化(Persistence)

單臺的Redis服務器一個月總有那么幾天心情不好,心情不好就罷工了,導致所有的緩存都丟失了(redis的數據是存儲在內存的嘛)。雖然可以把Redis服務器重新上線,但是由于內存的數據丟失,造成了緩存雪崩,API服務器和數據庫的壓力還是一下子就上來了。

所以這個時候Redis的持久化功能就派上用場了,可以緩解一下緩存雪崩帶來的影響。redis的持久化指的是redis會把內存的中的數據寫入到硬盤中,在redis重新啟動的時候加載這些數據,從而***限度的降低緩存丟失帶來的影響。

3.2 哨兵(Sentinel)和復制(Replication)

Redis服務器毫無征兆的罷工是個麻煩事。那么怎辦辦?答曰:備份一臺,你掛了它上。那么如何得知某一臺redis服務器掛了,如何切換,如何保證備份的機器是原始服務器的完整備份呢?

這時候就需要Sentinel和Replication出場了。Sentinel可以管理多個Redis服務器,它提供了監控,提醒以及自動的故障轉移的功能;Replication則是負責讓一個Redis服務器可以配備多個備份的服務器。Redis也是利用這兩個功能來保證Redis的高可用的。此外,Sentinel功能則是對Redis的發布和訂閱功能的一個利用。

3.3 集群(Cluster)

單臺服務器資源的總是有上限的,CPU資源和IO資源我們可以通過主從復制,進行讀寫分離,把一部分CPU和IO的壓力轉移到從服務器上。但是內存資源怎么辦,主從模式做到的只是相同數據的備份,并不能橫向擴充內存;單臺機器的內存也只能進行加大處理,但是總有上限的。

所以我們就需要一種解決方案,可以讓我們橫向擴展。最終的目的既是把每臺服務器只負責其中的一部分,讓這些所有的服務器構成一個整體,對外界的消費者而言,這一組分布式的服務器就像是一個集中式的服務器一樣(之前在解讀REST的博客中解釋過分布式于基于網絡的差異:基于網絡應用的架構)。

在Redis官方的分布式方案出來之前,有twemproxy和codis兩種方案,這兩個方案總體上來說都是依賴proxy來進行分布式的,也就是說redis本身并不關心分布式的事情,而是交由twemproxy和codis來負責。而redis官方給出的cluster方案則是把分布式的這部分事情做到了每一個redis服務器中,使其不再需要其他的組件就可以獨立的完成分布式的要求。

我們這里不關心這些方案的優略,我們關注一下這里的分布式到底是要處理那些事情?也就是twemproxy和codis獨立處理的處理分布式的這部分邏輯和cluster集成到redis服務的這部分邏輯到底在解決什么問題?

如我們前面所說的,一個分布式的服務在外界看來就像是一個集中式的服務一樣。那么要做到這一點就面臨著有一個問題需要解決:既是增加或減少分布式服務中的服務器的數量,對消費這個服務的客戶端而言應該是無感的;那么也就意味著客戶端不能穿透分布式服務,把自己綁死到某一個臺的服務器上去,因為一旦如此,你就再也無法新增服務器,也無法進行故障替換。

解決這個問題有兩個路子:

***個路子最直接,那就是我加一個中間層來隔離這種具體的依賴,即twemproxy采用的方式,讓所有的客戶端只能通過它來消費redsi服務,通過它來隔離這種依賴(但是你會發現twermproxy會成為一個單點),這種情況下每臺redis服務器都是獨立的,它們之間彼此不知對方的存在;

第二個路子是讓redis服務器知道彼此的存在,通過重定向的機制來引導客戶端來完成自己所需要的操作,比如客戶端鏈接到了某一個redis服務器,說我要執行這個操作,redis服務器發現自己無法完成這個操作,那么就把能完成這個操作的服務器的信息給到客戶端,讓客戶端去請求另外的一個服務器,這時候你就會發現每一個redis服務器都需要保持一份完整的分布式服務器信息的一份資料,不然它怎么知道讓客戶端去找其他的哪個服務器來執行客戶端想要的操作呢。

上面這一大段解釋了這么多,不知有沒有發現不管是***個路子還是第二個路子,都有一個共同的東西存在,那就是分布式服務中所有服務器以及其能提供的服務的信息。這些信息無論如何也是要存在的,區別在于***個路子是把這部分信息單獨來管理,用這些信息來協調后端的多個獨立的redis服務器;第二個路子則是讓每一個redis服務器都持有這份信息,彼此知道對方的存在,來達成和***個路子一樣的目的,優點是不再需要一個額外的組件來處理這部分事情。

Redis Cluster的具體實現細節則是采用了Hash槽的概念,即預先分配出來16384個槽:在客戶端通過對Key進行CRC16(key)% 16384運算得到對應的槽是哪一個;在redis服務端則是每個服務器負責一部分槽,當有新的服務器加入或者移除的時候,再來遷移這些槽以及其對應的數據,同時每個服務器都持有完整的槽和其對應的服務器的信息,這就使得服務器端可以進行對客戶端的請求進行重定向處理。在Java技術棧微信公眾號后臺回復關鍵字:Redis,可以獲取更多棧長整理的 Redis 技術干貨。

4.客戶端的Redis

上面的第三小節主要介紹的是Redis服務端的演進步驟,解釋了Redis如何從一個單機的服務,進化為一個高可用的、去中心化的、分布式的存儲系統。這一小節則是關注下客戶端可以消費的redis服務。

4.1 數據類型

redis支持豐富的數據類型,從最基礎的string到復雜的常用到的數據結構都有支持:

string:最基本的數據類型,二進制安全的字符串,***512M。

list:按照添加順序保持順序的字符串列表。

set:無序的字符串集合,不存在重復的元素。

sorted set:已排序的字符串集合。

hash:key-value對的一種集合。

bitmap:更細化的一種操作,以bit為單位。

hyperloglog:基于概率的數據結構。

這些眾多的數據類型,主要是為了支持各種場景的需要,當然每種類型都有不同的時間復雜度。其實這些復雜的數據結構相當于之前我在《解讀REST》這個系列博客基于網絡應用的架構風格中介紹到的遠程數據訪問(Remote Data Access = RDA)的具體實現,即通過在服務器上執行一組標準的操作命令,在服務端之間得到想要的縮小后的結果集,從而簡化客戶端的使用,也可以提高網絡性能。比如 如果沒有list這種數據結構,你就只能把list存成一個string,客戶端拿到完整的list,操作后再完整的提交給redis,會產生很大的浪費。

4.2 事務

上述數據類型中,每一個數據類型都有獨立的命令來進行操作,很多情況下我們需要一次執行不止一個命令,而且需要其同時成功或者失敗。redis對事務的支持也是源自于這部分需求,即支持一次性按順序執行多個命令的能力,并保證其原子性。

4.3 Lua腳本

在事務的基礎上,如果我們需要在服務端一次性的執行更復雜的操作(包含一些邏輯判斷),則lua就可以排上用場了(比如在獲取某一個緩存的時候,同時延長其過期時間)。redis保證lua腳本的原子性,一定的場景下,是可以代替redis提供的事務相關的命令的。相當于基于網絡應用的架構風格中介紹到的遠程求值(Remote Evluation = REV)的具體實現。

4.4 管道

因為redis的客戶端和服務器的連接時基于TCP的, 默認每次連接都時只能執行一個命令。管道則是允許利用一次連接來處理多條命令,從而可以節省一些tcp連接的開銷。管道和事務的差異在于管道是為了節省通信的開銷,但是并不會保證原子性。

4.5 分布式鎖

官方推薦采用Redlock算法,即使用string類型,加鎖的時候給的一個具體的key,然后設置一個隨機的值;取消鎖的時候用使用lua腳本來先執行獲取比較,然后再刪除key。具體的命令如下:

  1. SET resource_name my_random_value NX PX 30000 
  2. if redis.call("get",KEYS[1]) == ARGV[1] then 
  3.  return redis.call("del",KEYS[1]) 
  4. else 
  5.  return 0 

總結

本篇著重從抽象層面來解釋下redis的各項功能以及其存在的目的,而沒有關心其具體的細節是什么。從而可以聚焦于其解決的問題,依據抽象層面的概念可以使得我們在特定的場景下選擇更合適的方案,而非局限于其技術細節。

以上均是筆者個人的一些理解,如果不當之處,歡迎指正。

參考

  • Redis 文檔:https://github.com/antirez/redis-doc
  • Redis 簡介:https://redis.io/topics/introduction
  • Redis 持久化(Persistence):https://redis.io/topics/persistence
  • Redis 發布/訂閱(Pub/Sub):https://redis.io/topics/pubsub
  • Redis 哨兵(Sentinel):https://redis.io/topics/sentinel
  • Redis 復制(Replication):https://redis.io/topics/replication
  • Redis 集群(cluster):https://redis.io/topics/cluster-tutorial
  • RedIs 事務(Transaction):https://redis.io/topics/transactions
  • Redis 數據類型(data types):https://redis.io/topics/data-types-intro
  • Redis 分布式鎖:https://redis.io/topics/distlock
  • Redis 管道(pipelining ):https://redis.io/topics/pipelining
  • Redis Lua Script:https://redis.io/commands/eval
責任編輯:武曉燕 來源: 博客園
相關推薦

2020-11-02 13:25:45

Redis數據庫開源

2019-05-07 18:17:26

Redis服務器數據

2018-10-19 11:55:36

數據庫Redis命令

2014-10-10 13:46:33

Docker

2022-02-19 22:02:21

Redisvalue元素

2021-01-19 15:12:16

AI

2018-11-06 21:30:44

jQuery前端API

2023-10-08 07:15:54

NGINX網關參數

2024-03-01 17:01:15

GraphQL后端

2023-05-31 07:32:37

2019-10-23 09:00:06

Redis數據庫

2024-12-09 09:30:00

適配器模式設計模式代碼

2018-03-15 15:51:40

戴爾

2013-03-04 10:10:36

WebKit瀏覽器

2025-01-10 09:13:36

2010-10-17 13:42:28

云計算醫療平臺開發與測試

2022-04-08 10:15:29

VueReacHooks

2024-01-10 17:04:13

通信模塊通信技術通信模組

2024-03-07 10:21:56

點贊
收藏

51CTO技術棧公眾號

亚洲成人av动漫| 成人国产1314www色视频| 黄页大全在线免费观看| 夜夜爽av福利精品导航| 色综久久综合桃花网| 色中色在线视频| 99久久精品情趣| 久久99久久精品国产| 天天久久夜夜| 日韩中文字幕在线视频播放| 91在线播放网站| 亚洲在线视频免费观看| 国产精品夜夜爽| 国产精品久久久999| 欧洲精品一区二区三区| 日本精品一级二级| 黄p免费网站| 久久网这里都是精品| 亚洲欧美日韩在线综合| 欧美国产91| 国产精品福利观看| 成人av影音| 久久国产精品久久国产精品| 丁香六月激情婷婷| aa国产精品| 成人福利视频在线观看| 香蕉一区二区| 久久久免费av| 亚洲国产中文在线二区三区免| 亚洲欧美日韩区| 日本不卡免费高清视频在线| 51精品秘密在线观看| 国产美女性感在线观看懂色av| 一区二区久久久| 国产精品视频一区二区图片| 国产精品初高中害羞小美女文| 国产婷婷一区二区三区| 亚洲男女网站| 日韩精品免费在线| 超碰caoporn久久| 欧美午夜精品一区二区三区| 亚洲mv在线| 色综合久久久久久久久| 中文字幕在线永久在线视频| 大桥未久av一区二区三区| 香蕉国产在线| 欧洲精品一区二区| 尤物网在线观看| 日韩欧美资源站| 黄色在线观看www| 亚洲人成网站在线播| 日本综合字幕| 九九热精品在线| 婷婷国产精品| 国产情人节一区| 精品成人免费| 亚洲 国产 欧美一区| 黄色日韩网站视频| 1024精品视频| 亚洲精品v日韩精品| 在线观看av片| 欧美精品在线观看播放| av在线加勒比| xxxxx成人.com| 红杏一区二区三区| 国产精品成人免费视频| 欧美黄色免费| 制服丝袜综合日韩欧美| 亚洲精品福利| 日产日韩在线亚洲欧美| 米奇777四色精品人人爽| 51午夜精品国产| 吞精囗交69激情欧美| 九九热这里只有精品6| 日本中文字幕在线一区| 97se在线视频| 卡一卡二国产精品| 亚洲午夜无码av毛片久久| 17c精品麻豆一区二区免费| 性感av在线播放| 日韩一区二区三区在线| 日韩成人一区| 国产综合久久久久| 日韩精品成人一区二区在线| 人人干视频在线| 亚洲一区在线看| 男人添女人下部高潮视频在线观看 | 免费看日本毛片| 一区二区三区 在线观看视频| 欧美黄色激情| 久久亚洲精品国产亚洲老地址| 黄色影院在线播放| 亚洲精品成人久久久| 草草视频在线一区二区| 精品乱子伦一区二区三区| 99视频热这里只有精品免费| 操操操综合网| 精品丝袜一区二区三区| 久久综合色占| 中文字幕精品av| 精品欧美激情在线观看| 伊人av成人| 夜夜精品浪潮av一区二区三区| 深夜国产在线播放| 4p变态网欧美系列| 麻豆精品蜜桃视频网站| 最新日本视频| 亚洲片在线观看| 性xxxx欧美老肥妇牲乱| 97超碰青青草| 在线播放中文字幕一区| youjizz欧美| 51xx午夜影福利| 欧美性做爰猛烈叫床潮| 欧美五码在线| 欧美无砖专区免费| 欧美日韩专区在线| 香蕉久久夜色精品国产使用方法| 婷婷视频在线播放| 欧美性生活影院| 免费黄色成人| 337p粉嫩大胆噜噜噜鲁| 日韩精品一区二区三区中文精品| japanese国产精品| 999精品网站| 亚洲欧洲成视频免费观看| 在线观看视频免费一区二区三区| 婷婷亚洲天堂| 久久艳片www.17c.com| 久99久精品视频免费观看| 成人高清免费在线播放| 日韩美女免费线视频| 91蜜桃视频在线| 自拍视频在线看| 蜜桃av噜噜一区二区三区| 亚洲成人黄色影院| 亚洲男人都懂第一日本| 久久精品网站视频| 中文字幕精品视频| 国产真实乱对白精彩久久| 羞羞的视频在线观看| 国产精品国产一区二区| 午夜精品视频一区| 一本色道久久综合亚洲精品酒店 | 免费国产成人看片在线| 欧美婷婷六月丁香综合色| 国产成人影院| 免费yellow网站| 欧美激情在线狂野欧美精品| 成人国产亚洲欧美成人综合网 | 香蕉影视欧美成人| 中文有码一区| 999大胆视频| 性色av一区二区咪爱| 国产欧美日韩久久| 国产色99精品9i| 日韩五码在线观看| 在线观看国产精品淫| 国产精品中文欧美| 国产精品一二三产区| 欧美亚洲视频一区| 亚洲午夜激情免费视频| 夫妻av一区二区| avtt久久| 99.玖玖.com| 国产精品成人aaaaa网站| 亚洲不卡av一区二区三区| 亚洲色图88| 黄色大片在线播放| 一本久道久久综合| 综合网日日天干夜夜久久| 久久夜色精品一区| 猫咪成人在线观看| 有码在线播放| 精品视频免费观看| 日韩av在线看| 26uuu另类欧美| 美女久久99| h网站在线免费观看| 丝袜足脚交91精品| www日韩欧美| 亚洲欧美日韩国产中文在线| 久久在线视频免费观看| 动漫一区在线| 青草网在线观看| 午夜精品视频在线| 欧美视频在线观看免费| 日韩国产在线观看| 99欧美精品| 午夜视频99| 欧美亚洲另类在线一区二区三区| 亚洲天堂影视av| 亚洲欧美偷拍另类a∨色屁股| 欧美另类综合| 高清不卡亚洲| 8x8x8x视频在线观看| 国产在线精品一区| 中文字幕日韩欧美| 亚洲国产色一区| 激情六月婷婷久久|