当前位置: 代码网 > it编程>数据库>Redis > Redis 生成分布式业务单号的实现

Redis 生成分布式业务单号的实现

2024年05月15日 Redis 我要评论
背景:微服务架构,有三个微服务,分别是签收、对账、开票,需要生成唯一的分布式单号格式:标识 + 年月日 + 生成顺序(三位)例子:qs20230301001,即2023年三月一日第一张签收单dz202

背景:微服务架构,有三个微服务,分别是签收、对账、开票,需要生成唯一的分布式单号

格式:标识 + 年月日 + 生成顺序(三位)

例子:

  • qs20230301001,即2023年三月一日第一张签收单
  • dz20230212002,即2023年二月十二日第二张对账单

原理:利用 redis 的原子性,保证三位生成顺序的唯一性

新建业务id枚举类 idenum

public enum idenum {

    sign("qs"),
    verify("dz"),
    invoice("kp"),
    receipt("sk"),
    ;

    /**
     * 单号前缀
     */
    private string prefix;

    idenum(string prefix) {
        this.prefix = prefix;
    }

    public string getprefix() {
        return prefix;
    }
}

新建 idutil

  • getcachekey:获取 redis 的 key
  • getday:获取 服务标识 + 格式化的日期
  • completionserial:从redis获取生成顺序后,格式化为固定三位
public class idutil {

    static final string  prefix = "id_cash_";

    public static string getcachekey(string serialprefix) {
        return prefix.concat(serialprefix);
    }

    public static string getday(idenum idenum) {
        datetimeformatter formatter = datetimeformatter.ofpattern("yyyymmdd");
        stringbuffer sb = new stringbuffer();
        sb.append(idenum.getprefix());
        sb.append(formatter.format(localdatetime.now()));
        return sb.tostring();
    }

    public static string completionserial(long serial) {
        format formatcount = new decimalformat("000");
        string serialformat = formatcount.format(serial);
        return  serialformat;
    }
}

新建 idservice 获取分布式单号

  • daywithprefix :获取 服务标识 + 格式化的日期
  • rediscachekey:redis key
  • serial:利用 redis increment 获取原子自增数
@service
public class idservice {

    @resource
    private redistemplate redistemplate;

    public string generatenumber(idenum idenum) {
        string daywithprefix = idutil.getday(idenum);
        string rediscachekey = idutil.getcachekey(daywithprefix);
        long serial = redistemplate.opsforvalue().increment(rediscachekey);
        redistemplate.expire(rediscachekey, 2, timeunit.days);

        string num =  daywithprefix + idutil.completionserial(serial);
        return num;
    }
}

最后使用

string number = idservice.generatenumber(idenum.invoice);

到此这篇关于redis 生成分布式业务单号的实现的文章就介绍到这了,更多相关redis 生成分布式业务单号内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com