当前位置:

首页 > 编程开发 > Redis全局ID生成器如何实现

Redis全局ID生成器如何实现

IDM
IDM

IDM(Internet Download Manager)是一款专为 Win 平台打造的高速下载利器,享受超快的下载速度和极致的下载体验。在数码荔枝可以更优惠的价格购买正版 IDM,避免使用破解,获得安全稳定的服务。

立即下载
¥59
Windows 2026-10-12
Internet Download Manager 正版软件 Windows idm 装机必备

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般满足下列特性:唯一性:确保ID是唯一的,不可重复递增性:确保是整体逐渐增大的,这样有利于数据库创建索引安全性:ID的规律性不是特别的明显,防止根据ID号猜测其他的ID,确保安全性高性能:确保生成ID的速度足够快高可用:确保任何时候都能用实现原理:为了增加ID的安全性,可以不直接使用Redis自增的数值,而是拼接一些其他的信息,ID的组成如下图:符号位:1bit,永远为0,表示正数时间戳:31bit,以秒为单位,可以使用大约69年序列号:3

本文目录

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

    • 唯一性:确保ID是唯一的,不可重复

    • 递增性:确保是整体逐渐增大的,这样有利于数据库创建索引

    • 安全性:ID的规律性不是特别的明显,防止根据ID号猜测其他的ID,确保安全性

    • 高性能:确保生成ID的速度足够快

    • 高可用:确保任何时候都能用

    实现原理:

    为了增加ID的安全性,可以不直接使用Redis自增的数值,而是拼接一些其他的信息,ID的组成如下图:

    Redis全局ID生成器如何实现

    • 符号位:1bit,永远为0,表示正数

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

    •  序列号:32bit,相同秒数的情况下,ID在序列号位置上增加,支持每秒产生2^32个不同的ID

    代码实现:

    import org.springframework.beans.factory.annotation.Autowired;
    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 {
     
        /**
         * 开始时间戳 (2022-01-01 00:00:00)
         */
        private static final long BEGIN_TIMESTAMP = 1640995200L;
     
        /**
         * 序列号的位数
         */
        private static final int COUNT_BITS = 32;
     
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
     
        /**
         * 生成ID
         *
         * @param keyPrefix 业务系统的前缀
         * @return ID
         */
        public long nextId(String keyPrefix) {
            // 生成时间戳
            long timestamp = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) - BEGIN_TIMESTAMP;
            // 生成序列号
            String key = "icr:" + keyPrefix + ":" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
            long count = stringRedisTemplate.opsForValue().increment(key);
            // 拼接并返回
            return timestamp << COUNT_BITS | count;
        }
     
        /**
         * 获取时间戳 (2022-01-01 00:00:00)
         * @param args
         */
        public static void main(String[] args) {
            LocalDateTime time = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
            long second = time.toEpochSecond(ZoneOffset.UTC);
            System.out.println(second);
        }
    }

    生成序号:

    Redis的自增是有上限的,最大值为2^64。虽然这个数是很大了,但是毕竟还有会有上限,时间足够长还是有可能超过这个数的。所以即使是同一个业务,也不能使用同一个key。因此可以在key中增加日期,比如:icr:业务名:2022:05:14。这样的话每天都会是新的key,每天的自增量不可能超过2^64,所以这样的key是比较合适的选择。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    iPhone17
    iPhone17

    iPhone 17 Pro Max相册锁设置全攻略:给你的隐私加把“锁” 给你的iPhone 17 Pro Max相册加上一把锁,其实非常简单。只需在设置中进入“照片”选项,开启“使用面容ID”或“使用密码”,就能有效守护你的个人隐私。下面这份详细指南,带你一步步搞定。 一、为什么需要设置相册锁?

    如何设置新iPhone16?10个步骤快速完成初始配置
    如何设置新iPhone16?10个步骤快速完成初始配置

    想让新到手的iPhone 16尽快进入工作状态?核心其实很简单:跟着系统引导走,重点搞定Apple ID、面容ID、数据迁移和隐私这几项,半小时内你就能用上新手机。 1. 开机并选择语言和地区 长按侧边按钮,看到苹果标志亮起,这事儿就成了。滑动屏幕开始,第一个选择题来了:选语言和地区。别小看这一步,

    iPhone15怎么改密码?详细步骤与常见问题解答
    iPhone15怎么改密码?详细步骤与常见问题解答

    想给你的iPhone 15换个新密码?操作其实很简单:进入“设置”,找到“面容ID与密码”或“触控ID与密码”,验证旧密码后就能直接设置新密码了。 iPhone15密码修改详细步骤 拿到iPhone 15,无论是哪款型号,修改密码的路径都设计得非常直观。整个过程就在“设置”里完成,跟着下面的步骤走,

    php72w redis,docker php7安装php-redis
    php72w redis,docker php7安装php-redis

    在Docker环境下为PHP安装Redis扩展:手动编译需下载源码、安装phpize、配置编译并安装,生成redis.so并在php.d目录新建redis.ini加载,重启PHP-FPM;也可直接yum安装php72w-pecl-redis,免手动编译。

    php 如何配置 redis,php 如何设置redis
    php 如何配置 redis,php 如何设置redis

    配置PHP的Redis扩展:先安装Redis服务,从GitHub下载phpredis源码,用phpize编译安装,修改php.ini添加extension=redis.so,重启php-fpm或Apache,通过phpinfo验证并连接Redis。

    屏下Face ID有什么优势?苹果iPhone何时会有屏下Face ID?
    屏下Face ID有什么优势?苹果iPhone何时会有屏下Face ID?

    苹果屏下FaceID因传感器难题推迟至2025年,屏下TouchID优先级较低。新方案融合短波红外线与光学系统,支持指纹识别及血氧等健康监测,识别速度更快。

    屏下Face ID有什么优势?iPhone 15系列会有Face ID吗?
    屏下Face ID有什么优势?iPhone 15系列会有Face ID吗?

    苹果对Face ID的执着,业内一直有目共睹。当安卓厂商早已全面铺开屏下指纹技术时,苹果依然坚持“安全第一”的路线,宁愿砸下更高成本研发屏下Face ID,也不肯回头用指纹识别。 所谓屏下Face ID,就是把Face ID所需的传感器藏在屏幕下方——类似屏下摄像头的思路——让用户再也看不到iPho

    屏下Face ID摄像头有什么优点?哪款iPhone会配备屏下Face ID摄像头?
    屏下Face ID摄像头有什么优点?哪款iPhone会配备屏下Face ID摄像头?

    苹果计划明年在iPhone16Pro上首次应用屏下FaceID技术,彻底移除刘海和灵动岛,仅保留前置摄像头单打孔,实现真正全面屏视觉体验,大幅提升屏占比与一体感。

    面容ID不可用怎么办?iPhone升级iOS 16后Face ID不能用解决办法
    面容ID不可用怎么办?iPhone升级iOS 16后Face ID不能用解决办法

    升级iOS16后,部分iPhone的面容ID提示不可用。首先建议重启设备,其次更新系统,然后揭下贴膜并擦拭传感器,最后尝试恢复出厂设置。若因摔落或进水导致硬件损坏,则需联系苹果售后维修。同时还可检查面容设置、强制重启,并备份数据。

    升级iOS 16 后 Face ID不可用怎么办?
    升级iOS 16 后 Face ID不可用怎么办?

    升级iOS16后部分iPhone用户遭遇FaceID不可用提示,原因不明且苹果未发布官方说明。可通过检查更新、面容ID设置、确认无遮挡、重启设备、添加替用外貌、重设面容ID或联系支持等九种方法尝试解决。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?