用Redis实现全局唯一ID

全局唯一ID

如果使用数据库自增ID就存在一些问题:

  • id的规律性太明显
  • 受表数据量的限制

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:

  • 唯一性
  • 高可用
  • 递增性
  • 安全性
  • 高性能

为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息:

image-20240102173648497

ID的组成部分:

符号位:1bit,永远为0

时间戳:31bit,以秒为单位,可以使用69年

序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID

Redis实现全局唯一ID

@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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境变量、export命令、env命令、$符号

一、环境变量 我们所使用的一系列命令本质上就是一个个的可执行程序 不管我们当前的工作目录在何处&#xff0c;命令都可以准确执行&#xff0c;这就是环境变量的作用&#xff0c;是借助环境变量中PATH的值来做到的&#xff0c;PATH记录了系统执行任何命令的搜索路径 环境变量…

ansible 配置jspgou商城上线(MySQL版)

准备环境 准备两台纯净的服务器进行&#xff0c;在实验之前我们关闭防火墙和selinux systemctl stop firewalld #关闭防火墙 setenforce 0 #临时关闭selinux hosts解析(两台服务器都要去做) [rootansible-server ~]# vim /etc/hosts 10.31.162.24 ansible-ser…

博客的简介

博客的简介 大家可以把这个当做目录&#xff0c;从中选择自己需要的内容进行阅览&#xff0c;欢迎大家一键三连&#xff01;&#xff01;&#xff01;&#xff01; 话题讨论专栏 点击进入话题讨论专栏 主要文章&#xff1a; 神奇的代码——可随意修改复制页面内容 Python…

力扣(leetcode)第383题赎金信(Python)

383.赎金信 题目链接&#xff1a;383.赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote…

Mabatis中String类型传参常见问题和解决办法

一、在 MyBatis 的 XML 映射文件中&#xff0c;进行字符串比较时&#xff0c;需要使用单引号将字符串括起来&#xff0c;以表示字符串字面值。这是因为 MyBatis 的表达式语言中&#xff0c;使用单引号表示字符串字面值。 二、当使用双引号括起字符串时&#xff0c;MyBatis 会将…

系统安全及应用

1、基本安全措施 1.1、系统账号清理 在Linux系统中&#xff0c;除了用户手动创建的各种账号之外&#xff0c;还包括随系统或程序安装过程而生产的其他大量账号。除了超级用户root之外&#xff0c;其他大量账号只是用来维护系统运作、启动或保持服务进程&#xff0c;一般是不允…

C++学习笔记(二十五):c++ 智能指针

c中的内存的分配和释放是由程序员自己规划。智能指针不需要自己去delete一个new的对象&#xff0c;会自动释放对应的内存空间。unique_ptr&#xff1a;作用域指针&#xff0c;超出作用域后自动释放分配的内存区域。unique是指唯一&#xff0c;不能复制一个unique_ptr指针&#…

Java:Lambda表达式、方法引用

文章目录 1、Lambda表达式1.1 Lambda表达式体验1.2 Lambda表达式的省略形式1.3 Lambda表达式练习 2、方法引用体验3、方法引用符4、引用静态方法5、引用对象的实例方法6、引用类的实例方法7、引用构造方法8、引用数组的构造方法9、方法引用练习9.1 练习19.2 练习29.3 练习3 10、…

【测试开发】自动化测试selenium

文章目录 目录 文章目录 前言 一、自动化测试与selenium selenium介绍 二、如何使用selenium IDE录制脚本 1.安装Selenium IDE 2.seleniumpython环境搭建 3.webdriver API 前言 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条…

优势演员-评论家算法 A2C

优势演员-评论家算法 A2C 优势演员-评论家算法 A2C主要思想目标函数 优势演员-评论家算法 A2C 前置知识&#xff1a;演员-评论家算法&#xff1a;多智能体强化学习核心框架 主要思想 AC 网络结构&#xff1a; 策略网络 - 演员: 这个网络负责根据当前的状态选择动作。它输出的是…

leetcode——杨辉三角

https://leetcode.cn/problems/pascals-triangle/ 杨辉三角&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 核心思想&#xff1a;找出杨辉三角的规律&#xff0c;发…

案例098:基于微信小程序的电子购物系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Apache Paimon:Streaming Lakehouse is Coming

摘要&#xff1a;本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松&#xff08;花名&#xff1a;之信&#xff09;、同程旅行大数据专家&#xff0c;Apache Hudi & Paimon Contributor 吴祥平、汽车之家大数据计算平台…

(一)为什么要选择C++

如果要说C的优点&#xff0c;大部分人可能会说C 跨平台&#xff0c;性能好&#xff0c;如果要说C缺点那估计很多人可以说出一大堆。 没有官方包管理工具没有官方构建工具&#xff0c;虽然cmake 横空出世&#xff0c;有一统江湖的趋势&#xff0c;但是很多项目还是没有cmake支持…

JavaScript-变量数据类型-笔记

1.变量的使用 ① 先声明 再赋值 声明&#xff1a;var 变量名 在声明时不知道数据类型 赋值&#xff1a;变量名 值 在赋值时 知道数据类型 ② 初始化&#xff1a; 在声明变量时 就进行赋值 var 变量名 值 2.变量名在使用时 不能加引号 3…

18.Linux Shell中的mktemp命令使用

文章目录 Linux Shell创建临时文件在工作目录创建临时文件在/tmp 目录创建临时文件3)创建临时目录 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Linux Shell创建临时文件 Linux的/tmp目录用来存放不需要永久保留的文件。大多数Linux发…

前置判断-Detection

检测模型回答存在幻觉可以通过检索外部知识进行校验&#xff0c;不过考虑生成式模型覆盖问题的广泛性&#xff0c;Self-Contradictory论文中评估chatgpt生成的回答中38.5%的内容无法通过Wiki等外部知识进行校验。 因此这里我们先介绍一种完全基于模型自身&#xff0c;不依赖外…

PCL 切片法实现点云模型的体积测量、面积测量(二)

目录 一、算法概述二、代码示例三、结果示例接上篇 PCL 点云模型的体积测量、面积测量(一) 一、算法概述 适用:通过VTK进行切片法,实现点云模型的体积测量、面积测量。 思路:1. 首先,使用vtk中的vtkPlane类来设置切割平面;2. 再使用vtk中的vtkCutter类切割vtkPolyData;…

多线程第一课---

UML中规定的箭头方向是从子类指向父类。 关于这一点&#xff0c;按照以下方法去理解有助于大家记住这条规则。 在定义子类时需要通过extends关键字指定父类。因此&#xff0c; 子类一定要知道父类的定义&#xff0c;而反过来&#xff0c;父类并不知道子类的定义。 只有在知道对…

51单片机串行口相关知识

51单片机串行口相关知识 串行通信概念 计算机与外部通信方式就两种&#xff1a; 并行通信串行通信 两种通信方式的特点以及适用场景&#xff1a; 名称特点适用场景并行通信速度快&#xff0c;效率高&#xff0c;成本高适合短距离高速通信&#xff0c;如计算机内部各硬件之…