久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis瞬時高并發(fā)秒殺的示例分析

242次閱讀
沒有評論

共計 5480 個字符,預計需要花費 14 分鐘才能閱讀完成。

這篇文章給大家分享的是有關(guān) Redis 瞬時高并發(fā)秒殺的示例分析的內(nèi)容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。

1.Redis

豐富的數(shù)據(jù)結(jié)構(gòu)(Data Structures)

字符串(String)

  Redis 字符串能包含任意類型的數(shù)據(jù);;

  一個字符串類型的值最多能存儲 512M 字節(jié)的內(nèi)容;

  利用 INCR 命令簇(INCR, DECR, INCRBY)來把字符串當作原子計數(shù)器使用;

  使用 APPEND 命令在字符串后添加內(nèi)容。

列表(List)

  Redis 列表是簡單的字符串列表,按照插入順序排序;

  你可以添加一個元素到列表的頭部(左邊:LPUSH)或者尾部(右邊:RPUSH);

  一個列表最多可以包含 232- 1 個元素(4294967295,每個表超過 40 億個元素);

  在社交網(wǎng)絡中建立一個時間線模型,使用 LPUSH 去添加新的元素到用戶時間線中,使用 LRANGE 去檢索一些最近插入的條目;

  你可以同時使用 LPUSH 和 LTRIM 去創(chuàng)建一個永遠不會超過指定元素數(shù)目的列表并同時記住最后的 N 個元素;

  列表可以用來當作消息傳遞的基元(primitive),例如,眾所周知的用來創(chuàng)建后臺任務的 Resque Ruby 庫。

集合(Set)

  Redis 集合是一個無序的,不允許相同成員存在的字符串合集(Uniq 操作,獲取某段時間所有數(shù)據(jù)排重值);

  支持一些服務端的命令從現(xiàn)有的集合出發(fā)去進行集合運算,如合并(并集:union), 求交(交集:intersection),差集, 找出不同元素的操作(共同好友、二度好友);

  用集合跟蹤一個獨特的事。想要知道所有訪問某個博客文章的獨立 IP?只要每次都用 SADD 來處理一個頁面訪問。那么你可以肯定重復的 IP 是不會插入的(利用唯一性,可以統(tǒng)計訪問網(wǎng)站的所有獨立 IP);

  Redis 集合能很好的表示關(guān)系。你可以創(chuàng)建一個 tagging 系統(tǒng),然后用集合來代表單個 tag。接下來你可以用 SADD 命令把所有擁有 tag 的對象的所有 ID 添加進集合,這樣來表示這個特定的 tag。如果你想要同時有 3 個不同 tag 的所有對象的所有 ID,那么你需要使用 SINTER。

  使用 SPOP 或者 SRANDMEMBER 命令隨機地獲取元素。

哈希(Hashes)

  Redis Hashes 是字符串字段和字符串值之間的映射;

  盡管 Hashes 主要用來表示對象,但它們也能夠存儲許多元素。

有序集合(Sorted Sets)

  Redis 有序集合和 Redis 集合類似,是不包含相同字符串的合集;

  每個有序集合的成員都關(guān)聯(lián)著一個評分,這個評分用于把有序集合中的成員按最低分到最高分排列(排行榜應用,取 TOP N 操作);

  使用有序集合,你可以非常快地(O(log(N)))完成添加,刪除和更新元素的操作;

  元素是在插入時就排好序的,所以很快地通過評分 (score) 或者位次 (position) 獲得一個范圍的元素(需要精準設定過期時間的應用);

  輕易地訪問任何你需要的東西: 有序的元素,快速的存在性測試,快速訪問集合中間元素;

  在一個巨型在線游戲中建立一個排行榜,每當有新的記錄產(chǎn)生時,使用 ZADD 來更新它。你可以用 ZRANGE 輕松地獲取排名靠前的用戶,你也可以提供一個用戶名,然后用 ZRANK 獲取他在排行榜中的名次。同時使用 ZRANK 和 ZRANGE 你可以獲得與指定用戶有相同分數(shù)的用戶名單。所有這些操作都非常迅速;

  有序集合通常用來索引存儲在 Redis 中的數(shù)據(jù)。例如:如果你有很多的 hash 來表示用戶,那么你可以使用一個有序集合,這個集合的年齡字段用來當作評分,用戶 ID 當作值。用 ZRANGEBYSCORE 可以簡單快速地檢索到給定年齡段的所有用戶。

