IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 全局唯一ID实现方案 -> 正文阅读

[大数据]全局唯一ID实现方案

1. 数据库主键自增

1.1 实现方案

通过创建表时,设置数据库主键自增

alter table sec_user modify id integer auto_increment ;

1.2 优缺点

优点:
依赖于数据库自身不需要其他资源;ID号单调自增,可以实现一些对ID有特殊要求的业务

缺点:
强依赖DB,当DB异常时整个系统不可用;
一致性难以保证:主从复制可增加可用性,但数据一致性在特殊情况下难保证:主从切换时的不一致可能会导致重复发号
ID发号性能瓶颈限制在单台MySQL的读写性能
id单调递增,规律性较强,存在安全风险。

2.UUID

2.1 实现方案

UUID由以下几部分的组合:
(1)当前日期和时间。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
Java API实现:

UUID.randomUUID();

格式:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)

样例:
550e8400-e29b-41d4-a716-446655440000

2.2 优缺点

优点:
1)简单,代码方便。
2)生成ID性能非常好,基本不会有性能问题,本地生成,没有网络消耗。
3)全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对

缺点:
1)生成的ID为32位128个字节的 字符串类型,存储占用比较大。
2)生成的ID为字符串类型,如果作为主键存储在数据库时,会导致数据库索引频繁重建
3)字符串类型查询效率较低。
4)信息不安全,基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。

3. 雪花算法(SnowFlake)

3.1 实现方案

在这里插入图片描述组成部分:
符号位:1bit,正数永远为0
时间戳:41bit,精确到毫秒级别
机器标识:10bit,前5bit为机房标识,后5bit为机器标识。
自定义序列 :12bit,可以每一毫秒生成2^12个id

3.2 优缺点

优点:
1)简单高效,生成速度快。
2)时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序递增。
3)灵活度高,可以根据业务需求,调整bit位的划分,满足不同的需求。

缺点:
1)依赖机器的时钟,如果服务器时钟回拨,会导致重复ID生成。
2)在分布式环境上,每个服务器的时钟不可能完全同步,有时会出现不是全局递增的情况。

4. 基于 Redis自增方案

4.1 实现方案

在这里插入图片描述
组成部分:
符号位:1bit,正数永远为0
时间戳:31bit,秒级
自定义序列:32bit

@Component
public class RedisIDWorker {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final long TIME_STAMP = 1650727974L;

    public long nextId(String keyPrefix) {
        // 获取当前时间戳
        LocalDateTime localDateTime = LocalDateTime.now();
        long nowTimeStamp = localDateTime.toEpochSecond(ZoneOffset.UTC);
        // 获取指定的时间戳
        long timeStamp = nowTimeStamp - TIME_STAMP;
        // redis 自增序列,防止生成序列超出限制,每天重置序列
        String currentDate = localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        Long increment = stringRedisTemplate.opsForValue().increment(keyPrefix + ":" + currentDate);
        // 高31bit为时间戳,低32bit为自增学列
        return (timeStamp << 31) ^ increment;
    }



}


4.2 优缺点

优点:
1)不依赖于数据库,灵活方便,且性能优于数据库。
2)数字ID天然排序,对分页或者需要排序的结果很有帮助

缺点:
1)如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。
2)需要编码和配置的工作量比较大。
3)Redis是单线程的,若造成阻塞,则会引发高并发问题,需要处理好集群与主从关系

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:31:36  更:2022-04-24 09:32:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:06:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码