大型旅游网站,白山市城乡建设局网站,上海高端网站建设服,微信网站开发系列博客目录 文章目录 系列博客目录WhyRedis自增ID策略 Why
我们需要设置全局唯一ID。原因#xff1a;当用户抢购时#xff0c;就会生成订单并保存到tb_voucher_order这张表中#xff0c;而订单表如果使用数据库自增ID就存在一些问题。 问题#xff1a;id的规律性太明显、…系列博客目录 文章目录 系列博客目录WhyRedis自增ID策略 Why
我们需要设置全局唯一ID。原因当用户抢购时就会生成订单并保存到tb_voucher_order这张表中而订单表如果使用数据库自增ID就存在一些问题。 问题id的规律性太明显、受单表数据量的限制。所以在自己的项目中针对上传的数据的ID的生成也可以使用全局唯一ID。表中有ID属性类型(文本、音频、图像以及存储位置文件名文件名由ID原始文件名作为后缀组成。 多种ID比如用户ID订单ID。
全局ID生成器是一种在分布式系统下用来生成全局唯一ID的工具一般要满足下列特性高可用、唯一性、高性能、递增性、安全性。
Redis自增ID策略
为了增加ID的安全性我们可以不直接使用Redis自增的数值而是拼接一些其它信息
ID的组成部分
符号位1bit永远为0时间戳31bit以秒为单位可以使用69年序列号32bit秒内的计数器支持每秒产生2^32个不同ID
package com.hmdp.utils;import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;Component
public class RedisIdWorker {/*** 开始时间戳*/private static final long BEGIN_TIMESTAMP 1640995200L;/*** 序列号的位数*/private static final int COUNT_BITS 32;private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}public long nextId(String keyPrefix) {// 1.生成时间戳LocalDateTime now LocalDateTime.now();long nowSecond now.toEpochSecond(ZoneOffset.UTC);long timestamp nowSecond - BEGIN_TIMESTAMP;// 2.生成序列号// 2.1.获取当前日期精确到天String date now.format(DateTimeFormatter.ofPattern(yyyy:MM:dd));// 2.2.自增长long count stringRedisTemplate.opsForValue().increment(icr: keyPrefix : date);// 3.拼接并返回return timestamp COUNT_BITS | count;}
}使用的示例代码如下
// 7.创建订单
VoucherOrder voucherOrder new VoucherOrder();
// 7.1.订单id
long orderId redisIdWorker.nextId(order);
voucherOrder.setId(orderId);
// 7.2.用户id
voucherOrder.setUserId(userId);
// 7.3.代金券id
voucherOrder.setVoucherId(voucherId);
save(voucherOrder);// 7.返回订单id
return Result.ok(orderId);每天一个key方便统计订单量 ID 的构造是 时间戳 计数器