论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
简历_利用优化的Redis自增ID策略天生分布式环境下全局唯 ...
简历_利用优化的Redis自增ID策略天生分布式环境下全局唯一ID,用于用户上传 ...
金歌
金牌会员
|
昨天 23:36
|
显示全部楼层
|
阅读模式
楼主
主题
859
|
帖子
859
|
积分
2577
系列博客目次
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
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
金歌
金牌会员
这个人很懒什么都没写!
楼主热帖
白鲸开源 DataOps 平台加速数据分析和 ...
iOS 集成WebRTC相关知识点总结 ...
缓存穿透,缓存雪崩,缓存击穿 ...
【docker专栏6】详解docker容器状态转 ...
SQL Server 2014完全卸载与SQL Server ...
查漏补缺——路由显示的是http://local ...
【ALM工具软件】上海道宁与Perforce为 ...
如何成功实施一个数据治理项目?实施步 ...
Flutter/Dart第09天:Dart高级特殊Patt ...
一个工作薄中快速新建多个数据表 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表