復制(Replication, Redis 復制很簡單易用,它通過配置允許 slave Redis Servers 或者 Master Servers 的復制品)一個 Master 可以有多個 Slaves 能通過接口其他 slave 的鏈接,除了可以接受同一個 master 下面 slaves 的鏈接以外,還可以接受同一個結(jié)構(gòu)圖中的其他 slaves 的鏈接 redis 復制是在 master 段是非阻塞的,這就意味著 master 在同一個或多個 slave 端執(zhí)行同步的時候還可以接受查詢復制在 slave 端也是非阻塞的,假設你在 redis.conf 中配置 redis 這個功能,當 slave 在執(zhí)行的新的同步時,它仍可以用舊的數(shù)據(jù)信息來提供查詢,否則,你可以配置當 redis slaves 去 master 失去聯(lián)系是,slave 會給發(fā)送一個客戶端錯誤為了有多個 slaves 可以做只讀查詢,復制可以重復 2 次,甚至多次,具有可擴展性(例如:slaves 對話與重復的排序操作,有多份數(shù)據(jù)冗余就相對簡單了)他可以利用復制去避免在 master 端保存數(shù)據(jù),只要對 master 端 redis.conf 進行配置,就可以避免保存(所有的保存操作),然后通過 slave 的鏈接,來實時的保存在 slave 端 LRU 過期處理(Eviction)EVAL 和 EVALSHA 命令是從 Redis 2.6.0 版本開始的,使用內(nèi)置的 Lua 解釋器,可以對 Lua 腳本進行求值 Redis 使用單個 Lua 解釋器去運行所有腳本,并且,Redis 也保證腳本會以原子性 (atomic) 的方式執(zhí)行:當某個腳本正在運行的時候,不會有其他腳本或 Redis 命令被執(zhí)行。這和使用 MULTI / EXEC 包圍的事務很類似。在其他別的客戶端看來,腳本的效果 (effect) 要么是不可見的(not visible),要么就是已完成的(already completed)LRU 過期處理(Eviction)。

Redis 允許為每一個 key 設置不同的過期時間,當它們到期時將自動從服務器上刪除(EXPIRE)。

事務  MULTI、EXEC、DISCARD 和 WATCH 是 Redis 事務的基礎事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執(zhí)行。事務在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷事務中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行,EXEC 命令負責觸發(fā)并執(zhí)行事務中的所有命令   Redis 的 Transactions 提供的并不是嚴格的 ACID 的事務 Transactions 還是提供了基本的命令打包執(zhí)行的功能:可以保證一連串的命令是順序在一起執(zhí)行的,中間有會有其它客戶端命令插進來執(zhí)行 Redis 還提供了一個 Watch 功能,你可以對一個 key 進行 Watch,然后再執(zhí)行 Transactions,在這過程中,如果這個 Watched 的值進行了修改,那么這個 Transactions 會發(fā)現(xiàn)并拒絕執(zhí)行數(shù)據(jù)持久化 RDB。

特點:

RDB 持久化方式能夠在指定的時間間隔能對你的數(shù)據(jù)進行快照存儲。

優(yōu)點:

RDB 是一個非常緊湊的文件, 它保存了某個時間點得數(shù)據(jù)集, 非常適用于數(shù)據(jù)集的備份;

RDB 是一個緊湊的單一文件, 非常適用于災難恢復;

RDB 在保存 RDB 文件時父進程唯一需要做的就是 fork 出一個子進程, 接下來的工作全部由子進程來做,父進程不需要再做其他 IO 操作,所以 RDB 持久化方式可以最大化 redis 的性能;

與 AOF 相比, 在恢復大的數(shù)據(jù)集的時候,RDB 方式會更快一些。

缺點:

