redix
is a very simplekey => value
storage engine that speaks redis and even more simpler and flexible.
redis
is very simple, sometimes we abuse it, so I decided to build a purekey-value
storage system that introduces the core utilities for building any data structure you want based on thekey => value
model that is because I think that everything could be modeled easily using that model, so I decided to not to follow redis and all of its commands, you won’t findlpush
,hset
,sadd
, … etc you will find a new way to do the same job but more easier and flexable, i.e, the well-knownhset key field value
command could be replaced withset key/field value
, but sometimes you need to return a specific hashmap askey => value
, but you runhget key field
to get the key’s value and also it could be replaced withget key/field
, but how could we replacehgetall key
? I will say “it is easy”, let’s make thehget
command work as a prefix scanner that scan the whole database using the specified prefix and return allkey => value
pairs as redis hashmap response!, soHGETALL
in redix means scan and return the result ashashmap
key => value
store that speaks redis
protocol but with our rules!.Async
(all writes happen in the background), or Sync
it won’t respond to the client before writing to the internal datastore.postgresql
, filesystem
), and there may be more engines be introduced in the upcomning releases.redis
clients easily, i.e: “the famouus redis-cli”PING
QUIT
FLUSHALL
FLUSHDB
SELECT <DB index>
SET <key> <value> [EX seconds | KEEPTTL] [NX]
TTL <key>
(not supported while using filesystem
engine)GET <key> [DELETE]
, it has an alias for backward compatibility reasons called GETDEL <key>
INCR <key> [<delta>]
, it has an alias for backward compatibility reasons called INCRBY
(not supported while using filesystem
engine)DEL key [key ...]
HGETALL <prefix>
Fetches the whole data under the specified prefix as a hashmap result ```bash $ 127.0.0.1:6380> set /users/u1 USER_1 OK
$ 127.0.0.1:6380> set /users/u2 USER_2
OK
$ 127.0.0.1:6380> set /users/u3 USER_3
OK
$ 127.0.0.1:6380> hgetall /users/
1) "u1"
2) "USER_1"
3) "u2"
4) "USER_2"
5) "u3"
6) "USER_3"
## in the hgetall response, redix removed the prefix you specified `/users/` ```
redix
uses HCL for configurations, it is a very simple configuration language, Note thatredix
expands the environment vars in the config file, so you can use any osenv var
easily by wrapping it insize${}
, i.e:${LISTEN_ADDR}
```hcl // this is the server block // we may have multiple types of servers in future // for now we have “redis” only server { redis { // the listining address in the format “[hostname]:portnumber” listen = “:6380”
// max connections to the same server
// 0 means unlimited
max_connections = 100
// let redix tries to be async as possible as it can while writing data
// this means that the writes will be in background which means redix won't be able to tell
// you whether the write succeeded or not! just use this if you will use it as if it were a log-file/streaming-service
// this config will result in a very fast writes response as redix won't block until it make sure that the writes are 100% commited!
async = false
} }
// here we select the storage engine
engine “postgresql” {
// here we define the required information to connect to the underlying datastore
// you can pass use an env var here too i.e dsn = "${PG_URI}"
dsn = “postgresql://postgres@localhost/redix”
}
```
docker pull ghcr.io/alash3al/redix
./redix.hcl
docker run -v $(pwd)/redix.hcl:/etc/redix/redix.hcl -p 6380:6380 ghcr.io/alash3al/redix
6380
$ redis-cli -p 6380
hmset
?.boltdb
.You’re welcome!