系统需要生成根据业务类型生成流水号,每天从1开始生成,第二天会清零继续从0开始,流水号格式为: bizCode + date + incr  如:TT-2017112300001。

思路:利用Redis Incr 生成序列号,使用日期加业务编码作为组合Key,这样保证第二天生成的序列号又是从1开始。

由于我们业务量不是很大,这里在生成序列号之前先判断一下当前key是否存在,若不存在,设置此key过期时间为当天晚上23:59:59,避免生成很多过期的key。

整体设计流程思路如下:

关键代码如下:

@Service
public class SerialNumberServiceImpl implements ISerialNumberService {
    @Autowired
    private JedisCluster jedisCluster;
    /**
     * 定义流水号工单默认前缀
     */
    private static final String SERIAL_NUMBER = "itsm:serial:";

    @Override
    public String generate(String bizCode) {

        if(StringUtils.isEmpty(bizCode)){
            throw new ServiceException("流水号业务类型不能为空");
        }

        //获取当前时间,返回格式如yyyyMMdd
        String date = TimeUtil.date2Str(new Date(), ItsmConstants.FORMATTER_YYYYMMDD_DAY);

        //构造redis过期时间 UnixMillis
        //设置过期时间为当前时间的最后一秒
        long expire = TimeUtil.time2UnixMillis(date + " 23:59:59",ItsmConstants.FORMATTER_YYYYMMDD_TIME);

        //构造redis的key
        String key = SERIAL_NUMBER + date +":"+ bizCode;

        //判断key是否存在
        Boolean exists = jedisCluster.exists(key);

        Long incr = jedisCluster.incr(key);

        //设置过期时间
        if(!exists){
            jedisCluster.pexpireAt(key,expire);
        }

        //默认编码需要5位,位数不够前面补0
        String formattNum = String.format("%05d", incr);
        StringBuilder sb = new StringBuilder(20);
        //转换成业务需要的格式  bizCode + date + incr
        sb.append(bizCode).append("-").append(date).append("-").append(formattNum);

        return sb.toString();
    }
}

  

																

最新文章

  1. ipad和iphone的适配
  2. AppBox升级进行时 - 关联表查询与更新(Entity Framework)
  3. 给表追加主键-----报错ORA-02437: 无法验证 (DENGCHAO.TEST) - 违反主键
  4. YTU 3007: 顺序串的基本运算
  5. 《转》---使用递归方法DataTable 绑定 TreeView
  6. js和css分别实现透明度的动画实现
  7. 通过编写一个简单的漏洞扫描程序学习Python基本语句
  8. 广播接收者 BroadcastReceiver 示例-2
  9. Linux系统的组成和内核的组成
  10. ST 单元测试之maven安装
  11. 如何在java中用Arraylist中实现冒泡排序的问题
  12. 学习python的*args和 **kwargs
  13. free 命令详解
  14. spring batch (一) 常见的基本的概念介绍
  15. django系列 1 :python+django环境搭建 +mac提示找不到manage.py命令
  16. spring cloud zuul参数调优
  17. dotnet Core 异步任务
  18. JavaScript 中 如何判断一个元素是否在一个数组中
  19. QQ消息无限发送!源代码
  20. faster rcnn测试VOC2012的问题

热门文章

  1. 4,Flask 中的 request
  2. P2183 巧克力(二分答案)
  3. MySQL之查询性能优化(四)
  4. Flash文件在asp页面无法播放,网页上面的Flash文件在火狐浏览器不播放
  5. CSS系列(6) CSS通配符详解
  6. 关于mysqldump备份非事务表的注意事项
  7. 孤荷凌寒自学python第二十三天python类的封装
  8. 主流 NoSQL 数据库对比
  9. Redis 与 Spring 集成
  10. hdu 1846 Brave Game (博弈)