溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis秒殺活動(dòng)的設(shè)計(jì)思路是什么

發(fā)布時(shí)間:2021-11-16 14:05:32 來源:億速云 閱讀:114 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“redis秒殺活動(dòng)的設(shè)計(jì)思路是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Redis解決秒殺/搶紅包等高并發(fā)事務(wù)活動(dòng)

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

  • 用戶秒殺庫(kù)存放入秒殺限制數(shù)長(zhǎng)度的Sorted Set

  • 秒殺到指定秒殺數(shù)后,Sorted Set不在接受秒殺請(qǐng)求,并顯示返回標(biāo)識(shí)

  • 秒殺活動(dòng)完全結(jié)束后,定時(shí)任務(wù)同步Redis數(shù)據(jù)到數(shù)據(jù)庫(kù),秒殺活動(dòng)結(jié)束

redis簡(jiǎn)單介紹:

1,Redis

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


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

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

    • 使用有序集合,你可以非??斓兀∣(log(N)))完成添加,刪除和更新元素的操作

    • 元素是在插入時(shí)就排好序的,所以很快地通過評(píng)分(score)或者位次(position)獲得一個(gè)范圍的元素(需要精準(zhǔn)設(shè)定過期時(shí)間的應(yīng)用)

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

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

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

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

    • 盡管Hashes主要用來表示對(duì)象,但它們也能夠存儲(chǔ)許多元素

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

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

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

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

    • 使用SPOP或者SRANDMEMBER命令隨機(jī)地獲取元素

    • Redis列表是簡(jiǎn)單的字符串列表,按照插入順序排序

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

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

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

    • 你可以同時(shí)使用LPUSHLTRIM去創(chuàng)建一個(gè)永遠(yuǎn)不會(huì)超過指定元素?cái)?shù)目列表并同時(shí)記住最后的N個(gè)元素

    • 列表可以用來當(dāng)作消息傳遞基元(primitive),例如,眾所周知的用來創(chuàng)建后臺(tái)任務(wù)的Resque Ruby庫(kù)

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

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

    • 利用INCR命令簇INCR, DECR, INCRBY)來把字符串當(dāng)作原子計(jì)數(shù)器使用

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

    • 字符串(String)


    • 列表(List)


    • 集合(Set)


    • 哈希(Hashes)


    • 有序集合(Sorted Sets)


    • 復(fù)制(Replication, Redis復(fù)制很簡(jiǎn)單易用,它通過配置允許slave Redis Servers或者M(jìn)aster Servers的復(fù)制品)


      • 一個(gè)Master可以有多個(gè)Slaves

      • Slaves能通過接口其他slave的鏈接,除了可以接受同一個(gè)master下面slaves的鏈接以外,還可以接受同一個(gè)結(jié)構(gòu)圖中的其他slaves的鏈接

      • redis復(fù)制是在master段非阻塞的,這就意味著master在同一個(gè)或多個(gè)slave端執(zhí)行同步的時(shí)候還可以接受查詢

      • 復(fù)制slave端也是非阻塞的,假設(shè)你在redis.conf中配置redis這個(gè)功能,當(dāng)slave在執(zhí)行的新的同步時(shí),它仍可以用舊的數(shù)據(jù)信息來提供查詢,否則,你可以配置當(dāng)redis slaves去master失去聯(lián)系是,slave會(huì)給發(fā)送一個(gè)客戶端錯(cuò)誤

      • 為了有多個(gè)slaves可以做只讀查詢,復(fù)制可以重復(fù)2次,甚至多次,具有可擴(kuò)展性(例如:slaves對(duì)話與重復(fù)的排序操作,有多份數(shù)據(jù)冗余就相對(duì)簡(jiǎn)單了)

      • 他可以利用復(fù)制去避免在master端保存數(shù)據(jù),只要對(duì)master端redis.conf進(jìn)行配置,就可以避免保存(所有的保存操作),然后通過slave的鏈接,來實(shí)時(shí)的保存在slave端

    • LRU過期處理(Eviction)


      • Redis允許為每一個(gè)key設(shè)置不同的過期時(shí)間,當(dāng)它們到期時(shí)將自動(dòng)從服務(wù)器上刪除(EXPIRE)

      • EVAL 和 EVALSHA 命令是從 Redis 2.6.0 版本開始的,使用內(nèi)置的 Lua 解釋器,可以對(duì) Lua 腳本進(jìn)行求值

      • Redis 使用單個(gè) Lua 解釋器去運(yùn)行所有腳本,并且, Redis 也保證腳本會(huì)以原子性(atomic)的方式執(zhí)行: 當(dāng)某個(gè)腳本正在運(yùn)行的時(shí)候,不會(huì)有其他腳本或 Redis 命令被執(zhí)行。 這和使用MULTI / EXEC 包圍的事務(wù)很類似。 在其他別的客戶端看來,腳本的效果(effect)要么是不可見的(not visible),要么就是已完成的(already completed)

      • LRU過期處理(Eviction)


    • 事務(wù)


      • MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事務(wù)的基礎(chǔ)

      • 事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請(qǐng)求所打斷

      • 事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行,EXEC 命令負(fù)責(zé)觸發(fā)并執(zhí)行事務(wù)中的所有命令  

      • Redis 的 Transactions 提供的并不是嚴(yán)格的 ACID 的事務(wù)

      • Transactions 還是提供了基本的命令打包執(zhí)行的功能: 可以保證一連串的命令是順序在一起執(zhí)行的,中間有會(huì)有其它客戶端命令插進(jìn)來執(zhí)行

      • Redis 還提供了一個(gè) Watch 功能,你可以對(duì)一個(gè) key 進(jìn)行 Watch,然后再執(zhí)行 Transactions,在這過程中,如果這個(gè) Watched 的值進(jìn)行了修改,那么這個(gè) Transactions 會(huì)發(fā)現(xiàn)并拒絕執(zhí)行

    • 數(shù)據(jù)持久化


      • 同時(shí)使用兩種持久化功能

      • 特點(diǎn)


      • 優(yōu)點(diǎn)


      • 缺點(diǎn)


      • AOF持久化方式記錄每次對(duì)服務(wù)器寫的操作

      • redis重啟的時(shí)候會(huì)優(yōu)先載入AOF文件恢復(fù)原始的數(shù)據(jù),因?yàn)樵谕ǔG闆r下AOF文件保存的數(shù)據(jù)集要比RDB文件保存的數(shù)據(jù)集要完整

      • 使用AOF 會(huì)讓你的Redis更加耐久: 你可以使用不同的fsync策略無fsync,每秒fsync,每次寫的時(shí)候fsync

      • AOF文件是一個(gè)只進(jìn)行追加的日志文件,所以不需要寫入seek

      • Redis 可以在 AOF 文件體積變得過大時(shí),自動(dòng)地在后臺(tái)對(duì) AOF 進(jìn)行重寫

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

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

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

      • 特點(diǎn)


      • 優(yōu)點(diǎn)


      • 缺點(diǎn)


      • RDB持久化方式能夠在指定的時(shí)間間隔能對(duì)你的數(shù)據(jù)進(jìn)行快照存儲(chǔ)

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

      • RDB是一個(gè)緊湊的單一文件, 非常適用于災(zāi)難恢復(fù)

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

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

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

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

      • RDB


      • AOF


      • 選擇


        • 分布式


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

          • 對(duì)于客戶端而言,redis集群是透明的,客戶端簡(jiǎn)單,遍于動(dòng)態(tài)擴(kuò)容

          • Proxy為單點(diǎn)、處理一致性hash時(shí),集群節(jié)點(diǎn)可用性檢測(cè)不存在腦裂問題

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

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

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

          • 依次類推

          • Redis Cluster (Redis 3版本)

          • Keepalived


          • Twemproxy


        • 高可用(HA)


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

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

          • 雙M-S結(jié)構(gòu)的特點(diǎn)是在每臺(tái)服務(wù)器上配置一個(gè)Master Redis,同時(shí)部署一個(gè)Slave Redis。由兩個(gè)Redis Sentinel同時(shí)對(duì)4個(gè)Redis進(jìn)行監(jiān)控兩個(gè)Master Redis可以同時(shí)對(duì)應(yīng)用程序提供讀寫服務(wù),即便其中一個(gè)服務(wù)器出現(xiàn)故障,另一個(gè)服務(wù)器也可以同時(shí)運(yùn)行兩個(gè)Master Redis提供讀寫服務(wù)

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

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

          • Slave服務(wù)器中配置Slave Redis(Redis-1S)和Slave Sentinel(Sentinel-1S)

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

          • 監(jiān)控(Monitoring): Redis Sentinel實(shí)時(shí)監(jiān)控主服務(wù)器和從服務(wù)器運(yùn)行狀態(tài)

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

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

          • Redis Sentinel(redis自帶的集群管理工具 )


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


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


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


          • 發(fā)布/訂閱(Pub/Sub)

          • 監(jiān)控:Redis-Monitor


            • 歷史redis運(yùn)行查詢:CPU、內(nèi)存、命中率、請(qǐng)求量、主從切換

            • 實(shí)時(shí)監(jiān)控曲線

          2,數(shù)據(jù)類型Redis使用場(chǎng)景

          • String


            •  計(jì)數(shù)器應(yīng)用

          • List


            • 最新N個(gè)數(shù)據(jù)的操作

            • 消息隊(duì)列

            • 刪除過濾

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

          • Set


            • Uniqe操作,獲取某段時(shí)間所有數(shù)據(jù)排重值

            • 實(shí)時(shí)系統(tǒng),反垃圾系統(tǒng)

            • 共同好友、二度好友

            • 利用唯一性,可以統(tǒng)計(jì)訪問網(wǎng)站的所有獨(dú)立 IP

            • 好友推薦的時(shí)候,根據(jù) tag 求交集,大于某個(gè) threshold 就可以推薦

          • Hashes


            • 存儲(chǔ)、讀取、修改用戶屬性

          • Sorted Set


            • 排行榜應(yīng)用,取TOP N操作

            • 需要精準(zhǔn)設(shè)定過期時(shí)間的應(yīng)用(時(shí)間戳作為Score)

            • 帶有權(quán)重的元素,比如一個(gè)游戲的用戶得分排行榜

            • 過期項(xiàng)目處理,按照時(shí)間排序

          “redis秒殺活動(dòng)的設(shè)計(jì)思路是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

          向AI問一下細(xì)節(jié)

          免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

          AI