{"id":15521897,"url":"https://github.com/crossoverjie/distributed-redis-tool","last_synced_at":"2025-05-16T19:04:12.920Z","repository":{"id":31379369,"uuid":"127009339","full_name":"crossoverJie/distributed-redis-tool","owner":"crossoverJie","description":"🔒A simple distributed tools based on Redis.","archived":false,"fork":false,"pushed_at":"2022-12-16T06:32:18.000Z","size":110,"stargazers_count":613,"open_issues_count":11,"forks_count":306,"subscribers_count":38,"default_branch":"master","last_synced_at":"2025-04-03T19:14:14.602Z","etag":null,"topics":["distributed-limiting","distributed-lock","java","redis"],"latest_commit_sha":null,"homepage":"https://crossoverjie.top/tags/Distributed-Lock/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crossoverJie.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":"2018-03-27T15:37:39.000Z","updated_at":"2025-02-22T15:36:01.000Z","dependencies_parsed_at":"2023-01-14T19:01:14.255Z","dependency_job_id":null,"html_url":"https://github.com/crossoverJie/distributed-redis-tool","commit_stats":null,"previous_names":["crossoverjie/distributed-lock-redis"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossoverJie%2Fdistributed-redis-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossoverJie%2Fdistributed-redis-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossoverJie%2Fdistributed-redis-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossoverJie%2Fdistributed-redis-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crossoverJie","download_url":"https://codeload.github.com/crossoverJie/distributed-redis-tool/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248607217,"owners_count":21132495,"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-limiting","distributed-lock","java","redis"],"created_at":"2024-10-02T10:38:27.589Z","updated_at":"2025-04-12T17:40:13.621Z","avatar_url":"https://github.com/crossoverJie.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# distributed-redis-tool\n\n[![Build Status](https://travis-ci.org/crossoverJie/distributed-redis-tool.svg?branch=master)](https://travis-ci.org/crossoverJie/distributed-redis-tool)\n[![codecov](https://codecov.io/gh/crossoverJie/distributed-redis-tool/branch/master/graph/badge.svg)](https://codecov.io/gh/crossoverJie/distributed-redis-tool)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/top.crossoverjie.opensource/distributed-redis-tool/badge.svg)](https://maven-badges.herokuapp.com/maven-central/top.crossoverjie.opensource/distributed-redis-tool/)\n[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-787381170-yellowgreen.svg)](https://jq.qq.com/?_wv=1027\u0026k=5HPYvQk)\n[![](https://badge.juejin.im/entry/5ae3d0c56fb9a07aae14ea59/likes.svg?style=flat-square)](https://juejin.im/post/5ae3d08b6fb9a07a9e4cf71c)\n\n\nThis is a simple distributed tools based on Redis.\n\n\n## Distributed lock\n\n* [Features](https://github.com/crossoverJie/distributed-redis-tool#features)\n* [Non-blocking lock](https://github.com/crossoverJie/distributed-redis-tool#non-blocking-lock)\n* [Blocking lock API](https://github.com/crossoverJie/distributed-redis-tool#blocking-lock)\n* [Blocking lock, Custom block time](https://github.com/crossoverJie/distributed-redis-tool#blocking-lock-custom-block-time)\n\n\n## Distributed limiting\n\n* [Features](https://github.com/crossoverJie/distributed-redis-tool#features-1)\n* [Native API](https://github.com/crossoverJie/distributed-redis-tool#native-api)\n* [@CommonLimit API](https://github.com/crossoverJie/distributed-redis-tool#commonlimit)\n* [@SpringControllerLimit](https://github.com/crossoverJie/distributed-redis-tool#springcontrollerlimit)\n\n\n\nVisit this [website](https://www.google.com/search?newwindow=1\u0026ei=SdjjWu3XKYXSU_SKgIgH\u0026q=Distributed+site%3AcrossoverJie.top\u0026oq=Distributed+site%3AcrossoverJie.top\u0026gs_l=psy-ab.3...9719.30867.0.31049.47.33.7.0.0.0.519.5126.4-11j1.12.0....0...1.1j4.64.psy-ab..31.0.0....0.ltPqVipC_iE) for more information.\n\n\n## ChangeLog\n\n### v1.0.5\n- Fixed [#9](https://github.com/crossoverJie/distributed-redis-tool/issues/9).\n- Optimization RedisCluster.\n\n### v1.0.4\n- Upgrade distributed lock API.\n- Support connection pool.\n- Improve distributed lock performance :zap:.\n\n### v1.0.3\n\n- Upgrade API.\n- Add Anation.\n- Improve performance :zap: .\n\n\n## Contact\n\nMail: crossoverJie@gmail.com\n\n![](https://ws2.sinaimg.cn/large/006tKfTcly1fsa01u7ro1j30gs0howfq.jpg)\n\n\n## Distributed lock\n\n### Features\n\n- [x] High performance.\n- [x] No deadlock.\n- [x] Support Redis cluster, single.\n- [x] Non-blocking lock.\n- [x] blocking lock.\n- [x] Support connection pool.\n- [x] Suppport Spring4.x+.\n\n\n### Quick start\n\n\n\nmaven dependency:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003etop.crossoverjie.opensource\u003c/groupId\u003e\n    \u003cartifactId\u003edistributed-redis-tool\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.4\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nSet bean:\n\n```java\n@Configuration\npublic class RedisLockConfig {\n    private Logger logger = LoggerFactory.getLogger(RedisLockConfig.class);\n    \n    \n    @Autowired\n    private JedisConnectionFactory jedisConnectionFactory;\n    \n    @Bean\n    public RedisLock build() {\n        RedisLock redisLock = new RedisLock.Builder(jedisConnectionFactory,RedisToolsConstant.SINGLE)\n                .lockPrefix(\"lock_\")\n                .sleepTime(100)\n                .build();\n\n        return redisLock;\n    }\n}\n\n```\n\n#### Non-blocking lock:\n\n```java\n    @Autowired\n    private RedisLock redisLock ;\n\n    public void use() {\n        String key = \"key\";\n        String request = UUID.randomUUID().toString();\n        try {\n            boolean locktest = redisLock.tryLock(key, request);\n            if (!locktest) {\n                System.out.println(\"locked error\");\n                return;\n            }\n\n\n            //do something\n\n        } finally {\n            redisLock.unlock(key,request) ;\n        }\n\n    }\n\n```\n\n#### Blocking lock\n\n```java\nredisLock.lock(String key, String request);\n```\n\n#### Blocking lock, Custom block time\n\n```java\nredisLock.lock(String key, String request,int blockTime);\n```\n\n\n----\n\n## Distributed limiting\n### Features\n\n- [x] High performance.\n- [x] native API.\n- [x] Annation API.\n- [x] Support Redis cluster, single.\n- [x] Suppport Spring4.x+\n\n\n### Quick start\n\nmaven dependency:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003etop.crossoverjie.opensource\u003c/groupId\u003e\n    \u003cartifactId\u003edistributed-redis-tool\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.4\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n1. Set bean:\n\n```java\n@Configuration\npublic class RedisLimitConfig {\n    private Logger logger = LoggerFactory.getLogger(RedisLimitConfig.class);\n    \n    @Value(\"${redis.limit}\")\n    private int limit;\n    \n    @Autowired\n    private JedisConnectionFactory jedisConnectionFactory;\n    \n    @Bean\n    public RedisLimit build() {\n        RedisLimit redisLimit = new RedisLimit.Builder(jedisConnectionFactory, RedisToolsConstant.SINGLE)\n                .limit(limit)\n                .build();\n        return redisLimit;\n    }\n}\n```\n\n2. Scan packages.\n\n```java\n@ComponentScan(value = \"com.crossoverjie.distributed.intercept\")\n\n# RedisLimitConfig's package\n@ComponentScan(value = \"xx.xxx.config\")\n```\n\n#### Native API:\n\n```java\n  \t\n    boolean limit = redisLimit.limit();\n    if (!limit){\n        res.setCode(StatusEnum.REQUEST_LIMIT.getCode());\n        res.setMessage(StatusEnum.REQUEST_LIMIT.getMessage());\n        return res ;\n    }\n```\n\nOther apis:\n\n#### @CommonLimit\n\n```java\n@CommonLimit\n@RequestMapping(\"/xx\")\npublic void anyMethod(){}\n```\n\n#### @SpringControllerLimit\n\nIf you are using native Spring:\n\n```java\n    @SpringControllerLimit(errorCode = 200,errorMsg = \"request has limited\")\n    @RequestMapping(\"/createOptimisticLimitOrderByRedis/{sid}\")\n    @ResponseBody\n    public String createOptimisticLimitOrderByRedis(@PathVariable int sid) {\n        logger.info(\"sid=[{}]\", sid);\n        int id = 0;\n        try {\n            id = orderService.createOptimisticOrderUseRedis(sid);\n        } catch (Exception e) {\n            logger.error(\"Exception\",e);\n        }\n        return String.valueOf(id);\n    }\n```\n\nSpring xml:\n\n```xml\n   \u003cmvc:interceptors\u003e\n        \u003cmvc:interceptor\u003e\n            \u003cmvc:mapping path=\"/**\"/\u003e \n            \u003cbean class=\"com.crossoverjie.distributed.intercept.SpringMVCIntercept\"/\u003e\n        \u003c/mvc:interceptor\u003e\n    \u003c/mvc:interceptors\u003e\n```\n\n\nIt can be used for any methods.\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossoverjie%2Fdistributed-redis-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrossoverjie%2Fdistributed-redis-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossoverjie%2Fdistributed-redis-tool/lists"}