当前位置: 首页 > news >正文

对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid

在工作过程中接触了很多id生成策略,但是有一些问题

雪花id

强依赖时钟,对于时钟回拨无法很好解决

tinyid

滴滴开源,依赖mysql数据库,自增,无业务属性

uuid

生成是一个字符串没有顺序,数据库索引组织数据是按顺序处理,如果用于主键存储,对于数据库来说会造成频繁的索引页合并,增加数据库的负担,不建议。

还有其他的id生成策略,对于一些简单的应用可以

分布式id特点

个人考虑,分布式id需要具有的特点如下

业务编号

通过此信息可以确定此编号是用于干什么的

数据中心编号

对于大型的互联网项目,会有分区域部署的情况,分流、负载均衡

当前时间

当前时间精确到秒

ip地址

对于集群使用,用于记录当前请求服务节点的ip,好知道是哪个节点发起的请求,需要将Ip转int进行处理

当前序号

从1开始,可以做成自增

拿经常使用的myql来说,索引中数据排序是按照主键来的,所以全部用数字来表示,考虑到上面的特点排序以及长度如下

业务标识(7位)+当前时间(年月日时分秒,yyyyMMddHHmmss,14位)+数据中心编号(5位)+ip地址(10位)+序号(19位)

当前id为55位,这样的id可读性强,看到这个id就知道哪个业务什么时候的数据,长度需要实际情况进行调整

业务标识,7位,最多代表9999999种业务,对于互联网公司一般来说足够了

当前时间,14位,精确到秒

数据中心,5位,一般足够

ip地址,对于地址进行int转换,10位

序号,19位,对应long类型的有符号最大值,与当前时间进行组合,一秒内生成19位id足够了

对于分页查询来讲,查询的时候需要确保此id属于哪个业务,先按条件进行匹配最大的数据id,然后根据此id进行范围匹配,这样可以最大限度使用索引,防止过多数据加载到内存中通过偏移量只选其中一部分数据。

对于时钟回拨问题

当前时间和序号使用redis进行分别存储,对于redis做sentinel三节点高可用

发号器机器当期时间<redis的时间

即redis时间在后,发号器时间在前,发号器当前时间滞后,如下

发号器当前时间
20230727121211
redis当前存储时间
20230727121212

这种情况有可能是时钟回拨。

为了不影响现有的数据,造成id重复导入插入数据库异常的情况,在现有的序号基础上进行自增。

发号器机器当期时间>=redis时间或者当前机器时间发生变化

如下

发号器当前时间
20230727121212
redis当前存储时间
20230727121211

按照发号器的时间处理,序号重置从0开始自增,需要事务锁定当前时间和序号,防止后面的请求造成争用。

对于redis的特性,单线程多个请求过来需要入队列、高并发、lua脚本操作的原子性,可以考虑每次请求调用lua脚本进行序号自增或者当前时间修改。

从redis 6 开始支持多线程,对于redis并发特性,做了一下测试

redis 5 单线程

redis-benchmark -t set,get -n 100000 -r 100000  -d 512 -c 500 -q
SET: 83472.46 requests per second
GET: 80971.66 requests per second

redis 6 两个线程

redis-benchmark -t set,get -n 100000 -r 100000 --threads 2 -d 512 -c 500 -q
SET: 107642.62 requests per second
GET: 110253.59 requests per second

可知,在多线程下多了不到一倍吞吐。

上面这些可以做成一个web服务,在 k8s 中做成一个负载均衡服务,请求时传入当前节点所在的数据中心id。

相关文章:

对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid

在工作过程中接触了很多id生成策略&#xff0c;但是有一些问题 雪花id 强依赖时钟&#xff0c;对于时钟回拨无法很好解决 tinyid 滴滴开源&#xff0c;依赖mysql数据库&#xff0c;自增&#xff0c;无业务属性 uuid 生成是一个字符串没有顺序&#xff0c;数据库索引组织数据…...

jmeter中json提取器,获取多个值,并通过beanshell组成数组

jmeter中json提取器介绍 特别说明&#xff1a;**Compute concatenation var(suffix_ALL)&#x1f617;*如果找到许多结果&#xff0c;则插件将使用’ &#xff0c; 分隔符将它们连接起来&#xff0c;并将其存储在名为 _ALL的var中 json提取器调试 在查看结果树中选择JSON Pat…...

通过nvm工具快捷切换node.js版本、以及nvm的安装

使用nvm可以实现多个Node.js版本之间切换 步骤目录&#xff1a; 先卸载掉本系统中原有的node版本 去github上下载nvm安装包 安装node 常用的一些nvm命令 1、先卸载掉本系统中原有的node版本 2、去github上下载nvm安装包 https://github.com/coreybutler/nvm-windows/re…...

企业如何搭建矩阵内容,才能真正实现目的?

当下&#xff0c;新媒体矩阵营销已成为众多企业的营销选择之一&#xff0c;各企业可以通过新媒体矩阵实现扩大品牌声量、维持用户关系、提高销售业绩等不同的目的。 而不同目的的矩阵&#xff0c;它的内容运营模式会稍有差别&#xff0c;评价体系也会大不相同。 企业在运营某类…...

