抽獎活動每天每個用戶限抽3次 且透過redis計數來防超抽
目前key的格式如下所示
mobile_%s_date_yyyyMMdd_draw_count
因抽獎目前只有一個活動但後期可能同時存在多個抽獎活動(每個活動有不同的獎品和配置如中獎概率等) 而每個抽獎活動都是獨立的在A活動中抽完3次後,還是可以去B活動抽獎所以之前的key就不合適了
需要加上活動ID 如
activity_%d_mobile_%s_date_%s_draw_count
但發現無縫上線就不方便了
例如在程式碼上線前統一重命名已有的key 如
rename mobile_%s_date_yyyyMMdd_draw_count activity_%d_mobile_%s_date_yyyyMMdd_draw_count
但是在上線期間(如有16個tomcat實例逐個更新) 若有用戶訪問這時仍去調用的舊接口所以仍用的不含活動前綴(activity_%d
)的key 這樣導致一個問題在這段期間內抽完的用戶當天稍後再次進來的時候因為新key不存在所以相當於當天首次來抽所以還能繼續抽3次該如何避免這種問題呢?
現在想到的解決方案 基於線上程式碼建立一個分支 先修改key為activity_%d_mobile_%s_date_%s_draw_count
如
if(new Date() > '2016-08-13') { //从第二天开始 启用新key
String key = format("activity_%d_mobile_%s_date_%s_draw_count",...);
incr(key);
}else{ //当天仍用旧key
String key = format("mobile_%s_date_%s_draw_count",...);
incr(key);
}
這樣的話 後面上線的時候就不用顯式重命名了 因為早就啟用了新key。
除此之外 還有其他的方案嗎?
你的抽獎key名存放在一個redis的key下 應用啟動從這個key下取抽獎的key名並緩存到應用中就行了啊