README.md

# RedixClustered

Cluster support for Redix, and other stuff! Currently:

1. Very WIP
2. Needs documentation
3. The pipelines aren't smart enough to deal with keys on different nodes

Ported from some other PRX applications, and working to improve.

## Installation

Add `redix_clustered` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:redix_clustered, "~> 1.0.0"}
  ]
end
```

Then just add your cluster as a child of your application:

```elixir
children = [
  {RedixClustered, host: "127.0.0.1", port: 6379, namespace: "my-ns"}
]
```

Options you can pass to the RedixClustered spec:

- `host` the hostname or IP of your redis cluster (default `"127.0.0.1"`)
- `port` the port of your redis cluster (default `6379`)
- `username` passed to Redix
- `password` passed to Redix
- `timeout` passed to Redix
- `name` optional name used to access your cluster, and also the supervision [:name](https://hexdocs.pm/elixir/1.12/Supervisor.html#start_link/2)
- `namespace` optional prefix to add to your redis keys
- `pool_size` the number of Redix connections to establish per node (default `1`)
- `request_opts` optional Keyword list of options to pass to each `Redix.command` / `Redix.pipeline` call

And then you can run commands/pipelines:

```elixir
{:ok, _pid} = RedixClustered.start_link()
{:ok, _pid} = RedixClustered.start_link(name: :red2, namespace: "ns2")

RedixClustered.command(["set", "foo", "val1"])
# {:ok, "OK"}

RedixClustered.command(:red2, ["set", "foo", "val2"])
# {:ok, "OK"}

RedixClustered.command(["get", "foo"])
# {:ok, "val1"}

RedixClustered.command(:red2, ["get", "foo"])
# {:ok, "val2"}

RedixClustered.command(:red2, ["get", "ns2:foo"], namespace: false)
# {:ok, "val2"}
```

Or if you want to clone set commands to a 2nd redis cluster:

```elixir
clone = [host: "127.0.0.2", port: 6380, namespace: "ns2"]

children = [
  {RedixClustered, host: "127.0.0.1", namespace: "ns1", clone: clone}
]
```

## License

[MIT License](LICENSE)

## Contributing

1. Fork it
2. Create your feature branch (git checkout -b my-new-feature)
3. Commit your changes (git commit -am 'Add some feature')
4. Push to the branch (git push origin my-new-feature)
5. Create new Pull Request