分散IDジェネレーター-MySQLデータベースの自動インクリメント

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して6日目です。クリックしてイベントの詳細をご覧ください

image.png

1.MySQLフィールドの自動インクリメント

MySQLデータベースを使用する場合、列の整数を順番にインクリメントする必要がある場合。MySQLの自動インクリメント列を使用できます。この列の値は、MySQLサーバーによって自動的に生成され、昇順の正の整数のシーケンスです。自動インクリメント列を使用して、テーブル内の新しい行の一意の識別子を生成できます。自動インクリメント列の機能:

  • 自動インクリメント列はすべてのデータ型を使用できるわけではなく整数または浮動小数点型にのみ適用されます。これには、、、、、、、、、、TINYINT含まます文字タイプは適用されませんSMALLINTINTMEDIUMINTBIGINTDECIMALFLOATDOUBLE
  • 自動インクリメントは主キーまたは一意キーである必要があり、各テーブルに含めることができる自動インクリメント列は1つだけです。(主に分散IDジェネレーターの主キーに使用される場合)
  • 自動インクリメントの初期値は1です。

2.自己インクリメントIDを分散IDジェネレーターとして使用する方法

MySQLデータに基づくAUTO_INCREMENT自己は、分散IDジェネレーターとして機能できます。具体的な実装は次のとおりです。

IDを生成するための別のテーブルを作成します。テーブルは次のとおりです。

CREATE TABLE `distributed_id_generator`  (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `desc` varchar(255) NULL DEFAULT '' COMMENT '说明',
  PRIMARY KEY (`id`)
);
复制代码

データがテーブルに挿入されるたびに、データによって返されるIDが取得されます。これは、グローバルに一意のIDです。

ヒント:ID生成の同時実行性の保証はMySQLによって保証されています

3.mysqlに基づく実装

@Service
public class DistributedIdGeneratorService {
​
    @Autowired
    private DistributedIdGeneratorDao dao;
​
    public long generatorId() {
        DistributedIdGeneratorEntity entity = new DistributedIdGeneratorEntity();
        dao.insertDistributedIdGenerator(entity);
        return entity.getId();
    }
}
​
public interface DistributedIdGeneratorDao {
​
    Long insertDistributedIdGenerator(@Param("entity") DistributedIdGeneratorEntity entity);
​
}
复制代码

mybatisのxmlファイル:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
​
<mapper namespace="com.github.mxsm.mysql.dao.DistributedIdGeneratorDao">
    <insert id="insertDistributedIdGenerator" keyProperty="id" useGeneratedKeys="true" parameterType="com.github.mxsm.mysql.entity.DistributedIdGeneratorEntity">
        insert into distributed_id_generator (remark) values (#{entity.remark})
    </insert>
</mapper>
复制代码

これで実装は完了です。

ヒント:コードアドレスgithub.com/mxsm/distri…

4.長所と短所

アドバンテージ:

  • 実装はシンプルで、主にMySQLによって実装されます
  • 開発者が自分で同時実行制御を実装する必要はありません。MySQLは、生成されたIDの一意性を確保するための同時実行制御を提供します。

欠点:

  • 同時実行性はMySQLデータベースに依存しており、同時実行性を向上させるためにMySQLデータベースをクラスターにデプロイすることはできません。
  • 一定期間使用すると、IDを生成するテーブル内のデータが増加し、テーブル内のデータが一定のレベルに達するとパフォーマンスに影響します。IDジェネレーターとして使用されるテーブルをサブデータベースサブテーブルにすることはできません
  • MySQLデータベースが使用できなくなると、IDジェネレーター全体が機能しなくなります。したがって、データベースの安全な操作を保証することが、このスキーム(マスター/スレーブモード)を使用するための鍵となります。

ヒント:データベース内のテーブルデータが多すぎる場合は、スケジュールされたタスクを使用してデータをクリーンアップできます

5.まとめ

MySQLAUTO_INCREMENTをて分散IDジェネレーターを実装する場合、パフォーマンスのボトルネックは主にMySQLにあります。この方法は、同時実行要件が高くない場合に使用できます。MySQLデータベースが正しく機能することを確認する必要があるだけです(マスタースレーブモードなど)。

私は象を運ぶアリです。記事はあなたに役立ちます。いいねしてフォローしてください。記事が間違っている場合はコメントを残してください〜ありがとう

おすすめ

転載: juejin.im/post/7083511979209883684