https://github.com/andrewarrow/rock
Redis Orchestration of Cluster Konnections
https://github.com/andrewarrow/rock
elasticcache golang redis redis-client redis-cluster
Last synced: about 1 month ago
JSON representation
Redis Orchestration of Cluster Konnections
- Host: GitHub
- URL: https://github.com/andrewarrow/rock
- Owner: andrewarrow
- License: mit
- Created: 2024-02-13T17:51:15.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-03-02T13:47:12.000Z (over 2 years ago)
- Last Synced: 2025-07-26T09:12:14.087Z (11 months ago)
- Topics: elasticcache, golang, redis, redis-client, redis-cluster
- Language: Go
- Homepage: https://andrewarrow.dev/
- Size: 29.3 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# rock
Redis Orchestration of Cluster Konnections
```
ip := os.Getenv("REDIS_CLUSTER_IP")
port := os.Getenv("REDIS_CLUSTER_PORT")
poolSize := 2
c := cluster.NewClient(poolSize, ip, port)
c.ConnectAll()
r := c.Info()
fmt.Println(r)
c.Set("test", "foo")
c.Get("test")
```
# why not goredis
I could not get goredis poolsize configs to work for me.
This is a very simple thread-safe redis cluster client.
# how it works
```
type Client struct {
mu sync.Mutex
rip string
connections []*ClientConnection
}
```
A client has a pool of N *ClientConnections.
```
type ClientConnection struct {
hosts map[string]net.Conn
target string
buffer []byte
}
```
Each ClientConnection has a map of redis node hostname+port and the
current "target" it just connected to after the last MOV.
For example:
```
hosts["127.0.0.1:30001"] = conn1
hosts["127.0.0.1:30002"] = conn2
```
When it gets a MOV response with 127.0.0.1:30003 and 127.0.0.1:30003 is not
in the map of hosts, it will connect and add it:
hosts["127.0.0.1:30003"] = conn3
# calling commands
You can make calls like:
```
c.Set("test", "foo")
c.Get("test")
c.SAdd("foo", "bar")
c.SMembers("foo")
c.SRem("foo", "bar")
```
And they are thread safe because;
```
cc := c.TakeFromPool()
defer c.PlaceBackInPool(cc)
```
Before each command it gets its own ClientConnection from the pool
and is the only one using that ClientConnection until it returns it.