redis key 重命名如何无缝升级

 Aaron阿龙_1947_446 发布于 2022-10-25 05:41

抽奖活动每天每个用户限抽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。

除此之外 还有其他的方案吗?

1 个回答
  • 你的抽奖key名存放在一个redis的key下 应用启动从这个key下取抽奖的key名并缓存到应用中就行了啊

    2022-10-26 14:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有