论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
简历_利用优化的Redis自增ID策略天生分布式环境下全局唯 ...
简历_利用优化的Redis自增ID策略天生分布式环境下全局唯一ID,用于用户上传 ...
金歌
论坛元老
|
2025-1-18 23:36:45
|
显示全部楼层
|
阅读模式
楼主
主题
1058
|
帖子
1058
|
积分
3174
系列博客目次
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 的构造是 :时间戳 + 计数器
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
金歌
论坛元老
这个人很懒什么都没写!
楼主热帖
iOS 集成WebRTC相关知识点总结 ...
SQL Server 2014完全卸载与SQL Server ...
iOS直播/游戏怎么利用特殊音效制造娱乐 ...
查漏补缺——路由显示的是http://local ...
贩卖和售前,如何与**商一起“玩耍”? ...
【docker专栏6】详解docker容器状态转 ...
.NET ORM框架HiSql实战-第一章-集成HiS ...
一个工作薄中快速新建多个数据表 ...
缓存穿透,缓存雪崩,缓存击穿 ...
京准电钟:NTP网络时间服务器助力精准 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
MES
网络安全
虚拟化与私有云
程序人生
分布式数据库
SQL-Server
快速回复
返回顶部
返回列表