百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

随笔:关于主键,除了自增,你还可以这样

mhr18 2024-10-03 22:39 19 浏览 0 评论

当前各大主流关系型数据库都提供了自增主键生成策略,如Mysql的AUTO_INCREMENT,Sql Server的IDENTITY,Oracle则是通过SEQUENCE来实现主键自增。使用自增主键,比较简单,占用空间较小;主键按顺序增长存放,不会产生页分裂;同时也有一些不足,如多个系统之间集成数据时,容易有主键冲突;单表自增对于数据库单表压力较大,不适用于高并发及分布式场景,自增主键容易被探知到系统业务量等。由此可见在系统业务量较小,并发量不大时使用自增主键不失为一种较好的选择,但是当面对高并发、分布式需求时,使用自增主键会存在较大的瓶颈。

下面介绍业界较为流行的一些主键生成策略。

1.UUID模式

通用唯一识别码(Universally Unique Identifier),根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性重复UUID码概率接近零,可以忽略不计。UUID具有多个版本:基于时间的UUID、DCE安全的UUID、基于名字的UUID(MD5)(UUID.nameUUIDFromBytes())、随机UUID(UUID.randomUUID().toString())、基于名字的UUID(SHA1),Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于需要相同内容生成相同UUID的业务场景下;Version 4建议不要使用(随机数有可能出现重复,但是重复的概率极低,在设计时需要考虑到这一点)。UUID虽然解决了依赖于数据库生成主键的策略,但是也存在一些不足:占用存储空间大;随机生成,不具有连续性,作为主键时性能较差;无法根据主键进行排序,确定记录插入的先后顺序;对于开发人员不友好;如果生成过程中使用了机器MAC地址,存在一定安全隐患。

2.步长模式

即Flickr的sharding主键生成方案。使用多台数据库服务器,通过设置不同的起始值、一致自增步长,让每个数据库中各表主键保持唯一。如图所示:

步长方式在一定程度上解决了高并发的问题,但是也存在一些问题如:扩展困难,设置好步长后,再进行扩展将会比较困难;ID并不是按顺序严格单调递增的特性,只是趋势递增;每次获取ID仍然需要读写一次数据库,仍然存在瓶颈。

3.号段模式

即每次从数据库获取id时,从数据库取到当前id最大值,然后返回max+step,当应用程序用完这个号段后,再从数据库获取下一个长度为step的号段。为此需要专门设计一张用以记录id的表,在应用服务为集群,而主键服务器为单点时,多个应用服务节点同时获取id时,会产生冲突,可以增加version字段从而使用乐观锁进行并发访问控制。

id表主键(id)业务类型(id_type)当前最大id (max_id)号段长度(step)版本号(version)

号段模式将主键缓存在应用服务端,从而减少对数据库的访问频率;在数据库数据库不可用时,应用服务仍然可以持续运行一段时间直到当前号段用完;但是在应用服务重启时有可能丢失部分id,导致id增长不连续。

基于号段模式有一些成熟方案,且经过实践验证:美团的Leaf-segment对号段发放方式进行了双buffer缓存及高可用容灾优化。采用双buffer模式,在当前号段消费到某个点时就异步的把下一个号段加载到内存中。而不需要等到号段用尽的时候才去更新号段,不会在应用服务器向数据库请求id时,因为id号段没有取回来,导致线程阻塞。

滴滴的TinyId参照了美团Leaf的实现方式,并对其做了扩展,增加了多db支持和tinyid-client。

4.snowflake模式(雪花算法)

Twitter实现的分布式ID生成算法。结构如下:0-00000000000000000000000000000000000000000-00000-00000-000000000000

  • 1 bit:保留位,为符号位,全部为0,表示生成的id都是正数。
  • 41bit:时间戳,单位为毫秒,41位可以表示69年的时间。
  • 10bit:机器id,10bit里面5位代表机房id,5位代表机器id,可以表示32个机房,每个机房里面可以用32台机器。
  • 12bit:12位序列号,按顺序递增,记录每个节点1毫秒内产生的id,每毫秒可以产生4096个id。

snowflake的优点:

  1. 主键在单个节点上是按序列递增的,能够按照时间趋势进行递增。
  2. 主键的生成不依赖于数据库,可以由应用程序生成。
  3. 在分布式集群内不会产生重复id。
  4. 可以根据业务需求对bit位进行调整。

snowflake的缺点:

  1. 对于时间依赖较高,如果时间回拨,则会产生主键重复情况。
  2. 当集群规模较大时,workid配置会增加一定成本。

美团的Leaf-snowflake,使用zk解决了snowflake依赖于时钟,时间回拨产生重复主键问题;百度的UidGenerator,支持自定义时间戳、workerId、序列号等。

5.Redis模式

利用Redis原子操作INCR和INCRBY来实现,使用Redis集群提高并发量,与步长模式类似,只不过将id生成器由传统数据库换成效率更高的Redis数据库。但是当Redis重启或者宕机,记录主键值会丢失,所以利用Redis进行主键生成时需要对当前主键值进行持久化。Redis支持RDB和AOF两种持久化机制。RDB模式下,可能会丢失部分未打镜像的数据,根据快照恢复后会产生部分重复ID,故RDB不适合实施持久化Redis数据场景。AOF以独立日志记录每次写命令,重启时执行日志中的命令进行数据恢复,不会出现ID重复现象,但是会由于备份命令过多,导致Redis恢复数据时间较长。

以上介绍了五种数据库主键的生成策略,大家可以根据具体业务场景和系统实际情况选择一款最适合自己的主键策略,提升数据库性能,保证在高并发情况下系统运行稳定性。

相关推荐

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627

一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...

增量备份修复物理备库gap(增量备份恢复数据库步骤)

适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...

一分钟看懂,如何白嫖sql工具(白嫖数据库)

如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...

「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布

前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...

您还在手工打造增删改查代码么,该神器带你脱离苦海

作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...

Linux基础知识(linux基础知识点及答案)

系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...

PL/SQL 杂谈(二)(pl/sql developer使用)

承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...

电商ERP系统哪个好用?(电商erp哪个好一点)

电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...

汽车检测线系统实例,看集中控制与PLC分布控制

PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...

苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品

钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...

取消回复欢迎 发表评论: