{"id":13641941,"url":"https://github.com/eleme/corvus","last_synced_at":"2025-06-12T04:40:53.798Z","repository":{"id":2689466,"uuid":"44510575","full_name":"eleme/corvus","owner":"eleme","description":"A fast and lightweight Redis Cluster Proxy for Redis 3.0","archived":false,"fork":false,"pushed_at":"2022-05-26T09:23:26.000Z","size":712,"stargazers_count":788,"open_issues_count":17,"forks_count":143,"subscribers_count":72,"default_branch":"master","last_synced_at":"2025-04-20T12:40:48.637Z","etag":null,"topics":["c","corvus","proxy","redis","redis-cluster","twemproxy"],"latest_commit_sha":null,"homepage":"","language":"C","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/eleme.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":"2015-10-19T04:07:58.000Z","updated_at":"2025-02-08T13:19:19.000Z","dependencies_parsed_at":"2022-09-14T03:31:09.558Z","dependency_job_id":null,"html_url":"https://github.com/eleme/corvus","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/eleme/corvus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleme%2Fcorvus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleme%2Fcorvus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleme%2Fcorvus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleme%2Fcorvus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eleme","download_url":"https://codeload.github.com/eleme/corvus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleme%2Fcorvus/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259400459,"owners_count":22851816,"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":["c","corvus","proxy","redis","redis-cluster","twemproxy"],"created_at":"2024-08-02T01:01:25.924Z","updated_at":"2025-06-12T04:40:53.791Z","avatar_url":"https://github.com/eleme.png","language":"C","readme":"Corvus\n======\n\n[![Build Status](https://travis-ci.org/eleme/corvus.svg)](https://travis-ci.org/eleme/corvus)\n\nCorvus is a fast and lightweight redis cluster proxy for redis 3.0 with cluster mode enabled.\n\nWhy\n---\n\nMost redis client implementations don't support redis cluster. We have a lot of services relying\non redis, which are written in Python, Java, Go, Nodejs etc. It's hard to provide redis client\nlibraries for multiple languages without breaking compatibilities. We used [twemproxy](https://github.com/twitter/twemproxy)\nbefore, but it relies on sentinel for high availabity, it also requires restarting to add or\nremove backend redis instances, which causes service interruption. And twemproxy is single\nthreaded, we have to deploy multiple twemproxy instances for large number of clients, which\ncauses the sa headaches.\n\nTherefore, we made corvus.\n\nFeatures\n--------\n\n* Fast.\n* Lightweight.\n* Painless upgrade to official redis cluster from twemproxy.\n* Multiple threading.\n* Reuseport support.\n* Pipeline support.\n* Statsd integration.\n* Syslog integration.\n* Can direct read operations to slaves.\n\nPerformance\n------------\n\nSee details in our [test results](docs/lpt.md).\n\nRequirements\n------------\n\n* Linux \u003e= 3.9\n* Redis \u003c= 3.0.7 (For version up to/including 0.2.3)\n\nBuild\n-----\n\nIf use the releases downloaded from\n[releases page](https://github.com/eleme/corvus/releases), just make:\n\n```\n$ make\n```\n\nWith debug mode enabled:\n\n```\nmake debug\n```\n\nIf build from latest source:\n```bash\ngit clone https://github.com/eleme/corvus.git\ncd corvus\ngit submodule update --init\nmake deps # need autoconf\nmake\n```\n\nBinary can be found at `./src/corvus`.\n\nConfiguration\n-------------\n\nExample configuration file is at [corvus.conf](corvus.conf).\n\nUsage\n-----\n\n```bash\n$ ./src/corvus path/to/corvus.conf\n```\n\nCommands\n--------\n\n* All single-key commands (like `SET`, `GET`, `INCR`..) are supported.\n* Batch commands are split into multiple single-key commands.\n* Commands performing complex multi-key operations like unions or intersections\n   are available as well as long as the keys all belong to the same node.\n\n#### Modified commands\n\n* `MGET`: split to multiple `GET`.\n* `MSET`: split to multiple `SET`.\n* `DEL`: split to multiple single key `DEL`.\n* `EXISTS`: split to multiple single key `EXISTS`.\n* `PING`: ignored and won't be forwarded.\n* `INFO`, `TIME`: won't be forwarded to backend redis, information collected in proxy\n   will be returned.\n* `SLOWLOG`: return the slowlogs saved by corvus itself. Note that unlike redis,\n   in the slowlog entry there's an additional `remote latency` field before\n   the `total latency` field. The slowlog will also log the slowest\n   sub command for multiple-key commands: `MGET`, `MSET`, `DEL`, `EXISTS`.\n   The total latency of sub cmd entry will just be the same as its parent cmd.\n* `AUTH`: do authentication in proxy.\n* `CONFIG`: support `get`, `set`, and `rewrite` sub-command to retrieve and manipulate corvus config.\n* `SELECT`: ignored if index is `0`, won't be forwarded.\n\n#### Restricted commands\n\n* `EVAL`: at least one key should be given. If there are multiple keys, all of\n   them should belong to the same node.\n\nThe following commands require all argument keys to belong to the same redis node:\n\n* `SORT`.\n* `RPOP`, `LPUSH`.\n* `SDIFF`, `SDIFFSTORE`, `SINTER`, `SINTERSTORE`, `SMOVE`, `SUNION`, `SUNIONSTORE`.\n* `ZINTERSTORE`, `ZUNIONSTORE`.\n* `PFCOUNTE`, `PFMERGE`.\n\n#### Unsupported commands\n\nThe following commands are not available, such as `KEYS`, we can't search keys across\nall backend redis instances.\n\n* `KEYS`, `MIGRATE`, `MOVE`, `OBJECT`, `RANDOMKEY`, `RENAME`, `RENAMENX`, `SCAN`, `WAIT`.\n* `BITOP`, `MSETNX`\n* `BLPOP`, `BRPOP`, `BRPOPLPUSH`.\n* `PSUBSCRIBE`, `PUBLISH`, `PUBSUB`, `PUNSUBSCRIBE`, `SUBSCRIBE`, `UNSUBSCRIBE`.\n* `EVALSHA`, `SCRIPT`.\n* `DISCARD`, `EXEC`, `MULTI`, `UNWATCH`, `WATCH`.\n* `CLUSTER`.\n* `ECHO`, `QUIT`.\n* `BGREWRITEAOF`, `BGSAVE`, `CLIENT`, `COMMAND`, `CONFIG`, `DBSIZE`, `DEBUG`, `FLUSHALL`,\n   `FLUSHDB`, `LASTSAVE`, `MONITOR`, `ROLE`, `SAVE`, `SHUTDOWN`, `SLAVEOF`, `SYNC`.\n\nLicense\n-------\n\nMIT. Copyright (c) 2016 Eleme Inc.\n\nSee [LICENSE](LICENSE) for details.\n","funding_links":[],"categories":["C"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feleme%2Fcorvus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feleme%2Fcorvus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feleme%2Fcorvus/lists"}