如果你希望在 redis 意外停止工作(例如電源中斷)的情況下丟失的數(shù)據(jù)最少的話,那么 RDB 不適合,Redis 要完整的保存整個數(shù)據(jù)集是一個比較繁重的工作。

RDB 需要經(jīng)常 fork 子進程來保存數(shù)據(jù)集到硬盤上, 當數(shù)據(jù)集比較大的時候,fork 的過程是非常耗時的, 可能會導致 Redis 在一些毫秒級內(nèi)不能響應客戶端的請求. 如果數(shù)據(jù)集巨大并且 CPU 性能不是很好的情況下, 這種情況會持續(xù) 1 秒,AOF 也需要 fork, 但是你可以調(diào)節(jié)重寫日志文件的頻率來提高數(shù)據(jù)集的耐久度。

AOF

特點

AOF 持久化方式記錄每次對服務器寫的操作;

redis 重啟的時候會優(yōu)先載入 AOF 文件來恢復原始的數(shù)據(jù), 因為在通常情況下 AOF 文件保存的數(shù)據(jù)集要比 RDB 文件保存的數(shù)據(jù)集要完整。

優(yōu)點

  使用 AOF 會讓你的 Redis 更加耐久: 你可以使用不同的 fsync 策略:無 fsync, 每秒 fsync, 每次寫的時候 fsync;

  AOF 文件是一個只進行追加的日志文件, 所以不需要寫入 seek;

  Redis 可以在 AOF 文件體積變得過大時,自動地在后臺對 AOF 進行重寫;

  AOF 文件有序地保存了對數(shù)據(jù)庫執(zhí)行的所有寫入操作,這些寫入操作以 Redis 協(xié)議的格式保存,因此 AOF 文件的內(nèi)容非常容易被人讀懂,對文件進行分析(parse)也很輕松。導出(export)AOF 文件也非常簡單;

缺點

  對于相同的數(shù)據(jù)集來說,AOF 文件的體積通常要大于 RDB 文件的體積;

  根據(jù)所使用的 fsync 策略,AOF 的速度可能會慢于 RDB。

選擇

  同時使用兩種持久化功能。

分布式 Redis Cluster(Redis 3 版本)Keepalived

  當 Master 掛了后,VIP 漂移到 Slave;Slave 上 keepalived 通知 redis 執(zhí)行:slaveof no one , 開始提供業(yè)務;

  當 Master 起來后,VIP 地址不變,Master 的 keepalived 通知 redis 執(zhí)行 slaveof slave IP host,開始作為從同步數(shù)據(jù);

  依次類推。

Twemproxy

  快、輕量級、減少后端 Cache Server 連接數(shù)、易配置、支持 ketama、modula、random、常用 hash 分片算法;

  對于客戶端而言,redis 集群是透明的,客戶端簡單,遍于動態(tài)擴容;

  Proxy 為單點、處理一致性 hash 時,集群節(jié)點可用性檢測不存在腦裂問題;

  高性能,CPU 密集型,而 redis 節(jié)點集群多 CPU 資源冗余,可部署在 redis 節(jié)點集群上,不需要額外設備。

高可用(HA)Redis Sentinel(redis 自帶的集群管理工具)

  監(jiān)控(Monitoring):Redis Sentinel 實時監(jiān)控主服務器和從服務器運行狀態(tài);

  提醒(Notification):當被監(jiān)控的某個 Redis 服務器出現(xiàn)問題時,Redis Sentinel 可以向系統(tǒng)管理員發(fā)送通知,也可以通過 API 向其他程序發(fā)送通知;

  自動故障轉(zhuǎn)移(Automatic failover):當一個主服務器不能正常工作時,Redis Sentinel 可以將一個從服務器升級為主服務器,并對其他從服務器進行配置,讓它們使用新的主服務器。當應用程序連接到 Redis 服務器時,Redis Sentinel 會告之新的主服務器地址和端口。

單 M - S 結(jié)構(gòu)

  單 M - S 結(jié)構(gòu)特點是在 Master 服務器中配置 Master Redis(Redis-1M)和 Master Sentinel(Sentinel-1M);

  Slave 服務器中配置 Slave Redis(Redis-1S)和 Slave Sentinel(Sentinel-1S);

  其中 Master Redis 可以提供讀寫服務,但是 Slave Redis 只能提供只讀服務。因此,在業(yè)務壓力比較大的情況下,可以選擇將只讀業(yè)務放在 Slave Redis 中進行。

