分布式系统订单号唯一策略

1、分布式集群架构

2、分布式高并发环境的订单号要求

  • 全局唯一
  • 订单号信息安全要求
  • 趋势递增要求

3、订单号生成策略总结

策略 优点 缺点 格式
uuid 实现简单不占用带宽 无序、不可读、查询慢 32位
db自增 无代码、递归 DB单点故障、扩展有瓶颈
snowflake 不占用带宽、低位趋势递增 依赖服务器时间 18位
redis 无单点故障、性能优于DB递增 占用带宽、Redis集群需要维护 12位

3.1、策略一:UUID(通用唯一识别码)

组成:当前日期+时间+时钟序列+机器识别号(MAC地址或其他)
分布式系统中,所有元素(web服务器)都不需要通过中央控制端来判断数据唯一性。

3.2、策略二:数据库自增ID

关系型数据库都实现数据库自增ID;mysql通过auto_increment实现、oralce通过sequence实现。
在数据库集群环境下,不同数据库节点可设置不同起步值、相同步长值来实现集群下生成全局唯一、递增ID。

3.3、策略三:snowflake算法

组成:41位时间戳+10为机器ID+12位序列号(自增),转换位长度为18的长整型。
twitter位满足每秒上万条消息的创建,每条消息都必须分配全局唯一id,这些id要趋势递增,方便客户排序。
Github上可以下载到snowflake源码

3.4、策略四:Redis自增ID

Redis实现了incr(key)API用于将key的值递增1并返回结果。若key不存在,

4、四种ID自增的格式示例

  • uudi:205f1537-7991-4ed3-a2c7-c05aa8f8428b
  • 数据库自增:自增ID
  • snowflake:386992679587676176
  • redis:173372100001

原文地址:https://www.cnblogs.com/luao/p/10472867.html

时间: 2024-11-07 04:01:51

分布式系统订单号唯一策略的相关文章

订单号唯一的一种解决方案

目前,比较火的nosql数据库,如MongoDB,Redis,Riak都提供了类似incr原子行操作. 下面是PHP版的一种实现方式: 1 <?php 2 /** 3 * 基于Redis的全局订单号id 4 * 5 * @author liujingyu 6 * @copyright liujingyu, 11 八月, 2014 7 **/ 8 9 class OrdersnumAction { 10 11 private $_r; 12 private $_host; 13 private $

mysql使用触发器生成唯一订单号,

需求:订单号唯一,并且期望是时间格式加其他字符串, 实现:采用触发机制,在新增时根据新增id值加1作为订单生成的随机且确定唯一的数,因为id唯一: 遇到问题:新增时不能提前知道id值, 解决:取到当前表中最大值+1即为id: 业务需要研究几个小时终于实现一套可行方案: 代码: 建表 DROP TABLE IF EXISTS `qs_test`; CREATE TABLE `qs_test` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `ord

php生成唯一订单号

支持更改长度/** * 生成唯一订单号 * */ function build_order_no(){ return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); }

两个PHP方面的东西,超过2038的时间和唯一订单号算法

2014年10月01日  php开发 1条评论 阅读264次 DateTime::format 被设计成不受外部设置影响(面向对象就应该如此)所以无论你如何改变环境参数 date_default_timezone ,都不会影响输出结果要想改变 DateTime::format 的时区设置,需要向 DateTime::setTimezone 传入一个时区对象 DateTimeZone 1 $d = new DateTime('@2444486400'); 2 $d->setTimezone(new

如何生成唯一订单号(转)

首先,订单号有3个性质:1.唯一性 2.不可推测性 3.效率性 唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.我在java下定制的订单号生成方式如下:int r1=(int)(Math.random()*(10));//产生2个0-9的随机数int r2=(int)(Math.random()*(10));long now = System.currentTimeMillis();//一个13位的时间戳String paymen

c#唯一订单号生成代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string uniqueNum = GenerateOrderNumber(); Console.WriteLin

c# asp.net 生成唯一订单号

c# asp.net 生成唯一订单号 string OrderNo = DateTime.Now.Year.ToString().Substring(2, 2) + DateTime.Now.Month.ToString().PadLeft(2, '0') + DateTime.Now.Day.ToString().PadLeft(2, '0') + DateTime.Now.Hour.ToString().PadLeft(2, '0') + DateTime.Now.Minute.ToStri

PHP生成唯一的订单号

记:之前面试的时候被面试官问过简历项目中的订单号我是什么规则生成的,我牛逼吹过头了,乱说了一通,靠!今天在公司的项目中订单号生成,好奇,看了下,就是网上的这种而已. 1 * 2 * uniqid - 官方是这样说的: 3 * Gets a prefixed unique identifier based on the current time in microseconds. 4 */ 5 function build_order_no() 6 { 7 return date('Ymd').su

C# 生成唯一订单号

根据GUID+DateTime.Now.Ticks生产唯一订单号 1 /// <summary> 2 /// 生成唯一数 3 /// </summary> 4 public class UniqueData 5 { 6 private static object obj = new object(); 7 private static int GuidInt { get { return Guid.NewGuid().GetHashCode(); } } 8 private sta