{"id":15567068,"url":"https://github.com/kekingcn/spring-boot-klock-starter","last_synced_at":"2025-05-16T05:04:58.630Z","repository":{"id":45705505,"uuid":"115970930","full_name":"kekingcn/spring-boot-klock-starter","owner":"kekingcn","description":"基于redis的分布式锁组件，简单方便快捷接入项目，使项目拥有分布式锁能力","archived":false,"fork":false,"pushed_at":"2023-07-31T02:11:42.000Z","size":309,"stargazers_count":836,"open_issues_count":13,"forks_count":287,"subscribers_count":42,"default_branch":"master","last_synced_at":"2025-04-08T15:06:22.127Z","etag":null,"topics":["klock","lock","redis","redisson","spring","spring-boot","springboot"],"latest_commit_sha":null,"homepage":"https://gitee.com/kekingcn/spring-boot-klock-starter","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/kekingcn.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-02T03:30:56.000Z","updated_at":"2025-03-27T14:07:39.000Z","dependencies_parsed_at":"2024-10-29T17:38:10.762Z","dependency_job_id":null,"html_url":"https://github.com/kekingcn/spring-boot-klock-starter","commit_stats":{"total_commits":41,"total_committers":6,"mean_commits":6.833333333333333,"dds":0.5609756097560976,"last_synced_commit":"8700bc0f1512e501845c30127cdcb4c66c6aceea"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekingcn%2Fspring-boot-klock-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekingcn%2Fspring-boot-klock-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekingcn%2Fspring-boot-klock-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekingcn%2Fspring-boot-klock-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kekingcn","download_url":"https://codeload.github.com/kekingcn/spring-boot-klock-starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254471060,"owners_count":22076585,"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":["klock","lock","redis","redisson","spring","spring-boot","springboot"],"created_at":"2024-10-02T17:09:51.304Z","updated_at":"2025-05-16T05:04:58.606Z","avatar_url":"https://github.com/kekingcn.png","language":"Java","funding_links":[],"categories":["分布式开发"],"sub_categories":[],"readme":"# spring-boot-klock-starter\n基于redis的分布式锁spring-boot starter组件，使得项目拥有分布式锁能力变得异常简单，支持spring boot，和spirng mvc等spring相关项目\n\n\n# 快速开始\n\n\u003e spring boot项目接入\n\n\n1.添加klock starter组件依赖\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecn.keking\u003c/groupId\u003e\n    \u003cartifactId\u003espring-boot-klock-starter\u003c/artifactId\u003e\n    \u003cversion\u003e1.5-RELEASE\u003c/version\u003e\n\u003c/dependency\u003e\n\n```\n\n2.application.properties配置redis链接：`spring.klock.address=redis://127.0.0.1:6379`\n\n\n3.在需要加分布式锁的方法上，添加注解@Klock，如：\n```java\n@Service\npublic class TestService {\n\n    @Klock(waitTime = Long.MAX_VALUE)\n    public String getValue(String param) throws Exception {\n        if (\"sleep\".equals(param)) {//线程休眠或者断点阻塞，达到一直占用锁的测试效果\n            Thread.sleep(1000 * 50);\n        }\n        return \"success\";\n    }\n}\n\n```\n\n4.支持锁指定的业务key，如同一个方法ID入参相同的加锁，其他的放行。业务key的获取支持Spel，具体使用方式如下  \n![使用示例](./doc/img/使用示例.png \"使用示例.png\")\n\n\n\n\u003e spring mvc项目接入\n\n其他步骤和spring boot步骤一样，只需要spring-xx.xml配置中添加KlockAutoConfiguration类扫描即可，如：\n```xml\n\u003ccontext:component-scan base-package=\"org.springframework.boot.autoconfigure.klock.KlockAutoConfiguration\"/\u003e\n```\n\n# 使用参数说明\n\n\u003e 配置参数说明\n\n```properties\nspring.klock.address  : redis链接地址 如 redis://127.0.0.1:6379\nspring.klock.password : redis密码\nspring.klock.database : redis数据索引\nspring.klock.waitTime : 获取锁最长阻塞时间（默认：60，单位：秒）\nspring.klock.leaseTime: 已获取锁后自动释放时间（默认：60，单位：秒）\nspring.klock.cluster-server.node-addresses : redis集群配置 如 redis://127.0.0.1:7000,redis://127.0.0.1:7001,redis://127.0.0.1:7002\n#spring.klock.address 和 spring.klock.cluster-server.node-addresses 选其一即可\n```\n\u003e @Klock注解参数说明\n\n@Klock可以标注四个参数，作用分别如下  \nname：lock的name，对应redis的key值。默认为：类名+方法名  \nlockType：锁的类型，目前支持（可重入锁，公平锁，读写锁）。默认为：公平锁  \nwaitTime：获取锁最长等待时间。默认为：60s。同时也可通过spring.klock.waitTime统一配置  \nleaseTime：获得锁后，自动释放锁的时间。默认为：60s。同时也可通过spring.klock.leaseTime统一配置  \nlockTimeoutStrategy: 加锁超时的处理策略，可配置为不做处理、快速失败、阻塞等待的处理策略，默认策略为不做处理  \n\ncustomLockTimeoutStrategy: 自定义加锁超时的处理策略，需指定自定义处理的方法的方法名，并保持入参一致  \nreleaseTimeoutStrategy: 释放锁时，持有的锁已超时的处理策略，可配置为不做处理、快速失败的处理策略，默认策略为不做处理  \ncustomReleaseTimeoutStrategy: 自定义释放锁时，需指定自定义处理的方法的方法名，并保持入参一致\n\n# 锁超时说明\n因为基于redis实现分布式锁，如果使用不当，会在以下场景下遇到锁超时的问题：  \n![锁超时处理逻辑](./doc/img/锁超时处理逻辑.jpg \"锁超时处理逻辑.jpg\")\n\n加锁超时处理策略(**LockTimeoutStrategy**)：\n- **NO_OPERATION** 不做处理，继续执行业务逻辑\n- **FAIL_FAST** 快速失败，会抛出KlockTimeoutException\n- **KEEP_ACQUIRE** 阻塞等待，一直阻塞，直到获得锁，但在太多的尝试后，会停止获取锁并报错，此时很有可能是发生了死锁。\n- **自定义(customLockTimeoutStrategy)** 需指定自定义处理的方法的方法名，并保持入参一致，指定自定义处理方法后，会覆盖上述三种策略，且会拦截业务逻辑的运行。\n\n释放锁时超时处理策略(**ReleaseTimeoutStrategy**)：\n- **NO_OPERATION** 不做处理，继续执行业务逻辑\n- **FAIL_FAST** 快速失败，会抛出KlockTimeoutException\n- **自定义(customReleaseTimeoutStrategy)** 需指定自定义处理的方法的方法名，并保持入参一致，指定自定义处理方法后，会覆盖上述两种策略, 执行自定义处理方法时，业务逻辑已经执行完毕，会在方法返回前和throw异常前执行。\n\n**希望使用者清楚的意识到，如果没有对加锁超时进行有效设置，那么设置释放锁时超时处理策略是没有意义的。**\n\n*在测试模块中已集成锁超时策略的使用用例*\n# 关于测试\n工程test模块下，为分布式锁的测试模块。可以快速体验分布式锁的效果。\n\n# 使用登记\n如果这个项目解决了你的实际问题，可在 https://gitee.com/kekingcn/spring-boot-klock-starter/issues/IH4NE 登记下，如果节省了你的研发时间，也愿意支持下的话，可点击下方【捐助】请作者喝杯咖啡，也是非常感谢\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkekingcn%2Fspring-boot-klock-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkekingcn%2Fspring-boot-klock-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkekingcn%2Fspring-boot-klock-starter/lists"}