{"id":16178922,"url":"https://github.com/zhongxunking/sync","last_synced_at":"2025-03-19T01:30:52.497Z","repository":{"id":57738397,"uuid":"258155735","full_name":"zhongxunking/sync","owner":"zhongxunking","description":"Sync是一款分布式场景下基于Redis的安全高效的线程同步组件，提供分布式可重入互斥锁、分布式可重入读写锁、分布式信号量。提供相应注解，使用简单，可与spring-boot无缝集成。","archived":false,"fork":false,"pushed_at":"2022-10-08T09:43:30.000Z","size":188,"stargazers_count":12,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-28T13:46:02.874Z","etag":null,"topics":["distributed-lock","lock","read-write-lock","redis","semaphore","spring-boot"],"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/zhongxunking.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-23T09:32:12.000Z","updated_at":"2023-12-30T15:19:29.000Z","dependencies_parsed_at":"2023-01-19T15:47:44.005Z","dependency_job_id":null,"html_url":"https://github.com/zhongxunking/sync","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongxunking%2Fsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongxunking%2Fsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongxunking%2Fsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongxunking%2Fsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhongxunking","download_url":"https://codeload.github.com/zhongxunking/sync/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243958055,"owners_count":20374788,"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":["distributed-lock","lock","read-write-lock","redis","semaphore","spring-boot"],"created_at":"2024-10-10T05:24:53.774Z","updated_at":"2025-03-19T01:30:52.263Z","avatar_url":"https://github.com/zhongxunking.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sync\n\n1. 简介\n\u003e Sync是一款分布式场景下基于Redis的安全高效的线程同步组件，提供分布式可重入互斥锁、分布式可重入读写锁、分布式信号量。提供相应注解，使用简单，可与spring-boot无缝集成。\n\n\u003e 本组件已经上传到[Maven中央库](https://search.maven.org/search?q=org.antframework.sync)\n\n2. 环境要求\n\u003e * JDK1.8及以上\n\n3. 技术支持\n\n\u003e 欢迎加我微信（zhong_xun_）入群交流。\u003cbr/\u003e\n\u003cimg src=\"https://note.youdao.com/yws/api/personal/file/WEB6b849e698db2a635b43eba5bc949ce1c?method=download\u0026shareKey=27623320b5ca82cbf768b61130c81de0\" width=150 /\u003e\n\n## 1. 将Sync引入进你的系统\n通过引入Maven依赖和进行少量配置即可将Sync引入进你的系统。\n\n### 1.1 引入Maven依赖\nSync支持SpringBoot v2.x，也支持SpringBoot v1.x\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.antframework.sync\u003c/groupId\u003e\n    \u003cartifactId\u003esync\u003c/artifactId\u003e\n    \u003cversion\u003e1.2.0\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n    \u003cartifactId\u003espring-boot-starter-data-redis\u003c/artifactId\u003e\n    \u003cversion\u003e${spring-boot版本}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 1.2 配置\n在application.properties或application.yaml中配置Redis和Sync\n```properties\n# 必填：命名空间（也可以通过ant.sync.namespace配置）\nspring.application.name=customer    #这里使用customer（会员系统）作为举例\n\n# 必填：配置Redis（Cache采用的是spring-boot原生的Redis，所以原生的所有Redis配置都有效，以下以最简洁的配置举例）\n# Redis单例模式\nspring.redis.host=192.168.0.1\nspring.redis.port=6379\n# Redis集群模式\n#spring.redis.cluster.nodes=192.168.0.1:6379,192.168.0.2:6379,192.168.0.3:6379\n# Redis哨兵模式\n#spring.redis.sentinel.master=mymaster\n#spring.redis.sentinel.nodes=192.168.0.1:26379,192.168.0.2:26379,192.168.0.3:26379\n\n\n# 以下配置均是选填配置，使用方一般使用默认配置即可，无需自定义配置\n# 选填：是否启用Sync（true为启用，false为不启用；默认启用）\nant.sync.enable=true\n# 选填：等待同步消息的最长时间（毫秒，默认为10秒）\nant.sync.max-wait-time=10000\n# 选填：服务端类型（默认为redis）（sync还提供local模式，可以不依赖Redis，这种模式只对单个应用实例起效果，无法用在分布式场景）\nant.sync.server-type=redis\n# 选填：发生异常时Redis中数据的存活时长（毫秒，默认为10分钟）\nant.sync.redis.live-time=600000\n# 选填：@Semaphore注解使用的许可总数，通过ant.sync.semaphore.key-total-permits.${key}=${许可总数}的形式对key的许可总数进行配置\nant.sync.semaphore.key-total-permits.trade-123=100\nant.sync.semaphore.key-total-permits.trade-456=200\n# 选填：@Lock、@ReadLock、@WriteLock、@Semaphore的AOP执行的优先级（默认为Ordered.LOWEST_PRECEDENCE - 10，默认比@Transactional先执行）\nant.sync.aop-order=2147483637\n```\n\n## 2. 使用sync\n提供两种使用sync方式：\n- 通过SyncContext使用\n- 通过注解使用\n\n### 2.1 通过SyncContext使用\n使用sync前需先获取SyncContext：\n```java\n@Autowired\nprivate SyncContext syncContext;\n```\n\n#### 2.1.1 分布式可重入互斥锁\n```java\n// 传入锁的标识（比如：trade-123）就可获取对应的锁\nLock lock= syncContext.getLockContext().getLock(\"trade-123\");\nlock.lock();        // 加锁\ntry{\n    // TODO 具体业务逻辑\n}finally {\n    lock.unlock();  // 解锁\n}\n```\n\n#### 2.1.2 分布式可重入读写锁\n- 读锁\n```java\n// 传入锁的标识（比如：trade-123）就可获取对应的锁\nReadWriteLock rwLock=syncContext.getLockContext().getRWLock(\"trade-123\");\nrwLock.readLock().lock();       // 加读锁\ntry {\n    // TODO 具体业务逻辑\n}finally {\n    rwLock.readLock().unlock(); // 解读锁\n}\n```\n- 写锁\n```java\n// 传入锁的标识（比如：trade-123）就可获取对应的锁\nReadWriteLock rwLock=syncContext.getLockContext().getRWLock(\"trade-123\");\nrwLock.writeLock().lock();       // 加写锁\ntry {\n    // TODO 具体业务逻辑\n}finally {\n    rwLock.writeLock().unlock(); // 解写锁\n}\n```\n\n#### 2.1.3 分布式信号量\n```java\n// 传入信号量的标识（比如：trade-abc）就可获取对应的信号量，同时需指定分布式环境下总的可用许可数（比如：100）\nSemaphore semaphore=syncContext.getSemaphoreContext().getSemaphore(\"trade-123\", 100);\nsemaphore.acquire(5);       // 获取5个许可\ntry {\n    // TODO 具体业务逻辑\n}finally {\n    semaphore.release(5);   // 释放5个许可\n}\n```\n\n### 2.2 通过注解使用\n\n#### 2.2.1 分布式可重入互斥锁\n```java\n@org.springframework.stereotype.Service\npublic class TradeService {\n    @Lock(key = \"#tradeId\")     // key是锁的标识。进入方法前加锁，退出方法后解锁\n    public Trade createTrade(String tradeId){\n        // TODO 具体业务逻辑\n    }\n}\n```\n\n#### 2.2.2 分布式可重入读写锁\n- 读锁\n```java\n@org.springframework.stereotype.Service\npublic class TradeService {\n    @ReadLock(key = \"#tradeId\")     // key是锁的标识。进入方法前加锁，退出方法后解锁\n    public Trade findTrade(String tradeId){\n        // TODO 具体业务逻辑\n    }\n}\n```\n- 写锁\n```java\n@org.springframework.stereotype.Service\npublic class TradeService {\n    @WriteLock(key = \"#trade.tradeId\")  // key是锁的标识。进入方法前加锁，退出方法后解锁\n    public void updateTrade(Trade trade){\n        // TODO 具体业务逻辑\n    }\n}\n```\n\n#### 2.2.3 分布式信号量\n```java\n@org.springframework.stereotype.Service\npublic class TradeService {\n    // 总许可数通过ant.sync.semaphore.key-total-permits.trade-abc=100配置（这里指定分布式环境下trade-abc的总许可数为100）\n    @Semaphore(key = \"#name\", permits = 5)  //  key是信号量的标识。进入方法前获取5个许可，退出方法后释放5个许可\n    public void doBiz(String name){\n        // TODO 具体业务逻辑\n    }\n}\n```\n\n## 3. 扩展性\nSync本身提供基于Redis和Local两种实现，同时具备灵活的扩展性。如果你想基于Zookeeper来实现，则可以实现org.antframework.sync.extension.Server接口；如果你想基于Redis实现，但又不想使用spring-data-redis提供的org.springframework.data.redis.connection.RedisConnectionFactory，则可以实现org.antframework.sync.extension.redis.extension.RedisExecutor接口。\n\n扩展时可以参考：org.antframework.sync.extension.redis.RedisServer、org.antframework.sync.extension.local.LocalServer、org.antframework.sync.extension.redis.extension.springdataredis.SpringDataRedisExecutor\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhongxunking%2Fsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhongxunking%2Fsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhongxunking%2Fsync/lists"}