Arduino驱动MQ5模拟煤气气体传感器(气体传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 MQ5气体传感器,可以很灵敏的检测到空气中的液化气、天然气、煤气等气体,与Arduino结合使用,可以制作火灾液化气、天然气、煤气泄露报警等相关的作品。 1、传感器特性 MQ5用于消费和工业行业中气体泄漏检测设备,该传感器适…...

Mongodb安装(Centos7)

1. 下载 MongoDB: The Developer Data Platform | MongoDB 2. 安装 上传至服务器 解压 tar -zxvf mongodb-linux-x86_64-rhel70-5.0.19.tgz 移动 mv mongodb-linux-x86_64-rhel70-5.0.19 /usr/local/mongodb 3. 配置 vim /etc/profile # set mongodb configuration expor…...

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…...

凯迪正大—SF6泄漏报警装置的主要特点

SF6泄漏报警系统主要特点 ① 系统采用声速原理&#xff0c;可定量、实时在线测量SF6泄漏气体含量&#xff0c;克服了传统测量方法如负电晕放电法和卤素传感器法只能定性判别是否越限的缺陷&#xff0c;能够准确得到气体中SF6含量。 ② 系统采用双差分处理方法&#xff0c;有效…...

适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性

适配器模式与装饰器模式对比分析&#xff1a;优雅解决软件设计中的复杂性 在软件设计中&#xff0c;我们常常面临着需要将不同接口或类协调工作的情况&#xff0c;同时还要满足灵活性和可扩展性的需求。为了应对这些挑战&#xff0c;适配器模式和装饰器模式应运而生&#xff0c…...

idea使用protobuf

本文参考&#xff1a;https://blog.csdn.net/m0_37695902/article/details/129438549 再次感谢分享 什么是 protobuf &#xff1f; Protocal Buffers(简称protobuf)是谷歌的一项技术&#xff0c;用于结构化的数据序列化、反序列化。 由于protobuf是跨语言的&#xff0c;所以用…...

【深度学习_TensorFlow】误差函数

写在前面 搭建完网络层后&#xff0c;在每层网络中都要进行前向计算&#xff0c;下一步就是选择合适的误差函数来计算误差。其中均方差函数和交叉熵函数在深度学习中比较常见&#xff0c;均方差函数主要用于回归问题&#xff0c;交叉熵函数主要用于分类问题。 写在中间 均方差…...

mysql按照日期分组统计数据

目录 前言按天统计按周统计按月统计按年统计date_format参数 前言 mysql的date_format函数想必大家都使用过吧&#xff0c;一般用于日期时间转化 # 例如 select DATE_FORMAT(2023-01-01 08:30:50,%Y-%m-%d %H:%i:%s) # 可以得出 2023-01-01 08:30:50# 或者是 select DATE_FOR…...

19 | 分类模型评估指标

文章目录 Python分类模型评估指标准确率(Accuracy)精确率(Precision)召回率(Recall)F1值(F1 Score)混淆矩阵(Confusion Matrix)ROC曲线和AUC值1. 准备数据集2. 初始化并训练逻辑回归模型3. 获取预测概率并计算ROC曲线和AUC值4. 绘制ROC曲线5. 整合代码结论Python分类…...

【Pycharm2022.2.1】python编辑器最新版安装教程(包含2017-2022的所有版本win/mac/linux)

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 永久安装 Pycharm&#xff08;2017-2022的win/mac/linux所有版本&#xff09;/ IntelliJ IDEA也可以, 按照本文教程所写的&#xff0c;具体步骤跟着下面的图文教程一步一步来就行&#xff0c;一分钟即可搞定&#xff0c;过…...

深度学习-相关概念

Adam优化器 Adam&#xff0c;Adaptive Moment Estimation&#xff0c;自适应矩估计。是2014年提出的一种万金油式的优化器&#xff0c;使用起来非常方便&#xff0c;梯度下降速度快&#xff0c;但是容易在最优值附近震荡。竞赛中性能会略逊于SGD&#xff0c;毕竟最简单的才是最…...

眼科医生推荐的台灯 护眼台灯买什么好?

我家孩子需要一个护眼灯&#xff0c;就请教了我的一个医生朋友。大家都知道医生白天对着电脑长时间的工作&#xff0c;晚上还要看书&#xff0c;查文献&#xff0c;写论文&#xff0c;选一个对眼睛友好的高质量护眼台灯对他们是刚需&#xff0c;同时又是医生&#xff0c;所以他…...

如何使用 ChatGPT 为 Midjourney 或 DALL-E 等 AI 图片生成提示词

人工智能为创意产业开辟了一个充满可能性的全新世界。人工智能最令人兴奋的应用之一是生成独特且原创的艺术品。Midjourney 和 DALL-E 是人工智能生成艺术的两个突出例子&#xff0c;吸引了艺术家和艺术爱好者的注意。在本文中&#xff0c;我们将探索如何使用 ChatGPT 生成 AI …...

【Linux后端服务器开发】Reactor模式实现网络计算器

目录 一、Reactor模式概述 二、日志模块&#xff1a;Log.hpp 三、TCP连接模块&#xff1a;Sock.hpp 四、非阻塞通信模块&#xff1a;Util.hpp 五、多路复用I/O模块&#xff1a;Epoller.hpp 六、协议定制模块&#xff1a;Protocol.hpp 七、服务器模块&#xff1a;Server.…...

【WebRTC---源码篇】(二:一)PeerConnection详解

Track的添加 上图是整体流程图 RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::AddTrack(rtc::scoped_refptr<MediaStreamTrackInterface> track,const std::vector<std::string>& stream_ids) {RTC_DCHECK_RUN_ON(signal…...

使用tinyxml解析和修改XML文件

首先要清楚XML文件包含哪些元素&#xff1a; 他是由元素、文本或者两者混合物组成。元素可以拥有属性&#xff0c;元素是指从开始标签到结束标签的部分。 <?xml version"1.0" encoding"UTF-8" ?> <books><book id"1001">&…...

新手必看:麦橘超然Flux离线图像生成控制台完整使用教程

新手必看&#xff1a;麦橘超然Flux离线图像生成控制台完整使用教程 1. 为什么选择麦橘超然Flux控制台 如果你正在寻找一个简单易用、性能优异的本地AI图像生成工具&#xff0c;麦橘超然Flux控制台可能是你的理想选择。这个基于DiffSynth-Studio构建的解决方案&#xff0c;集成…...

Local Moondream2实操手册:上传图片即获详细描述的全流程

Local Moondream2实操手册&#xff1a;上传图片即获详细描述的全流程 想让你的电脑学会“看图说话”吗&#xff1f;今天我们来聊聊一个特别有意思的工具——Local Moondream2。简单来说&#xff0c;它就像给你的电脑装上了一双智能的眼睛和一个能说会道的嘴巴。你给它一张图片…...

避坑指南:YooAsset整合HybridCLR时,如何正确处理AOT与热更DLL的打包与加载?

YooAsset与HybridCLR深度整合&#xff1a;AOT与热更DLL的打包加载全解析 当Unity开发者尝试将YooAsset的资源热更新能力与HybridCLR的代码热更新功能结合时&#xff0c;往往会遇到各种"陷阱"。其中最典型的莫过于&#xff1a;明明按照文档将DLL转为.bytes文件&#x…...

该系统通过AI技术对30%重复率的论文进行智能修正,结合深度学习提升语言表达的独特性

嘿&#xff0c;大家好&#xff01;我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题&#xff1a;论文重复率飙到30%以上怎么办&#xff1f;别慌&#xff0c;我这就分享5个实用降重技巧&#xff0c;帮你一次搞定&#xff0c;轻松压到合格线以下。这些方法都是我亲身试验过的&a…...

实战案例:用Qwen3-TTS-Tokenizer-12Hz为短视频生成专属配音

实战案例&#xff1a;用Qwen3-TTS-Tokenizer-12Hz为短视频生成专属配音 短视频创作者们&#xff0c;你是否厌倦了千篇一律的机械配音&#xff1f;想要一个既能快速生成&#xff0c;又充满个人特色的声音解决方案&#xff1f;Qwen3-TTS-Tokenizer-12Hz可能就是你在寻找的答案。…...

从Claude Code源码泄露看AI编码助手设计:12个可收藏的实用模式解析

Claude Code源码泄露揭示了生产级AI编码助手的内部实现。文章重点分析了其背后的12个可复用设计模式&#xff0c;涵盖记忆与上下文、工作流与编排、工具与权限、自动化四大类。这些模式如持久化指令文件、分层记忆、探索-规划-行动循环、上下文隔离子智能体等&#xff0c;为构建…...

使用 Python 设置 Excel 表格的行高与列宽

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

【紧急预警】传统音视频微服务架构将在2026Q3大规模失效——SITS2026原生处理标准已强制嵌入工信部信创目录

第一章&#xff1a;SITS2026分享&#xff1a;AI原生音视频处理 2026奇点智能技术大会(https://ml-summit.org) AI原生音视频处理正从“AI辅助”迈向“AI驱动”的范式跃迁——模型不再仅作为后处理模块嵌入传统管线&#xff0c;而是从采集、编码、传输到渲染的全链路深度重构。…...

奶奶都能看懂的 C# —— 手把手 LINQ懈

一、 什么是 AI Skills&#xff1a;从工具级到框架级的演化 AI Skills&#xff08;AI 技能&#xff09; 的概念最早在 Claude Code 等前沿 Agent 实践中被强化。最初&#xff0c;Skills 被视为“工具级”的增强&#xff0c;如简单的文件读写或终端操作&#xff0c;方便用户快速…...

OpenCASCADE与CMake实战:从零搭建Visual Studio 2019开发环境

1. 环境准备&#xff1a;搭建OpenCASCADE开发环境的基础条件 在开始配置OpenCASCADE项目之前&#xff0c;我们需要确保开发环境已经具备所有必要的工具和依赖项。这就像盖房子前需要准备好砖块、水泥和图纸一样&#xff0c;缺少任何关键组件都会导致后续工作无法顺利进行。 首先…...