{"id":14973048,"url":"https://github.com/power4j/sequence","last_synced_at":"2025-10-26T20:32:29.747Z","repository":{"id":39236986,"uuid":"276856487","full_name":"power4j/sequence","owner":"power4j","description":"java sequence util ,hight performance ,lock free.work with mysql,postgresql,redis,mongodb.","archived":false,"fork":false,"pushed_at":"2024-11-04T00:46:29.000Z","size":1726,"stargazers_count":17,"open_issues_count":10,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-01T00:26:32.126Z","etag":null,"topics":["sequence","spring","springboot","utils"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/power4j.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2020-07-03T09:07:04.000Z","updated_at":"2024-11-01T08:56:09.000Z","dependencies_parsed_at":"2023-01-31T02:31:12.658Z","dependency_job_id":"66c71825-2bc0-4b9f-9170-2b527bbdd8ed","html_url":"https://github.com/power4j/sequence","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/power4j%2Fsequence","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/power4j%2Fsequence/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/power4j%2Fsequence/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/power4j%2Fsequence/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/power4j","download_url":"https://codeload.github.com/power4j/sequence/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238397235,"owners_count":19465140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["sequence","spring","springboot","utils"],"created_at":"2024-09-24T13:48:00.494Z","updated_at":"2025-10-26T20:32:24.060Z","avatar_url":"https://github.com/power4j.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JAVA 序号工具包 Sequence\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/bad24df7d1364e1bbbfea77f3378ad1a)](https://app.codacy.com/gh/power4j/sequence?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=power4j/sequence\u0026utm_campaign=Badge_Grade_Dashboard)\n[![codecov](https://codecov.io/gh/power4j/sequence/branch/master/graph/badge.svg)](https://codecov.io/gh/power4j/sequence)\n[![travis-ci](https://travis-ci.org/power4j/sequence.svg)](https://travis-ci.org/github/power4j/sequence)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.power4j.kit/sequence/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.power4j.kit/sequence)\n\n使用场景\n\n- 业务需要根据一定的规则生成序号，如：\n  - 连续性：序号连续自增地进行分配\n  - 相关性：多租户隔离、按年、月、日分区\n  - 格式化: 序号输出的格式灵活可控\n- 技术上需要满足\n  - 高性能\n  - 线程安全\n  - 适用性好\n  - 配置简单、容易集成\n  \n  \n## 项目说明\n\n- ***JDK 版本要求: `JDK 11+`*** \n\n- 支持的后端\n  - MySQL\n  - PostgreSQL (`9.6 +`)\n  - Redis\n  - MongoDB\n  - H2(MySQL兼容模式)\n\n\n## 核心概念\n\n- 号池([`SeqPool`](sequence-core/src/main/java/com/power4j/kit/seq/core/SeqPool.java)): 一种设施，可以提供有限或者无限的序号。\n- 同步器([`SeqSynchronizer`](sequence-core/src/main/java/com/power4j/kit/seq/persistent/SeqSynchronizer.java)): 负责与某种后端(如数据库)交互,更新序号的当前值。\n- 取号器([`SeqHolder`](sequence-core/src/main/java/com/power4j/kit/seq/persistent/SeqHolder.java)): 负责缓存从后端批量取出的序号，然后交给本地的号池来管理。\n- 分区(`Partition`): 后端存储在保存序号信息时，序号的名称+分区表示一条唯一的记录,分区可以是静态的(一个字符串常量),也可以是动态分区(一个返回分区名称的函数)。分区并不是将序号的取值进行划分，主要是用于多租户等需要二次分类的场景以及避免号池耗尽。\n- 格式化接口([`SeqFormatter`](sequence-core\\src\\main\\java\\com\\power4j\\kit\\seq\\core\\SeqFormatter.java)): 自定义格式输出的扩展接口.\n\n注意事项:\n- 如果使用动态分区,不宜变化过于频繁，比如用系统时间作为分区。比较合适的是按年份、月份进行分区。\n- 每一个分区的序号取值独立的，比如按年份进行分区，那么每年都有`Long.MAX`个序号可用。\n\n## 使用方法\n\n\n引入依赖\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.power4j.kit\u003c/groupId\u003e\n    \u003cartifactId\u003esequence-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e最新版本\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n开启配置(JDBC)\n```yaml\npower4j:\n  sequence:\n    # 数据同步使用的后端支持(如: mysql,oracle,redis),跟你实际使用的数据源类型对应\n    backend: mysql\n```\n\n也可以使用Redis，则配置方式为\n\n```yaml\npower4j:\n  sequence:\n    backend: redis\n    lettuce-uri: \"redis://127.0.0.1\"\n```\n\n\u003e `maven`依赖等详细配置请查看`examples`目录下的演示项目\n\n使用\n\n```java\n@RestController\n@SpringBootApplication\npublic class SequenceExampleApplication {\n    @Autowired\n    private Sequence\u003cLong\u003e sequence;\n    public static void main(String[] args) {\n        SpringApplication.run(SequenceExampleApplication.class, args);\n    }\n\n    @GetMapping(\"/seq\")\n    public List\u003cString\u003e getSequence(@RequestParam(required = false) Integer size) {\n        size = (size == null || size \u003c= 0) ? 10 : size;\n        List\u003cString\u003e list = new ArrayList\u003c\u003e(size);\n        for (int i = 0; i \u003c size; ++i) {\n            list.add(sequence.nextStr());\n        }\n        return list;\n    }\n}\n```\n\n## 自定义配置\n\n例子: [SeqConfig.java](examples/jdbc-example/src/main/java/com/power4j/sequence/example/SeqConfig.java)\n\n## 性能测试\n\n\u003cimg src=\"docs/assets/img/bench.png\"/\u003e\n\n\u003e 测试环境用的Redis,MySQL等外部服务都是默认安装，没有调整参数。\n\u003e\n\u003e 如果需要自己测试，已经为你写好测试脚本,见[run-bench.sh](bench-test/run-bench.sh)\n\n\n## 效果演示\n\n### 分配10个序号\n![seq10](docs/assets/img/get10.png)\n\n### 数据库中的记录\n![seq-table](docs/assets/img/seq-table.png)\n\n### Redis中的记录\n![seq-redis](docs/assets/img/seq-redis.png)\n\n## 开发计划\n\n - [X] 支持MySQL(`1.0`)\n - [X] 支持PostgreSQL(`1.3`)\n - [X] 支持H2(`1.5`MySQL兼容模式)\n - [ ] 支持Oracle(不一定会支持,这货没有开源版本)\n - [x] 支持Redis(`1.1`)\n - [x] 支持MongoDB(`1.2`)\n - [X] Spring Boot 集成(`1.0`)\n\n ## 贡献指南\n\n 代码要求：\n  - 统一风格，包含注释、代码缩进等与本项目保持一致\n  - 保持代码整洁，比如注释掉的代码块等垃圾代码应该删除\n  - 严格控制外部依赖，如果没有必要，请不要引入外部依赖\n  - 请在类注释中保留你的作者信息，请不要害羞\n\n ### 数据库支持实现\n\n 1. 参考[`MySqlSynchronizer`](sequence-core/src/main/java/com/power4j/kit/seq/persistent/provider/MySqlSynchronizer.java)的实现方式，实现某个特定数据库后端的支持\n 2. 参考[`MySqlSynchronizerTest`](sequence-core/src/test/java/com/power4j/kit/seq/persistent/provider/MySqlSynchronizerTest.java) 编写单元测试，完成自测。如果你的代码能跑通测试，基本上应该没有严重bug\n\n\n\n## Special Thanks\n\n- [JetBrains Developer Toolbox](https://www.jetbrains.com/?from=sequence)\n\n\n ## 联系方式\n \n\n ![weichat](docs/assets/img/wei-chat.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpower4j%2Fsequence","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpower4j%2Fsequence","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpower4j%2Fsequence/lists"}