xsequence4cj 特性文档

介绍

xsequence4cj 是一个分布式序列号生成组件。

1 DB 序列号生成器

1.1 接口

1.1.1 interface Sequence

序列号生成器接口

public interface Sequence {

    /**
     * 生成下一个序列号
     *
     * 返回值 Int64 - 序列号
     */
    func nextValue(): Int64
}

1.1.2 interface SeqRangeMgr

区间管理器

public interface SeqRangeMgr {

    /**
     * 获取指定区间名的下一个区间
     *
     * 参数 name - 区间名
     * 返回值 SeqRange - 返回区间
     */
    func nextRange(name: String): SeqRange
}

1.1.3 interface SeqBuilder

序列号生成器构建者

public interface SeqBuilder {

    /**
     * 构建一个序列号生成器
     *
     * 返回值 Sequence - 序列号生成器
     */
    func build(): Sequence
}

1.1.4 interface RangeSequence <: Sequence

序列号区间生成器接口

public interface RangeSequence <: Sequence {

    /**
     * 设置区间管理器
     *
     * 参数 seqRangeMgr - 区间管理器
     * 返回值 Unit
     */
    func setSeqRangeMgr(seqRangeMgr: SeqRangeMgr): Unit

    /**
     * 设置获取序列号名称
     *
     * 参数 name - 名称
     * 返回值 Unit
     */
    func setName(name: String): Unit
}

1.2 类

1.2.1 class SeqRange

序列号区间对象模型

public class SeqRange {

    /**
     * 区间序列号初始化
     *
     * 参数 min - 区间序列号开始值
     * 参数 max - 区间序列号结束值
     */
    public init(min: Int64, max: Int64)

    /**
     * 返回并递增下一个序列号
     *
     * 返回值 Int64 - 下一个序列号,如果返回-1表示序列号分配完毕
     */
    public func getAndIncrement(): Int64 

    /**
     * 获取区间序列号开始值
     *
     * 返回值 Int64 - 区间序列号开始值
     */
    public func getMin(): Int64
    
    /**
     * 获取区间序列号结束值
     *
     * 返回值 Int64 - 区间序列号结束值
     */
    public func getMax(): Int64

    /**
     * 区间的序列号是否分配完毕,每次分配完毕就会去重新获取一个新的区间
     *
     * 返回值 Bool - 区间序列号分配完返回 true,反之 false
     */
    public func isOver(): Bool

    /**
     * 设置区间序列号是否分配完毕
     *
     * 参数 over - true:区间序列号分配完毕,false:没有分配完毕
     * 返回值 Unit
     */
    public func setOver(over: Bool): Unit

    /**
     * 获取区间序列号字符串形式
     *
     * 返回值 String - 区间序列号字符串形式
     */
    public func toString(): String
}

1.2.2 class DbSeqRangeMgr <: SeqRangeMgr

DB 区间管理器

public class DbSeqRangeMgr <: SeqRangeMgr {

    /**
     * 获取指定区间名的下一个区间
     *
     * 参数 name - 区间名
     * 返回值 SeqRange - 返回区间
     */
    public override func nextRange(name: String): SeqRange

    /**
     * 创建 DB 区间管理器,用在设置完一系列参数之后
     *
     * 返回值 Unit
     */
    public func create(): Unit

    /**
     * 获取区间步长,默认 1000
     *
     * 返回值 Int64 - 区间步长
     */
    public func getStep(): Int64

    /**
     * 设置区间步长,默认 1000
     *
     * 参数 step - 区间步长
     * 返回值 Unit
     */
    public func setStep(step: Int64): Unit

    /**
     * 获取区间起始位置,从 stepStart + 1 开始
     *
     * 返回值 Int64 - 区间起始位置
     */
    public func getStepStart(): Int64

    /**
     * 设置区间起始位置,从 stepStart + 1 开始
     *
     * 参数 stepStart - 区间起始位置
     * 返回值 Unit
     */
    public func setStepStart(stepStart: Int64): Unit

