文档章节

使用hilo高低位算法-生成编号

6pker
 6pker
发布于 2016/02/01 14:29
字数 490
阅读 793
收藏 6
点赞 1
评论 0

通常订单编号、产品编号、付款编号等编号,都是由数字构成,有得会加一些前缀后缀,例如淘宝订单号。

下面说一下几点不合理的编号设计。

  1. 使用数字型的自增长、序列。这用来表示唯一性没问题,但是当我们遇到像订单编号这种,需要一定长度不太合适。

  2. 编号需要一定长度,可能你会想到uuid。uuid生成的包含字符,无序、无意义而且也比较长,不符合我们的写记习惯,所以uuid做编号也是不合理的。

  3. 使用时间戳来当编号,在并发的情况下精确到毫秒也有可能发生唯一性问题

  4. 使用随机数加前后缀当编号,很多语言的随机数都是伪随机,例如用java每次都new Random(),并发的情况下有可能取出一样的数字,就算不并发,谁能保证不会随机到之前生成过的数字?


合理的做法是用表来管理数字主键,每次取出来拼接前缀或后缀来当编号,然后+1,就像oracle的序列一样,因为有些数据库没有序列,所以通常为了统一使用表来管理。

private class HiloOptimizer {

        private String prefix;
        private int maxLo;
        private int lo;            
        private long hi;        
        private long lastValue;

        public HiloOptimizer(String prefix, int maxLo) {
            this.prefix = prefix != null ? prefix.replace("{", "${") : "";
            this.maxLo = maxLo;            //最大低位
            this.lo = maxLo + 1;           //最低初始位
        }

        public synchronized String generate() {
            if (lo > maxLo) {                    //当低位超过最大高位
                lastValue = getLastValue();  //表示hi位的进位次数,从数据库id管理表获取
                lo = lastValue == 0 ? 1 : 0;     //低位归0
                hi = lastValue * (maxLo + 1);    //高位进位
            }
            return String.valueOf(hi + lo++);    //低位最后自增lo++
        }
    }

若maxLo设置为99,按照hi的每次进位划分,产生的id形式是:

0~99,100~199,200~299,300~399……依此类推,每个阶段99+1个


© 著作权归作者所有

共有 人打赏支持
6pker
粉丝 51
博文 98
码字总数 59361
作品 0
浦东
程序员
hilo高低位算法的优点和用途(非Hibernate主键策略)

开门见山地说,hilo高低位算法的用途,或者说目前为止我所见过的用途,就是——编号生成! 通常订单编号、产品编号、物流编号、工人编号、批次编号等等各种各样的编号,都是由数字构成,有得...

Awisper ⋅ 2015/12/17 ⋅ 0

Hibernate的generator属性的意义

本文讲述Hibernate的generator属性的意义。Generator属性有7种class,本文简略描述了这7种class的意义和用法。 Hibernate的Generator属性有7种class,本文简略描述了这7种class的意义和用法。...

黄梦巍 ⋅ 2013/06/26 ⋅ 0

Hibernate的generator属性之意义【转】

Hibernate的generator属性之意义 本文讲述Hibernate的generator属性的意义。Generator属性有7种class,本文简略描述了这7种class的意义和用法。 Hibernate的Generator属性有7种class,本文简...

houyiwujing ⋅ 2012/02/28 ⋅ 0

常用Hibernate 主键生成策略

ORM映射基本原理 1. 基于相同实体类和表,实现相互映射,类的对象对应了表中的记录,不同对象对应不同的记录,不同的记录对应不同的对象 2. 表中不同的记录通过主键来区分,不同的对象通过对...

徐文瑞 ⋅ 2013/03/09 ⋅ 1

4.01-Hibernate中主键生成的策略

1)identity:主键自增,由数据库来生成主键, 在我们创建实体时,不需要手动添加主键,而是由数据库自动生成主键 2)increment:主键自增,有hibernate来维护(生成),先通过查询数据库中主...

静以修身2025 ⋅ 2017/11/14 ⋅ 0

hibernate的id生成

1、identity:用于MySql数据库。特点:递增 < id name="id" column="id"> < generator class="identity"/> < /id> 注:对于MySql数据库使用递增序列时需要在建表时对主键指定为autoincrement......

冰-冰 ⋅ 2015/10/29 ⋅ 0

Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

1、assigned 主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法...

52PiggySky ⋅ 2013/11/24 ⋅ 0

Hibernate详细教程

一、搭建Hibernate环境 1.在src目录下创建hibernate.cfg.xml配置文件 PS:文件的名字不能改! 2. 编写实体类,以Person类为例 package test.Hibernate.model;...

唐僧他大叔 ⋅ 2017/01/15 ⋅ 0

Field 'id' doesn't have a default value

Field 'id' doesn't have a default value 意思是“id”没有一个默认值 原因 因为主键生成策略为: native代表什么呢? 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个; i...

lwang_IT ⋅ 01/15 ⋅ 0

hibernate mapping 主键配置方式

主键(id) Hibernate的主键生成策略有如下几种: 1) assigned 主键由外部程序负责生成,在 save() 之前指定。 2) hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位...

rj1989y ⋅ 2014/07/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 31分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 51分钟前 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部