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

Redis:实现全局唯一ID

Redis:实现全局唯一ID

  • 一. 概述
  • 二. 实现
    • (1)获取初始时间戳
    • (2)生成全局ID
  • 三. 测试
    • 为什么可以实现全局唯一?
    • 其他唯一ID策略
    • 补充:countDownLatch

一. 概述

全局ID生成器:是一种在【分布式系统下】用来生成全局唯一ID的工具;
全局ID需要满足的特性:
1.唯一性
2.高可用:集群、哨兵机制;
3.高性能
4.递增性:Redis中的String数据类型的有自增特性!
5.安全性:将自增数值进行拼接,不容易猜出来;

ID结构
符号位(1位) + 时间戳(31位) + 序列号(32位);
时间戳为从起始时间到现在的时间差;
理论上支持1秒钟2^32个订单;
在这里插入图片描述

二. 实现

(1)获取初始时间戳

先设定一个初始时间如2022年1月1日,获取初始时间的时间戳
在这里插入图片描述
在这里插入图片描述

(2)生成全局ID

  1. 在utl层中定义一个RedisIdWorker类的bean;
  2. 写一个方法,返回值是long型;不同业务要区别,所以使用前缀区分业务;
  3. 生成 时间戳:即当前时间秒数 - 初始时间秒数;
  4. 生成 序列号:使用stringRedisTemplate中String类型的自增方法increment()/INCR,而key(2^32)迟早会用完存不下,所以不能使用同一个key来自增,

序列号的key:所以使用精确到天的时间作为key,这样一个key就对应一天,不同天数的key不同,这样key的上限就是一天的下单量即2^32个,key够用;这样还方便统计订单量;

  1. 拼接前缀 + 符号位 + 时间戳 + 序列号,先使用位运算,将时间戳左移32位(序列号的位数),最低位都会变成0;
    然后把序列号count拼接上去:使用或运算填充,有1则1,否则为0;
    在这里插入图片描述

三. 测试

  1. 用工厂方法创建线程池,容量500;
  2. 创建一个任务,在任务中生成并 打印ID100次,共给线程池提交300次任务;
    由于线程池会异步执行,使用countDownLatch,300个线程,每个线程会countdown一次,直到计数为0就会唤醒await()所在的当前线程,就会去main中打印所花的时间了;
    在这里插入图片描述

结果:生成共3w个ID;
在这里插入图片描述
查看Redis:
在这里插入图片描述

为什么可以实现全局唯一?

因为生成ID时用的是Redis的 increment / INCR功能,每调用一次都会进行自增;

其他唯一ID策略

Redis产生的ID是数值类型long,占空间小;
UUID:JDK自带,16进制字符串,不是自增的,不满足要求;
雪花snowflake算法:需要维护机器id,对于时钟依赖比较高;
数据库实现,性能不如Redis;

补充:countDownLatch

用来进行线程同步协作,等待所偶有线程完成倒计时;
其中构造参数用来初始化等待计数值,countDown()用来计数-1,await()用来等待技术归零,归零后就会执行当前线程;

相关文章:

Redis:实现全局唯一ID

Redis:实现全局唯一ID一. 概述二. 实现(1)获取初始时间戳(2)生成全局ID三. 测试为什么可以实现全局唯一?其他唯一ID策略补充:countDownLatch一. 概述 全局ID生成器:是一种在【分布式…...

webpack打包基本原理——实现webpack打包核心功能

webpack打包的基本原理 核心功能就是把我们写的模块化代码转换成浏览器能够识别运行的代码,话不多说我们一起来了解它 首先我们建一个空项目用 npm init -y 创建一个初始化的,在跟目录下创建src文件夹,src下创建index.js,add.js…...

git的使用(终端输入指令) 上

