redis 在業務層面的應用之訂單系統分庫分表的索引表

分庫分表的時候,仍然有多維度查詢的需求,這個時候,常見方式是作索引表,索引表有多種實現方式,能夠用redis, 能夠用mysql binlog 實現等等,當用redis 實現索引表,咱們怎麼去設計?咱們要主要哪些要點呢?好比咱們之外賣訂單爲例,用district 分表,分別創建商戶的索引表和乘客的索引表。mysql

  1. 咱們的查詢需求有哪些?
  2. 用redis 作索引表,咱們用什麼數據結構合適?怎麼設計?
  3. 索引表與主庫怎麼保證一致性?

咱們有哪些需求?

查詢需求主要有來自訂單id 的,來自商家id,來自買家id的需求,同時,還有查詢商家歷史訂單,查詢買家歷史訂單。而後,咱們全國的訂單,默認若是按照地區分表,這裏商家id 和買家id 若是跟訂單id 和地區映射起來?同時,歷史訂單,涉及了時間維度,如何設計索引數據結構?redis

如何用redis 作索引表?

使用redis 若是知足上面的索引需求?這裏zset 是很是合適的。sql

新建訂單

zadd salerId timestamp OrderId+district;
zadd buyerId timestamp OrderId+district;

查詢商家歷史訂單

zrange salerId  timestamp1 timestamp2
select * from table where order_id =xxx;

查詢買家歷史訂單

zrange buyerId  timestamp1 timestamp2
select * from table where order_id =xxx;

索引表表和主庫的一致性如何保證?

索引表須要跟主庫訂單表是強一致的,這裏有幾個問題。寫的時候是先寫redis 仍是先寫mysql ,讀的時候redis 沒讀到,可是mysql 有改若是處理? 其實比較好處理,寫先寫redis,讀的時候讀不到直接返回。強一致須要redis 和 mysql 定時對帳,而後redis 爲了防止被開發誤操做,須要權限校驗,key 審覈,要在codis 層過濾一遍key,過濾掉flush 等指令。數據結構

綜上,利用redis 作mysql 的二級索引實際上是可行的方案,在一些大公司也有過一些實踐。使用redis 作索引表有什麼缺陷呢?畢竟redis 是內存結構,若是發生數據丟失,索引重構是很是噁心的。設計

相關文章
相關標籤/搜索