    /**
     * 获取区间失败重试次数,默认 100
     *
     * 返回值 Int64 - 区间失败重试次数
     */
    public func getRetryTimes(): Int64

    /**
     * 设置区间失败重试次数,默认 100
     *
     * 参数 retryTimes - 区间是被重试次数
     * 返回值 Unit 
     */
    public func setRetryTimes(retryTimes: Int64): Unit

    /**
     * 获取 DB 来源
     *
     * 返回值 ?Datasource - DB 来源
     */
    public func getDataSource(): ?Datasource

    /**
     * 设置 DB 来源
     *
     * 参数 dataSource - DB 来源
     * 返回值 Unit
     */
    public func setDataSource(dataSource: Datasource): Unit

    /**
     * 获取表名,默认 range
     *
     * 返回值 String - 获取表名
     */
    public func getTableName(): String

    /**
     * 设置表名
     *
     * 参数 tableName - 表名
     * 返回值 Unit 
     */
    public func setTableName(tableName: String): Unit
}

1.2.3 class DefaultRangeSequence <: RangeSequence

序列号区间生成器接口默认实现

public class DefaultRangeSequence <: RangeSequence {

    /**
     * 生成下一个序列号
     *
     * 返回值 Int64 - 序列号
     */
    public override func nextValue(): Int64

    /**
     * 设置 DB 区间管理器
     *
     * 参数 seqRangeMgr - DB 区间管理器
     * 返回值 Unit
     */
    public override func setSeqRangeMgr(seqRangeMgr: SeqRangeMgr): Unit

    /**
     * 设置区间的业务名称
     *
     * 参数 name - 区间的业务名称
     * 返回值 Unit
     */
    public override func setName(name: String): Unit
}

1.2.4 class DbSeqBuilder <: SeqBuilder

基于 DB 取步长,序列号生成器的构建者

public class DbSeqBuilder <: SeqBuilder {

    /**
     * 初始化序列号生成器构建者
     */
    public init()

    /**
     * 设置数据库的数据源,必选
     *
     * 参数 dataSource - 数据库的数据源
     * 返回值 DbSeqBuilder - 序列号生成器构建者
     */
    public func dataSource(dataSource: Datasource): DbSeqBuilder

    /**
     * 存放序列号步长的表,默认  x_sequence_sequence,可选
     *
     * 参数 tableName - 表名
     * 返回值 DbSeqBuilder- 序列号生成器构建者
     */
    public func tableName(tableName: String): DbSeqBuilder 

    /**
     * 并发时,区间生成失败重试的次数,默认 100,可选
     *
     * 参数 retryTimes - 失败重试的次数
     * 返回值 DbSeqBuilder - 序列号生成器的构建者
     */
    public func retryTimes(retryTimes: Int64): DbSeqBuilder

    /**
     * 设置步长,默认 1000,可选
     *
     * 参数 step - 步长
     * 返回值 DbSeqBuilder - 序列号生成器的构建者
     */
    public func step(step: Int64): DbSeqBuilder

    /**
     * 业务名称,默认空字符串,必选,必选
     *
     * 参数 bizName - 业务名称
     * 返回值 DbSeqBuilder - 序列号生成器的构建者
     */
    public func bizName(bizName: String): DbSeqBuilder

    /**
     * 设置序列号分配起始值,默认 0,可选
     *
     * 参数 stepStart - 序列号分配起始值
     * 返回值 DbSeqBuilder - 序列号生成器的构建者
     */
    public func stepStart(stepStart: Int64): DbSeqBuilder 

    /**
     * 序列号生成器的构建者建立,用在设置参数之后
     *
     * 返回值 Sequence - 序列号生成器
     */
    public override func build(): Sequence 
}

2 示例

import mysqlclient_ffi.*
import std.database.sql.*
import std.time.*
import xsequence4cj.*

