{"id":32184650,"url":"https://github.com/ecocore-dev/celtuce","last_synced_at":"2025-10-21T23:55:19.420Z","repository":{"id":314268242,"uuid":"1054777100","full_name":"ecocore-dev/celtuce","owner":"ecocore-dev","description":"Clojure wrappers for Lettuce (Java Redis client)","archived":false,"fork":false,"pushed_at":"2025-10-13T11:33:01.000Z","size":321,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-21T23:55:13.772Z","etag":null,"topics":["asynchronous","clojure","lettuce","manifold","redis","redis-client","redis-cluster","redis-sentinel"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/ecocore-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-09-11T10:10:20.000Z","updated_at":"2025-10-14T19:21:24.000Z","dependencies_parsed_at":"2025-09-11T14:33:34.331Z","dependency_job_id":"6c9a8fbe-f696-40ec-a419-6347cbff41fa","html_url":"https://github.com/ecocore-dev/celtuce","commit_stats":null,"previous_names":["ecocore-dev/celtuce"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/ecocore-dev/celtuce","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecocore-dev%2Fceltuce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecocore-dev%2Fceltuce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecocore-dev%2Fceltuce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecocore-dev%2Fceltuce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ecocore-dev","download_url":"https://codeload.github.com/ecocore-dev/celtuce/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecocore-dev%2Fceltuce/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280354180,"owners_count":26316400,"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","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["asynchronous","clojure","lettuce","manifold","redis","redis-client","redis-cluster","redis-sentinel"],"created_at":"2025-10-21T23:55:12.498Z","updated_at":"2025-10-21T23:55:19.412Z","avatar_url":"https://github.com/ecocore-dev.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# celtuce\n\n\u003e **Note**: This is a fork of the original [celtuce library](https://github.com/lerouxrgd/celtuce) by lerouxrgd. \n\u003e The original repository has been archived, and this fork is maintained by [EcoCore Development](https://github.com/ecocore-dev) \n\u003e to continue development and support.\n\nAn idiomatic Clojure Redis client wrapping the Java client [Lettuce][].\n\n## Usage\n\nAdd to your `deps.edn`:\n```clojure\ndev.ecocore/celtuce {:mvn/version \"VERSION\"}\n```\n\nOr to your `project.clj`:\n```clojure\n[dev.ecocore/celtuce \"VERSION\"]\n```\n\n[![Clojars Project](https://img.shields.io/clojars/v/dev.ecocore/celtuce.svg)](https://clojars.org/dev.ecocore/celtuce) to include all [modules][].\n\nOr pick up only the ones you need:\n\n* [celtuce-core][]: Main module with all the core functionalities (required)\n\n  [![Clojars Project](https://img.shields.io/clojars/v/dev.ecocore/celtuce-core.svg)](https://clojars.org/dev.ecocore/celtuce-core)\n  [![cljdoc badge](https://cljdoc.org/badge/dev.ecocore/celtuce-core)](https://cljdoc.org/d/dev.ecocore/celtuce-core/CURRENT)\n\n* [celtuce-pool][]: Provides pooling for connections\n\n  [![Clojars Project](https://img.shields.io/clojars/v/dev.ecocore/celtuce-pool.svg)](https://clojars.org/dev.ecocore/celtuce-pool)\n  [![cljdoc badge](https://cljdoc.org/badge/dev.ecocore/celtuce-pool)](https://cljdoc.org/d/dev.ecocore/celtuce-pool/CURRENT)\n\n* [celtuce-manifold][]: Implementation of asynchronous commands based on [Manifold][]\n\n  [![Clojars Project](https://img.shields.io/clojars/v/dev.ecocore/celtuce-manifold.svg)](https://clojars.org/dev.ecocore/celtuce-manifold)\n  [![cljdoc badge](https://cljdoc.org/badge/dev.ecocore/celtuce-manifold)](https://cljdoc.org/d/dev.ecocore/celtuce-manifold/CURRENT)\n\n### Redis Connectors\n\nConnectors are available for both Redis `Server` and `Cluster`.\nThey are defined in `celtuce.connector` namespace of `celtuce-core` module.\n\n```clj\n(require '[celtuce.connector :as conn])\n\n(conn/redis-server \"redis://localhost:6379\")\n\n(conn/redis-cluster \"redis://localhost:30001\")\n```\n\nRedis URI synthax details can be found in [Lettuce Wiki][wiki-uri].\n\nSerialization defaults to [Nippy][], but other serializers are available in `celtuce.codec`.\nEspecially [Lettuce][] original `String` serializer can be used as follows:\n\n```clj\n(conn/redis-server\n  \"redis://localhost:6379\"\n  :codec (celtuce.codec/utf8-string-codec))\n```\n\nOther connector options:\n\n* `:conn-options` a map of connection options\n  * `:timeout` timeout for executing commands\n  * `:unit` corresponding `TimeUnit` in keyword (i.e. `:milliseconds`, etc)\n  * `:auto-flush` automatically flush commands on the underlying Netty connection\n\n* `:client-options`: a map of client options\n  * [Client-options][] available in Lettuce, with their names keywordized\n\nNote that you can find options default values in the [tests][tests-connector].\n\n### Redis Commands\n\nAll Redis [commands][] are implemented using protocols in `celtuce.commands` namespace of `celtuce-core` module.\n\n```clj\n(require '[celtuce.commands :as redis])\n```\n\n**Sync Commands**\n\n```clj\n(def connector (conn/redis-server \"redis://localhost:6379\"))\n(def cmds (conn/commands-sync connector))\n\n(redis/set cmds :foo \"bar\")\n(redis/get cmds :foo)\n\n(conn/shutdown connector)\n```\n\n**PubSub Commands**\n\nRedis prevents publishing and subscribing on the same connection.\nThe following contrive example demonstrates pubsub usage with two connections.\n\n```clj\n;; note that conn/as-pubsub also works on cluster connectors\n(def conn-pub (conn/as-pubsub (conn/redis-server \"redis://localhost:6379\")))\n(def conn-sub (conn/as-pubsub (conn/redis-server \"redis://localhost:6379\")))\n\n(def pub (conn/commands-sync conn-pub))\n(def sub (conn/commands-sync conn-sub))\n\n(conn/add-listener! \n conn-sub\n (reify redis/PubSubListener\n   (message [_ channel message]\n     (println \"received message\" message \"from channel\" channel))\n   (message [_ pattern channel message])\n   (subscribed [_ channel count]\n     (println \"new subscriber !\"))\n   (unsubscribed [_ channel count]\n     (println \"a subscriber left...\"))\n   (psubscribed [_ pattern count])\n   (punsubscribed [_ pattern count])))\n\n(redis/subscribe sub \"foo-chan\")\n(redis/publish pub \"foo-chan\" \"bar-msg\")\n(redis/unsubscribe sub \"foo-chan\")\n\n(conn/shutdown conn-pub)\n(conn/shutdown conn-sub)\n```\n\n**Dynamic Commands**\n\nStarting from Lettuce 5 it is now possible to define commands [dynamically][dynamic] by extending a `Commands` interface.\nSuch commands are obtained as follows.\n\n```clj\n(conn/commands-dynamic connector some.interface.extending.Commands)\n```\n\nYou can find basic examples in the tests.\n\n## Tests\n\nTo run unit tests you need to have both a redis server running on a `localhost:6379`,\nand a redis cluster running on `localhost:30001`.\n\nThen build artifacts and run tests:\n\n```sh\n(cd modules/celtuce-core/; lein do clean, install)\n(cd modules/celtuce-pool/; lein do clean, install)\n(cd modules/celtuce-manifold/; lein do clean, install)\n\nlein test\n```\n\n## License\n\n* [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0)\n\n[lettuce]: https://github.com/lettuce-io/lettuce-core\n[wiki-uri]: https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details#uri-syntax\n[client-options]: https://github.com/lettuce-io/lettuce-core/wiki/Client-options\n[dynamic]: https://github.com/lettuce-io/lettuce-core/wiki/Redis-Command-Interfaces\n\n[modules]: https://github.com/ecocore-dev/celtuce/tree/master/modules\n[commands]: https://github.com/ecocore-dev/celtuce/blob/master/modules/celtuce-core/src/celtuce/commands.clj\n[celtuce-core]: https://github.com/ecocore-dev/celtuce/tree/master/modules/celtuce-core\n[celtuce-pool]: https://github.com/ecocore-dev/celtuce/tree/master/modules/celtuce-pool\n[celtuce-manifold]: https://github.com/ecocore-dev/celtuce/tree/master/modules/celtuce-manifold\n[tests-connector]: https://github.com/ecocore-dev/celtuce/blob/master/test/celtuce/connector_test.clj\n\n[nippy]: https://github.com/ptaoussanis/nippy\n[manifold]: https://github.com/ztellman/manifold\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecocore-dev%2Fceltuce","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fecocore-dev%2Fceltuce","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecocore-dev%2Fceltuce/lists"}