订单号生成策略(UUID 数据库自增 Snowflake Redis MongoDB objectId Zookeeper Znode)
1、UUID 大家都知道,不说了。
2、数据库自增ID
关系型数据库都实现数据库自增; MYSQL通过AUTO_INCREMENT实现、Oracle通过Sequence序列实现的。
在数据库集群环境下,不同数据库节点可设置不同的起步值、相同步长实现集群下生成全局唯一、递增ID。

 SET GLOBAL auto_increment_increment=3;
 SET GLOBAL auto_increment_offset=1;

3、Snowflake算法 雪花算法
组成 :41位时间戳 +10位机器ID+12位序列号(自增),转换为长度为18位的长整型。
Twitter为了满足每秒上万消息的创建,每条消息都必须分配全局唯一的ID,这些ID需要趋势递增,方便客户端排序。
4、Redis 自增ID
Redis 实现了ince(key)API 将用于key的值递增1,并返回结果。
如果key不存在,则创建并赋值为0 ,然后再执行incr操作。
分析


类型 优点 缺点 格式
UUID 实现简单 不占用宽带 无序 不可读 查询慢 32位
DB自增 无代码 递增 DB单点故障 扩展性瓶颈
Snowflake 不占用宽带 低位趋势递增 依赖服务器时间 18位
Redis 无单点故障 性能优于DB 递增 占用宽带 Redis集群维护困难 32位


订单超时自动取消方案
1、数据库轮询
小型项目常用方式,通过一个线程去扫描数据库或者数据库定时任务,通过订单时间,判断超时的订单,进行更新状态或者其他操作。
2、JDK延迟队列
DelayQueue 是一个无界阻塞队列,只有在延迟期满时才从中获取元素,放入DelayQueue中的对象需要实现Delayed接口。
ProducerDelay生产者生成一个任务 DelayQueue通过poll()或者take()方法获取超时时间任务。然后到达消费者consumerDelay
3、Redis
redis是一个开源的、高性能、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同的场景,通过提供多种键值数据适应不同场景来适应缓存与存储的需求,value的类型可以提供String Map List Sets sortedSets类型。
redis有序集合 将订单超时的时间戳与订单号分别设置为score与member 系统扫描第一个元素是否超时。
4、用RabbitMQ ActiveMQ JMS进行判断订单是否超时,队列中可以设置判断类型 从进入队列开始 如果条件符合,直接持久化,如果超过时间将消息删除。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