main(): Int64 {
    // 初始化数据库驱动
    let mysqlDriver: MysqlDriver = MysqlDriver("mysql")

    let arr: Array<(String, String)> = Array<(String, String)>()

    // 通过connectionString和选项打开数据源
    let dataSource: MysqlDatasource = mysqlDriver.open(
        "HOST=127.0.0.1;USER=root;PASSWD=123;DB=mysql;PORT=3306;UNIX_SOCKET=;CLIENT_FLAG=0",
        arr  
    )
    let sequence = DbSeqBuilder().dataSource(dataSource).tableName("tttable").bizName("userId").step(1000).stepStart(1000000).retryTimes(1000).build();
   
    for (i in 0..100) {
        println("++++++++++id: ${sequence.nextValue()}")
    }
    return 0
}

运行结果

++++++++++id: 1000001
++++++++++id: 1000002
++++++++++id: 1000003
++++++++++id: 1000004
++++++++++id: 1000005
++++++++++id: 1000006
++++++++++id: 1000007
++++++++++id: 1000008
++++++++++id: 1000009
++++++++++id: 1000010
++++++++++id: 1000011
++++++++++id: 1000012
++++++++++id: 1000013
++++++++++id: 1000014
++++++++++id: 1000015
++++++++++id: 1000016
++++++++++id: 1000017
++++++++++id: 1000018
++++++++++id: 1000019
++++++++++id: 1000020
++++++++++id: 1000021
++++++++++id: 1000022
++++++++++id: 1000023
++++++++++id: 1000024
++++++++++id: 1000025
++++++++++id: 1000026
++++++++++id: 1000027
++++++++++id: 1000028
++++++++++id: 1000029
++++++++++id: 1000030
++++++++++id: 1000031
++++++++++id: 1000032
++++++++++id: 1000033
++++++++++id: 1000034
++++++++++id: 1000035
++++++++++id: 1000036
++++++++++id: 1000037
++++++++++id: 1000038
++++++++++id: 1000039
++++++++++id: 1000040
++++++++++id: 1000041
++++++++++id: 1000042
++++++++++id: 1000043
++++++++++id: 1000044
++++++++++id: 1000045
++++++++++id: 1000046
++++++++++id: 1000047
++++++++++id: 1000048
++++++++++id: 1000049
++++++++++id: 1000050
++++++++++id: 1000051
++++++++++id: 1000052
++++++++++id: 1000053
++++++++++id: 1000054
++++++++++id: 1000055
++++++++++id: 1000056
++++++++++id: 1000057
++++++++++id: 1000058
++++++++++id: 1000059
++++++++++id: 1000060
++++++++++id: 1000061
++++++++++id: 1000062
++++++++++id: 1000063
++++++++++id: 1000064
++++++++++id: 1000065
++++++++++id: 1000066
++++++++++id: 1000067
++++++++++id: 1000068
++++++++++id: 1000069
++++++++++id: 1000070
++++++++++id: 1000071
++++++++++id: 1000072
++++++++++id: 1000073
++++++++++id: 1000074
++++++++++id: 1000075
++++++++++id: 1000076
++++++++++id: 1000077
++++++++++id: 1000078
++++++++++id: 1000079
++++++++++id: 1000080
++++++++++id: 1000081
++++++++++id: 1000082
++++++++++id: 1000083
++++++++++id: 1000084
++++++++++id: 1000085
++++++++++id: 1000086
++++++++++id: 1000087
++++++++++id: 1000088
++++++++++id: 1000089
++++++++++id: 1000090
++++++++++id: 1000091
++++++++++id: 1000092
++++++++++id: 1000093
++++++++++id: 1000094
++++++++++id: 1000095
++++++++++id: 1000096
++++++++++id: 1000097
++++++++++id: 1000098
++++++++++id: 1000099
++++++++++id: 1000100