主键内嵌分库分表键

简介: 【7月更文挑战第8天】

随机数算是比较正统的方案,第二个方案看起来有点奇怪。

在低频场景下,很容易出现序列号几乎没有增长,从而导致数据在经过分库分表之后只落到某一张表里的情况。为了解决这种问题,可以考虑这么做,序列号部分不再是从0开始增长,而是从一个随机数开始增长。还有一个策略就是序列号从上一时刻的序列号开始增长,但是如果上一时刻序列号已经很大了,那么就可以退化为从0开始增长,这样比随机数更可控一点,而且性能也更好一点。
一般来说,这个问题只在利用ID进行哈希的分库分表里面有解决的意义。在利用ID进行分库分表的情况下,很显然某一段时间内产生的ID都会落到同一张表里。不过这也是我们的使用范围分库分表预期的行为,不需要解决

大多数时候,我们会面临一个问题,就是分库分表的键和主键并不是同一个。比如在C端的订单分库分表,我们可以采用买家ID来进行分库分表。但是一些业务场景,比如说查看订单详情,可能是根据主键或是订单SN来查找的。
那么可以考虑借鉴雪花算法的设计,将主键生成策略和分库分表键结合在一起,也就是在主键内部嵌入分库分表键。例如,我们可以这样设计订单ID的生成策略,假设分库分表使用的是买家ID的后四位。第一段依旧是采用时间戳,第二段换成了买家后四位,第三段采用随机数

普遍情况下,我们都是用买家ID来查询对应的订单信息,在别的场景下,比如我们只有一个订单ID,这时候我们可以取出订单ID里嵌入进去的买家ID后四位,来判断数据存储哪个库、哪个表。类似的设计还有答题记录按照答题者ID来分库分表,但是答题记录ID本身可以嵌入这个答题者ID里用于分库分表的部分。

最后要记得升华一下这种设计思想

这一类解决方案,核心就是不拘泥于雪花算法每一段的含义。比如第二段可以使用具备业务含义的ID,第三段可以自增,也可以随机。只要我们能够保证ID生成是全局递增且独一无二的就可以

为什么要这样升华呢?因为这段话里,我们很明显的埋下了两颗雷,一个是全局递增,一个是独一无二。也就是说这个亮点方案保证不了这两点,可能会被面试官追问这两个点。

目录
相关文章
|
算法 Unix API
指数退避(Exponential backoff)在网络请求中的应用
## 一、背景 最近做云服务 API 测试项目的过程中,发现某些时候会大批量调用 API,从而导致限流的报错。在遇到这种报错时,传统的重试策略是每隔一段时间重试一次。但由于是固定的时间重试一次,重试时又会有大量的请求在同一时刻涌入,会不断地造成限流。 这让我回想起两年前在查阅[Celery Task 文档](http://docs.celeryproject.org/en/latest
12730 1
|
Linux Shell 数据安全/隐私保护
CentOS-7.9忘记密码如何进入系统
前言 密码记不住一定要备份,重点! 以下步骤旨在提供一个大致的指南。请根据你的系统和问题进行调整,并确保在进行任何更改之前备份重要数据。如果对任何命令不确定,最好先进行额外的研究或咨询。 启动系统并进入 GRUB 引导界面 选择你要引导的Linux系统,并在启动时按下键盘上的 e 键来编辑引导选项。 修改启动参数 在启动参数中找到以 ro 开头的行,将其修改为 rw 并在其末尾添加 rd.break。这将告诉系统在启动时进入临时环境以修改密码。 启动系统
1228 2
|
存储 JSON 数据库
Elasticsearch通关教程(一): 基础入门
简介 Elasticsearch是一个高度可扩展的、开源的、基于 Lucene 的全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据,并支持多租户。 Elasticsearch也使用Java开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
13377 1
|
NoSQL Redis 数据安全/隐私保护
在 Docker 中部署 Redis 并挂载配置文件
在 Docker 中部署 Redis 并挂载配置文件
|
9月前
|
弹性计算 关系型数据库 数据库
自建数据库迁移到云数据库实操
本课程详细介绍了自建数据库迁移到阿里云RDS的实操步骤。主要内容包括:创建实例资源、安全设置、配置自建的MySQL数据库、数据库的迁移、从自建数据库切换到RDS以及清理资源。通过这些步骤,学员可以掌握如何将自建数据库安全、高效地迁移到云端,并确保应用的正常运行。
449 26
|
Java Redis
redis-学习笔记(Jedis zset 简单命令)
redis-学习笔记(Jedis zset 简单命令)
187 3
|
12月前
|
人工智能 网络协议 Shell
内网穿透实现公网访问自己搭建的Ollma架构的AI服务器
内网穿透实现公网访问自己搭建的Ollma架构的AI服务器
546 1
|
JavaScript Java 程序员
闲话目前游戏服务器的开发
闲话目前游戏服务器的开发
|
缓存 IDE 数据可视化
Go 日常开发常备第三方库和工具(中)
重点和大家分享下我们日常开发中所使用到的一些第三方库与工具。 这里我主要将这些库分为两类: 业务开发 基础工具开发
|
中间件 Go
Go如何优雅的记录操作日志
这篇文章比较硬核,会涉及到这几个知识点:协程、协程池、钩子函数、中间件以及异步方法的使用,文章最后会带大家去阅读Async的源码,了解其底层实现。
2221 0
Go如何优雅的记录操作日志