需求背景:
由於業務需求,需要在線上用戶表添加渠道字段,用於區分不同渠道注冊的用戶,目前該表有20+個字段,8個索引
線上用戶數據大概1500W左右,需要不停機增加數據庫字段,同時需要刷新Redis緩存中的用戶數據
發生的問題:
問題1.添加字段可能會鎖表,影響線上業務的操作;
問題2.刪除Redis緩存中的數據,數據量過大,無法直接精准的進行刪除處理,可能的情況就是造成一邊刪除舊用戶信息,一邊生成新用戶信息
解決方案:
針對於問題一:
由於MySQL5.6版本以后,提供了在執行DDL語句時,無鎖添加字段 添加索引的機制,即ALGORITHM=inplace,LOCK=NONE
最終添加字段的語句被優化成
ALTER TABLE `表名`
ADD COLUMN .......(此處省略),ALGORITHM=inplace,LOCK=NONE;
線上執行共計花了250多秒,沒有出現鎖表的情況,不影響線上業務流程
針對於問題二:
緩存的清理涉及到數據量大的問題,這里采用了線上代碼兼容的方式;