git目录前言1.创建仓库2.创建文件和修改数据状态分区![分区](https://img-blog.csdnimg.cn/d124dec6b2b14769ad20b75490f29cae.png)3 .删除、撤销重置 、和比较前言 今天带大家手把手敲一遍 git 流程: 安装一下git(详细观看我之前发的git文档&#xff0…...

react定义css样式,使用less,css模块化

引入外部 css文件 import ./index.css此时引入的样式是全局样式 使用less 安装 npm i style-loader css-loader sass-loader node-sass -D生成config文件夹 npm run eject配置 以上代码运行完,会在根目录生成config文件夹 进入 config > webpack.config.js 查找…...

基于JavaWeb的学生管理系统

文章目录 项目介绍主要功能截图:登录用户信息管理院系信息管理班级信息管理新增学生课程管理成绩管理部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系�…...

win11右键新建菜单添加选项

需要操作 2 处注册表, 以下以在右键新建菜单中添加 .html 为例 在主键 HKEY_CLASSES_ROOT 中,搜索 .html 找到后 ,右键点击它,选 新建 ->项, 在这里插入图片描述 项目名字是:ShellNew 新建后&#x…...

leetcode Day5(卡线复试,放弃版)

Day5 最后一个单词长度(要求最后一个,可以反向计数) int lens.length()-1; while(s.charAt(len)){len--;//最后是一个空格,就是无字符时 } int wordlen0;//记录字符长度 /*charAt() 方法用于返回指定索引处的字符。索引范围为从 0…...

cmake 入门二 库的编译,安装与使用

工程描述 1,建立一个静态库和动态库,提供HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串。 2,安装头文件与共享库。 1 库的工程结构 1.1 工程目录下的CMakeLists.txt PROJECT…...

Python中实现将内容进行base64编码与解码

一、需求说明需要使用Python实现将内容转为base64编码,解码,方便后续的数据操作。二、base64简介Base64是一种二进制到文本的编码方式【是一种基于 64 个可打印字符来表示二进制数据的表示方法(由于 2^664,所以每 6 个比特为一个单…...

集合TreeSet的使用-java

TreeSet的特点:可排序、不重复、无索引。可排序:按照元素的大小默认升序排序;底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。对于数值、字符串类型的(Integer 、Double、String)TreeSet可以排…...

Mybatis-plus 分页集成以及基本使用总结 入门和案例 注解连表查询分页案例等

简介 Mybaits-plus 是mybits 的升级版,从mybaits 升级到mybaits-plus 可以实现平滑升级 Mybaits-plus 本身提供了大量的基本查询方法以及强大的 Wrapper(包装) 类 用于查询的 QueryWrapper 以及 更新的 UpdateWrapper ,使用Wrapper 基本已经可以构建大…...

5个设计师常用素材库

推荐5个设计素材网站,免费下载! 1、菜鸟图库 菜鸟图库-免费设计素材下载 菜鸟图库是一个素材量非常丰富的网站,该网站聚合了平面、UI、淘宝电商、高清背景图、图片、插画等高质量素材。平面设计模板非常多,很多都能免费下载&…...

PHP/7.2.11 缺少 apache2/logs/httpd.pid 文件

启动服务时:systemctl restart httpd.service,报错:● httpd.service - httpd serviceLoaded: loaded (/etc/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since 五 2023-02-24 16:1…...

【centos7下部署mongodb】

一.安装环境 CentOS7MongoDB4.0.13正式版。 二.下载MongoDB 1.1 官网下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.13.tgz 1.2 将压缩包通过xftp上传到服务器/opt目录,然后解压、改名 三. 配置环境变量及配置文件 3.1配置系…...

pycharm首次使用爬虫框架scrapy遇到的问题和解决方法(二)

在首次使用scrapy框架的过程中,一直是对着别人的框架步骤撸代码的。然而,撸着撸着发现好像别人的也用不了。后面就只能自己找踏坑了。 问题报错: 1,IndexError: list index out of range 2,pymysql.err.ProgrammingError: (1064, "You have an error in your SQL s…...

pyflink学习笔记(二):table_apisql

Joins Inner Join 官网说明:和 SQL 的 JOIN 子句类似。关联两张表。两张表必须有不同的字段名,并且必须通过 join 算子或者使用 where 或 filter 算子定义至少一个 join 等式连接谓词。先创建2个表,两个表的字段是相同的,我想验证…...

嵌入式 STM32 实现STemwin移植+修改其配置文件,驱动LCD显示文本 (含源码,建议收藏)

目录 一、STemwin 简介 二、源码下载 1、在移植STemwin源码之前,需要一个已经具备LCD读写,填充指定颜色等函数功能的一个工程; 2、STemwin 3、源码下载 三、STemwin移植 1、解压源码路径 2、STemwin文件介绍 四、修改配置文件&…...

[计算机网络(第八版)]第一章 概述(学习笔记)

1.1 计算机网络在信息时代中的作用 21世纪是以网络为核心的信息时代,21世纪的重要重要特征:数字化、网络化与信息化。 三大类网络 电信网络:向用户提供电话、电报、传真等服务;有线电视网络:向用户传送各种电视节目&am…...

AI绘图:常用镜头和视角

镜头 Establishing Shot 通过宽广或超宽广的视角交待故事发生的大地理环境 Master Shot 众多人物都能完整地出现在镜头里。 Wide Shot 广角镜头。又称“长镜头” Long Shot。人物全身展现,但在画面中所占比例相对较少 Ultrawide Shot 超广角镜头 Low Angle Sho…...

TCP四次挥手

TCP 四次挥手过程是怎样的? TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接,断开连接后主机中的「资源」将被释放,四次挥手的过程如下图: 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1…...

量子Krylov子空间算法与经典阴影技术解析

1. 量子Krylov子空间算法原理与实现量子Krylov子空间算法是当前NISQ(含噪声中等规模量子)时代最具前景的量子-经典混合算法之一。其核心思想是通过构造一组Krylov基矢{|ψₖ⟩} {|ψ₀⟩, H|ψ₀⟩, H|ψ₀⟩,..., H^(d-1)|ψ₀⟩},将高维希…...

职业会崩塌,岗位会消失,聪明的技术人该何去何从?

凌晨两点,写字楼的灯还亮着。我盯着屏幕上第 37 次运行的测试用例,咖啡杯里沉淀着今天的第三份浓缩。突然弹出一条消息:“系统架构升级,你的岗位可能被优化”。那一刻,我忽然意识到:我精心打磨的"职业…...

西安家谱企业服务商

如果你还认为家谱印刷只是老年市场的“老古董”,那你就错得离谱了。2024年,中国家谱印刷市场规模已突破58亿元,年复合增长率达21.3%,远超普通印刷行业。这背后,是新一代家庭对姓氏文化、家族记忆的数字化与实体化需求爆…...

React Props:深入解析组件间的数据传递

React Props:深入解析组件间的数据传递 在React中,组件间的数据传递是构建复杂应用的关键。Props(属性)是React组件间数据传递的主要方式,它允许父组件向子组件传递数据。本文将深入探讨React Props的概念、使用方法以及注意事项。 一、Props的概念 Props是React组件的…...

AI时代工程师的核心价值:从写代码到定义问题

1. 这不是“AI取代程序员”的老调重弹,而是职业坐标的重新校准你最近有没有在刷技术社区时,被两条截然相反的消息撞得有点懵?一条说“编码岗位正站在悬崖边上”,另一条却高呼“这是工程师黄金十年的起点”。这不是媒体制造焦虑的标…...

抖音下载神器:免费批量下载抖音视频、图集、音乐和直播回放完整指南

抖音下载神器:免费批量下载抖音视频、图集、音乐和直播回放完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…...

AI——LangChain 三大核心概念

LangChain 三大核心概念一、LangChain 三大核心概念1. 提示词模板 PromptTemplate2. 模型调用 ChatOpenAI / ChatZhipuAI3. 链 Chain二、完整可运行代码(带角色设定)功能三、如果你想用 **智谱 GLM**四、总结一、LangChain 三大核心概念 1. 提示词模板 …...

Perseus补丁:碧蓝航线全皮肤解锁完整指南与快速配置教程

Perseus补丁:碧蓝航线全皮肤解锁完整指南与快速配置教程 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus 还在为碧蓝航线中那些精美皮肤需要付费而烦恼吗?想要免费体验所有舰娘的不…...

用 Excel 手算一个 1-6-1 MLP:前向传播、损失、反向传播与参数更新

计算示例:本文用一个单输入、6 个隐藏神经元、单输出的多层感知机(MLP)作为例子,展示如何用 Excel 公式完整复现一次训练迭代。配套 Excel 文件中的“MLP计算过程”工作表已经把前向传播、损失计算、反向传播梯度和参数更新全部写…...

API调用总失败?ChatGPT官方Rate Limit机制深度拆解,4类高频报错代码级诊断手册

更多请点击: https://kaifayun.com 第一章:API调用总失败?ChatGPT官方Rate Limit机制深度拆解,4类高频报错代码级诊断手册 ChatGPT API 的速率限制(Rate Limit)并非黑盒策略,而是由 OpenAI 明确…...