雙 M - S 結(jié)構(gòu)

  雙 M - S 結(jié)構(gòu)的特點是在每臺服務器上配置一個 Master Redis,同時部署一個 Slave Redis。由兩個 Redis Sentinel 同時對 4 個 Redis 進行監(jiān)控。兩個 Master Redis 可以同時對應用程序提供讀寫服務,即便其中一個服務器出現(xiàn)故障,另一個服務器也可以同時運行兩個 Master Redis 提供讀寫服務;

  缺點是兩個 Master redis 之間無法實現(xiàn)數(shù)據(jù)共享,不適合存在大量用戶數(shù)據(jù)關(guān)聯(lián)的應用使用。

單 M - S 結(jié)構(gòu)和雙 M - S 結(jié)構(gòu)比較

  單 M - S 結(jié)構(gòu)適用于不同用戶數(shù)據(jù)存在關(guān)聯(lián),但應用可以實現(xiàn)讀寫分離的業(yè)務模式。Master 主要提供寫操作,Slave 主要提供讀操作,充分利用硬件資源;

  雙(多)M- S 結(jié)構(gòu)適用于用戶間不存在或者存在較少的數(shù)據(jù)關(guān)聯(lián)的業(yè)務模式,讀寫效率是單 M - S 的兩(多)倍,但要求故障時單臺服務器能夠承擔兩個 Mater Redis 的資源需求;

  發(fā)布 / 訂閱(Pub/Sub)監(jiān)控:Redis-Monitor 歷史 redis 運行查詢:CPU、內(nèi)存、命中率、請求量、主從切換等實時監(jiān)控曲線。

2. 數(shù)據(jù)類型 Redis 使用場景

String

計數(shù)器應用

List

  取最新 N 個數(shù)據(jù)的操作;

  消息隊列;

  刪除與過濾;

  實時分析正在發(fā)生的情況,用于數(shù)據(jù)統(tǒng)計與防止垃圾郵件(結(jié)合 Set);

Set Uniqe 操作,獲取某段時間所有數(shù)據(jù)排重值實時系統(tǒng),反垃圾系統(tǒng)共同好友、二度好友利用唯一性,可以統(tǒng)計訪問網(wǎng)站的所有獨立 IP 好友推薦的時候,根據(jù) tag 求交集,大于某個 threshold 就可以推薦 Hashes。

  存儲、讀取、修改用戶屬性;

Sorted Set 排行榜應用,取 TOP N 操作需要精準設定過期時間的應用(時間戳作為 Score)帶有權(quán)重的元素,比如一個游戲的用戶得分排行榜過期項目處理,按照時間排序。

3.Redis 解決秒殺 / 搶紅包等高并發(fā)事務活動

  秒殺開始前 30 分鐘把秒殺庫存從數(shù)據(jù)庫同步到 Redis Sorted Set;

  用戶秒殺庫存放入秒殺限制數(shù)長度的 Sorted Set;

  秒殺到指定秒殺數(shù)后,Sorted Set 不在接受秒殺請求,并顯示返回標識;

  秒殺活動完全結(jié)束后,同步 Redis 數(shù)據(jù)到數(shù)據(jù)庫,秒殺正式結(jié)束。

感謝各位的閱讀!關(guān)于“Redis 瞬時高并發(fā)秒殺的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計5480字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 古田县| 鹰潭市| 新津县| 宁国市| 始兴县| 页游| 揭阳市| 同心县| 泾阳县| 九台市| 尼木县| 扶绥县| 佛学| 内江市| 汾西县| 斗六市| 陵水| 南康市| 昔阳县| 边坝县| 三都| 沅江市| 吉首市| 左权县| 自贡市| 交口县| 文安县| 育儿| 皮山县| 万安县| 凌源市| 澄城县| 宁晋县| 井冈山市| 法库县| 伊川县| 宁远县| 盐亭县| 夏河县| 祥云县| 河源市|