鍍金池/ 問答/人工智能  數(shù)據(jù)庫(kù)/ 高效的優(yōu)惠券(發(fā)送和使用)技術(shù)選型和方案

高效的優(yōu)惠券(發(fā)送和使用)技術(shù)選型和方案

問題描述

最近要做高速率的發(fā)放優(yōu)惠券系統(tǒng),現(xiàn)在數(shù)據(jù)庫(kù)用的mysql,有分庫(kù)分表,但對(duì)發(fā)送速率有瓶頸,而且對(duì)于批量操作比較復(fù)雜(按照用戶ID取模做的分庫(kù)分表,對(duì)批量用戶,也就是無規(guī)則的userId的處理比較麻煩)。想用redis或mongodb來做db,然后worker同步到mysql(mysql只做最后保障和數(shù)據(jù)分析用,業(yè)務(wù)中不使用)。對(duì)于mogno不太熟悉,請(qǐng)問有什么好的解決方案?

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

考慮過直接使用redis,使用List結(jié)構(gòu),存儲(chǔ)每個(gè)用戶的優(yōu)惠券列表,key為XXX_{userId}。有些不好解決的問題,例如使用優(yōu)惠券時(shí)的更新操作,還有定期刪除一段時(shí)間的過期數(shù)據(jù),等等。

相關(guān)代碼

// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

請(qǐng)問有沒有成熟的設(shè)計(jì)方案,可以處理大量的高速的發(fā)券(插入)操作,并且對(duì)于用戶查看/使用優(yōu)惠券等場(chǎng)景的并發(fā)處理和響應(yīng)速率有高性能的支持。

回答
編輯回答
葬憶

看了一遍下來我覺得你要解決的似乎就2個(gè)問題:

  1. 較高的插入性能
  2. 方便地更新和刪除

從MongoDB的角度來講滿足這2點(diǎn)沒有什么問題。

  1. MongoDB的分片機(jī)制可以讓數(shù)據(jù)在邏輯上是一個(gè)整體,在物理上分散到不同的服務(wù)器。比起分庫(kù)分表是一個(gè)更簡(jiǎn)單易用的解決方案。
  2. 性能上給個(gè)簡(jiǎn)單參考:在我的Macbook Pro (SSD磁盤)上一個(gè)沒有任何優(yōu)化的實(shí)例插入小文檔(100字節(jié)左右),應(yīng)用BULK操作大約能有10w+/s的插入速度。如果有必要還可以通過分片加服務(wù)器來擴(kuò)展。
  3. 不清楚你要進(jìn)行什么樣的更新,但是通常情況下MongoDB可以根據(jù)指定的條件更新指定的文檔,并且可以命中二級(jí)索引,大部分場(chǎng)景下是適用的。至于刪除數(shù)據(jù),MongoDB有TTL Index可以自動(dòng)根據(jù)時(shí)間刪除過期的數(shù)據(jù)。

不知道有沒有解答到你的疑問。如果有更詳細(xì)的需求可以再描述一下。

2017年9月28日 18:15