高併發的情況下(100W),資料先存在Redis保證快速響應,然後怎麼往MySql裡面寫?

時間 2021-05-10 12:20:56

1樓:yoiio

我們公司是第三市值的公司, 我們服務是公司小服務, 1秒3000萬請求, 一天大概1.5-2萬億, 不需要保證ACID, 一般通過水平擴容機器解決

我們公司在中國是遮蔽詞

2樓:鳴鳴先生

這麼設計也是很獨特。

既然redis已經存了,那就用redis好了,redis本身是可以支援持久化的,為什麼最終還要寫到資料庫呢?

這麼設計還會有個問題,資料庫的資料會不一致。比如客戶端已經寫入了乙個資料,但之後立即去資料庫查詢,會發現查詢不到,因為此時資料還在redis。

有些場景下,這會是乙個很嚴重的問題,比如庫存管理,訂單管理。但貌似題主不可能是庫存和訂單,這麼大併發的庫存和訂單,題主公司要賺翻了。這只是給個例子,此重場景下,此方案不可用。

如果如果題主是日誌之類的非實時場景,可以考慮kafka之類的日誌系統。

3樓:姜旺生

假設這裡高併發是指高併發寫:

1. 看下資料的屬性,如果資料冷熱明顯,非同步本身已經帶來很多的合併(同乙個資料項的多次修改只寫一次 mysql);使用 batch write,最終到 mysql 的 tps 會有效降低。

2. 嘗試估算上面的 tps 值(拍腦袋、壓測、...),準備 mysql 資源。mysql 水平擴已經有很成熟的方案,可以做到對應用基本透明。

另外,這個模型(寫入 redis 即返回成功,由另外的流程同步到 mysql)讀寫都由 redis 完成,redis 承擔了 db 的職責,而 mysql 只能算是冷備

4樓:魚魚魚

目前高併發的處理一般都是選用限流+佇列+非同步,放到訊息佇列中介軟體要比redis實現的訊息佇列更可靠。

根據業務場景選擇對應的佇列

強一致性的訊息可選擇:RabbitMq、ActiveMQ可以持久化訊息、佇列

訊息丟不丟失無所謂,可以選擇kafka。效能吊炸天佇列的單個消費者可以開啟多執行緒 + 集群

這樣的話基本碼機器就行了。最後的瓶頸會到訊息佇列。優化佇列即可,分布式佇列是乙個解決方案

5樓:麵條

我對問題的理解:是讀高併發達到100w,寫併發可能不到1/100(畢竟100w併發寫的應用很少),題主希望做到資料一致性和高可用性。如果是這個需求,要做到高可用性,使用redis並不是好方案,我建議在邏輯層進行分庫,根據不同資料入不同庫,再在不同庫所在伺服器間做主從備份。

只要在邏輯層控制好庫的切換可以做到比較好的平衡。迷戀不可軟體不如用最暴力簡單的方法。

6樓:LogE

首先,我覺得題主的問題並沒有交代明白需求是什麼? (樓主的提出的是「要求」,不是「需求」,題主要求是存redis然後往mysql寫)

但是,需求和要求是有區別的,不同的需求有不同的做法,隨意猜想題主可能的需求:

在資料被寫入後可以快速響應的前提下,同時滿足下面乙個需求(1)是為了更可靠的持久化

(2)還是轉換儲存形式方便sql查詢

題主可以先明確一下「需求」(not 「要求」),再繼續回答:)對於需求(1)

對於需求(2)

7樓:就是這一刻

用redis快取sql語句。如果是insert和del的話,用list。然後如果是update的話,用redis的hash表存mysql語句,每個語句有個key。

key可以用mysql的表名加鍵值的方式保證唯一,這樣可以合併update語句。然後另外乙個程序讀取寫入mysql。每次讀取這個表的時候,rename老表,然後讀新表。

8樓:eechen

因為還沒有寫入MySQL,所以你在把資料寫入Redis時,需要設計乙個key來唯一標識一條資料.

MySQL表中應該設定乙個唯一字段用於儲存這個key.

這個key可以是乙個由程式即時生成的隨機唯一值,比如可以取Linux提供的uuid:

/proc/sys/kernel/random/uuid

取到後用sadd新增到Redis的集合(元素唯一)裡.

新增成功,表示集合中沒有這個uuid,在集合裡是唯一的.

然後再把這個uuid用lpush新增到Redis的列表(元素有序)裡.

lpush入隊後,當列表的長度大於等於N(自定義數值)時,Redis用lrange取出列表裡的元素並批量寫入到MySQL,寫入成功後用ltrim刪掉列表中已經處理的元素.

優化就體現在:原來的即時寫入轉變為批量寫入.

風險是:Redis意外崩潰有可能丟資料.

那就有丟失前1秒資料的風險.

9樓:

用個非同步佇列慢慢同步 MYSQL就好了

首先100%保證 Redis 高可用

存入Redis的同時,丟一分資料到Kafka,然後自己處理 Kafka 跟Mysql資料的寫入(如果你不要求高一致性的話KAFKA是不錯的選擇。)

10樓:雁南歸

搭乙個kafka集群,資料寫到redis的同時丟到集群中,後面可以起一堆服務非同步的往資料庫寫。

這種情況下,資料可以分庫,可以按id讓不同的資料落入到不同的庫中。為了保證擴充套件性,落庫策略可以用一致性雜湊處理一下。

11樓:skipper

這個和Redis的關係不大吧?想緩解MySQL 壓力,接入服務把資料寫入佇列快取,用乙個消費佇列資料的服務寫MySQL 。

12樓:彼得潘大叔

看你是什麼場景,

讀多還是寫多

讀取的資料需不需要很實時

資料寫入是不是一定要即時並無延時無誤

資料寫入的入口多不多,能否保證全部都會按要求同時寫redis和MySQL

假如有一張100W左右資料的表,根據查詢條件進行分頁。如何分頁?

木文 查詢條件裡加上fromid limit可解決資料無變化的分頁問題。頁面和後台 實時同步,在發生增刪改的情況下,可以做到,但好像沒有簡單的方法。一般情況下出錯就出錯吧,接受這個不完美的世界。出錯了不怕,可以知道出錯了就行。 第乙個問題,你是倒序列出來才會存在這樣的情況,那麼順序列出來就可以。非要...

怎麼在不開啟excel的情況下篩選資料?

郭大牛 途徑很多 第乙個,把你的這些資料全部匯入到資料庫裡面。然後再用資料庫來做查詢。第二個,新建乙個Excel檔案,然後使用Microsoft query來查詢。第三個,使用VBA來建立ado連線查詢。第四個,如果你的Excel版本在2016或者以上的,那麼可以使用power query。這個是個...

併發情況下開啟事務為什麼還會出現髒讀的情況?

啊目 跟設定的db事務隔離級別有關係,mysql預設是可重複度 RR 預設隔離級別不會存在髒讀情況,看看是否自己設定過隔離級別,看一下隔離級別。 浪狼郎 這個錯誤產生的原因,其他大佬解釋的差不多了,我做一些其他解釋,方便你理解理論和實踐當中的一點不同。不太清楚你用的什麼資料庫,因此不同的資料庫之間有...