Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/heroku/redo
pipelined erlang redis client
https://github.com/heroku/redo
Last synced: 7 days ago
JSON representation
pipelined erlang redis client
- Host: GitHub
- URL: https://github.com/heroku/redo
- Owner: heroku
- Created: 2014-03-18T02:46:37.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2019-01-17T23:48:02.000Z (almost 6 years ago)
- Last Synced: 2024-10-18T21:08:29.494Z (21 days ago)
- Language: Erlang
- Homepage:
- Size: 146 KB
- Stars: 0
- Watchers: 6
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- freaking_awesome_elixir - Erlang - Heroku's pipelining redis client for erlang. (ORM and Datamapping)
- fucking-awesome-elixir - redo - Heroku's pipelining redis client for erlang. (ORM and Datamapping)
- awesome-elixir - redo - Heroku's pipelining redis client for erlang. (ORM and Datamapping)
README
### Philosophy
> If you wish to write a redis client from scratch, you must first invent the universe.
### About
Redo is a pipelined redis client written in Erlang. It lacks any sort of syntactic sugar. The only API function is redo:cmd, which takes a raw redis command.
### Build
$ make
### Test
#### Unit tests
$ ./rebar eunit suite=redo
#### Local read benchmark
$ erl -pa ebin
1> bench:sync(1000).
91ms
10989 req/sec2> bench:async(1000, 100).
38ms
26315 req/sec#### Concurrency test
$ erl -pa ebin
1> redo_concurrency_test:run(20, 100). %% 20 pids, 100 random operations performed per pid### Start
No arguments: register process as "redo"
$ erl -pa ebin
1> redo:start_link().
{ok, <0.33.0>
2> whereis(redo).
<0.33.0>
3> redo:cmd(["PING"]).
<<"PONG">>Register with custom name
erl -pa ebin
1> redo:start_link(myclient).
{ok,<0.33.0>}
2> whereis(myclient).
<0.33.0>
8> redo:cmd(myclient, ["PING"]).
<<"PONG">>Start anonymous Redo process
erl -pa ebin
1> {ok, Pid} = redo:start_link(undefined).
{ok,<0.33.0>}
2> redo:cmd(Pid, ["PING"]).
<<"PONG">>Specifying connection options
erl -pa ebin
1> redo:start_link([{host, "localhost"}, {port, 6379}]).
{ok,<0.33.0>}
2> redo:cmd(["PING"]).
<<"PONG">>3> redo:start_link(myclient, [{host, "localhost"}, {port, 6379}]).
{ok,<0.37.0>}
4> redo:cmd(myclient, ["PING"]).
<<"PONG">>### Commands
erl -pa ebin
1> redo:start_link().
<0.33.0>
2> redo:cmd(["SET", "foo"]).
{error,<<"ERR wrong number of arguments for 'set' command">>}
3> redo:cmd(["SET", "foo", "bar"]).
<<"OK">>
4> redo:cmd(["GET", "foo"]).
<<"bar">>
5> redo:cmd(["HMSET", "hfoo", "ONE", "ABC", "TWO", "DEF"]).
<<"OK">>
6> redo:cmd(["HGETALL", "hfoo"]).
[<<"ONE">>,<<"ABC">>,<<"TWO">>,<<"DEF">>]### Pipelined commands
1> redo:start_link().
<0.33.>
2> redo:cmd([["GET", "foo"], ["HGETALL", "hfoo"]]).
[<<"bar">>, [<<"ONE">>,<<"ABC">>,<<"TWO">>,<<"DEF">>]]### Pub/Sub
$ erl -pa ebin
1> redo:start_link().
{ok,<0.33.0>}
2> Ref = redo:subscribe("chfoo").
#Ref<0.0.0.42>
3> (fun() -> receive {Ref, Res} -> Res after 10000 -> timeout end end)().
[<<"subscribe">>,<<"chfoo">>,1]
4> redo:start_link(client).
{ok,<0.39.0>}
5> redo:cmd(client, ["PUBLISH", "chfoo", "hello"]).
1
6> (fun() -> receive {Ref, Res} -> Res after 10000 -> timeout end end)().
[<<"message">>,<<"chfoo">>,<<"hello">>]%% restart redis server...
7> (fun() -> receive {Ref, Res} -> Res after 10000 -> timeout end end)().
closed
8> f(Ref).
ok
9> Ref = redo:subscribe("chfoo").
#Ref<0.0.0.68>
10> (fun() -> receive {Ref, Res} -> Res after 10000 -> timeout end end)().
[<<"subscribe">>,<<"chfoo">>,1]
11> redo:cmd(client, ["PUBLISH", "chfoo", "hello again"]).
1
12> (fun() -> receive {Ref, Res} -> Res after 10000 -> timeout end end)().
[<<"message">>,<<"chfoo">>,<<"hello again">>]