当使用分库分表等功能之后,就不能再依赖数据库自带的主键生成机制了,一方面主键ID不能重复,另外需要在新增之前就知道主键ID,才能保证ID能够均匀分布到不同的数据库或数据表中,所以要使用一个合理的主键生成策略。

1. UUID

  使用UUID作主键是最简单的方案,但是缺点也是非常明显的。由于UUID非常的长,并需要使用字符串存储,除占用大量存储空间外,最主要的问题是在索引上,在建立索引和基于索引进行查询时都存在性能问题。

2. 主键生成器

  Sharding-jdbc提供主键生成器,就是一个会生成不重复Long值的类。该生成器生成的数据为64bit的long型数据,数据库中应该用大于等于64bit的数字类型的字段来保存该值,比如在MySQL中应该使用BIGINT。

  添加依赖:

<dependency>
<groupId>com.dangdang</groupId>
<artifactId>sharding-jdbc-self-id-generator</artifactId>
<version>1.4.2</version>
</dependency>

  在@Configuration类中创建Bean对象

@Bean
public IdGenerator getIdGenerator() {
return new CommonSelfIdGenerator();
}

  使用Bean对象

@Autowired
private IdGenerator idGenerator; @Test
public void generateId(){
long id = idGenerator.generateId().longValue();
}

3. Redis

  使用Redis的increment命令,可以生成递增Long类型数字。因为Redis是单线程的,可以保证是唯一ID。

4. 使用数据表做ID生成服务器

  建立两台以上的数据库ID生成服务器,每个服务器都有一张记录各表当前ID的Sequence表,但是Sequence中ID增长的步长是服务器的数量,起始值依次错开,这样相当于把ID的生成散列到了每个服务器节点上。例如:如果我们设置两台数据库ID生成服务器,那么就让一台的Sequence表的ID起始值为1,每次增长步长为2,另一台的Sequence表的ID起始值为2,每次增长步长也为2,那么结果就是奇数的ID都将从第一台服务器上生成,偶数的ID都从第二台服务器上生成,这样就将生成ID的压力均匀分散到两台服务器上,同时配合应用程序的控制,当一个服务器失效后,系统能自动切换到另一个服务器上获取ID,从而保证了系统的容错。

  参考资料:https://blog.csdn.net/dfhjryvx/article/details/83896306

最新文章

  1. GJM :Unity集成Leap Motion
  2. Android探索之HttpURLConnection网络请求
  3. eclipse的插件安装
  4. 常用js总结1
  5. nginx 与 lua 开发环境搭建
  6. Unity 物理引擎动力学关节
  7. js设计模式(11)---命令模式
  8. Hadoop分布式文件系统(HDFS)详解
  9. nodejs使用express4框架默认app.js配置说明
  10. [LeetCode] 55. Jump Game 解题思路
  11. Linux终端颜色和标题设置
  12. 老李分享:Mac快捷键
  13. 3.Maven坐标和依赖
  14. MySql按每日、每周、每月分组统计数据
  15. Django REST framework中的版本控制
  16. python Docker 查看私有仓库镜像
  17. springCloud com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
  18. express中session的使用
  19. centos6.5/centos7安装部署企业内部知识管理社区系统wecenter
  20. Java 基础 面向对象之关键字内部类代码块修饰符

热门文章

  1. C++的基本输入输出
  2. UDP/TCP 流程与总结
  3. 执行ArrayList的remove(object)方法抛异常?
  4. HTTP协议——详细版
  5. element-ui 表单校验 Rules 配置 常用黑科技
  6. matplot笔记
  7. bzoj2160拉拉队排练
  8. Serverless的概念&amp;定义-无服务计算详解
  9. 用CBrother脚本实现smtp协议发送一份邮件
  10. 第四章:View的工作原理