Skip to content

Commit 6bcbec5

Browse files
committed
redsrv: redka server (#46)
1 parent 2215a0a commit 6bcbec5

File tree

212 files changed

+394
-295
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

212 files changed

+394
-295
lines changed

cmd/redka/main.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
_ "github.com/lib/pq"
2727
"github.com/mattn/go-sqlite3"
2828
"github.com/nalgeon/redka"
29-
"github.com/nalgeon/redka/internal/server"
29+
"github.com/nalgeon/redka/redsrv"
3030
)
3131

3232
// set by the build process
@@ -188,13 +188,13 @@ func inferDriverName(path string) string {
188188
}
189189

190190
// startServer starts the application server.
191-
func startServer(config Config, db *redka.DB, ready chan error) *server.Server {
191+
func startServer(config Config, db *redka.DB, ready chan error) *redsrv.Server {
192192
// Create the server.
193-
var srv *server.Server
193+
var srv *redsrv.Server
194194
if config.Sock != "" {
195-
srv = server.New("unix", config.Sock, db)
195+
srv = redsrv.New("unix", config.Sock, db)
196196
} else {
197-
srv = server.New("tcp", config.Addr(), db)
197+
srv = redsrv.New("tcp", config.Addr(), db)
198198
}
199199

200200
// Start the server.
@@ -208,11 +208,11 @@ func startServer(config Config, db *redka.DB, ready chan error) *server.Server {
208208
}
209209

210210
// startDebugServer starts the debug server.
211-
func startDebugServer(config Config, ready chan<- error) *server.DebugServer {
211+
func startDebugServer(config Config, ready chan<- error) *redsrv.DebugServer {
212212
if !config.Verbose {
213213
return nil
214214
}
215-
srv := server.NewDebug("localhost", debugPort)
215+
srv := redsrv.NewDebug("localhost", debugPort)
216216
go func() {
217217
if err := srv.Start(); err != nil {
218218
ready <- fmt.Errorf("start debug server: %w", err)
@@ -222,7 +222,7 @@ func startDebugServer(config Config, ready chan<- error) *server.DebugServer {
222222
}
223223

224224
// shutdown stops the main server and the debug server.
225-
func shutdown(srv *server.Server, debugSrv *server.DebugServer) {
225+
func shutdown(srv *redsrv.Server, debugSrv *redsrv.DebugServer) {
226226
slog.Info("stopping redka")
227227

228228
// Stop the debug server.

example/go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ require (
1111
github.com/mattn/go-sqlite3 v1.14.28
1212
github.com/nalgeon/redka v0.0.0-00010101000000-000000000000
1313
github.com/ncruces/go-sqlite3 v0.16.2
14+
github.com/redis/go-redis/v9 v9.11.0
1415
modernc.org/sqlite v1.29.5
1516
)
1617

1718
require (
19+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
20+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
1821
github.com/dustin/go-humanize v1.0.1 // indirect
1922
github.com/google/uuid v1.3.0 // indirect
2023
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
@@ -23,6 +26,9 @@ require (
2326
github.com/ncruces/julianday v1.0.0 // indirect
2427
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
2528
github.com/tetratelabs/wazero v1.7.3 // indirect
29+
github.com/tidwall/btree v1.7.0 // indirect
30+
github.com/tidwall/match v1.1.1 // indirect
31+
github.com/tidwall/redcon v1.6.2 // indirect
2632
golang.org/x/sys v0.21.0 // indirect
2733
golang.org/x/tools v0.19.0 // indirect
2834
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect

example/go.sum

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
2+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
3+
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
4+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
5+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
6+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
7+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
8+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
19
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
210
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
311
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
@@ -22,10 +30,19 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt
2230
github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g=
2331
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2432
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
33+
github.com/redis/go-redis/v9 v9.11.0 h1:E3S08Gl/nJNn5vkxd2i78wZxWAPNZgUNTp8WIJUAiIs=
34+
github.com/redis/go-redis/v9 v9.11.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
2535
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
2636
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
2737
github.com/tetratelabs/wazero v1.7.3 h1:PBH5KVahrt3S2AHgEjKu4u+LlDbbk+nsGE3KLucy6Rw=
2838
github.com/tetratelabs/wazero v1.7.3/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y=
39+
github.com/tidwall/btree v1.1.0/go.mod h1:TzIRzen6yHbibdSfK6t8QimqbUnoxUSrZfeW7Uob0q4=
40+
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
41+
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
42+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
43+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
44+
github.com/tidwall/redcon v1.6.2 h1:5qfvrrybgtO85jnhSravmkZyC0D+7WstbfCs3MmPhow=
45+
github.com/tidwall/redcon v1.6.2/go.mod h1:p5Wbsgeyi2VSTBWOcA5vRXrOb9arFTcU2+ZzFjqV75Y=
2946
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
3047
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
3148
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

example/server/main.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// An example of running a Redka server
2+
// within your own application.
3+
package main
4+
5+
import (
6+
"context"
7+
"fmt"
8+
9+
_ "github.com/mattn/go-sqlite3"
10+
"github.com/nalgeon/redka"
11+
"github.com/nalgeon/redka/redsrv"
12+
"github.com/redis/go-redis/v9"
13+
)
14+
15+
func main() {
16+
// Start a Redka server with an in-memory database.
17+
db := mustOpen()
18+
srv := mustStart(db)
19+
defer func() {
20+
_ = srv.Stop()
21+
fmt.Println("redka server stopped")
22+
}()
23+
fmt.Println("redka server started")
24+
25+
// The server is now running and ready to accept connections.
26+
// You can use the regular go-redis package to access Redka.
27+
rdb := redis.NewClient(&redis.Options{Addr: ":6380"})
28+
defer func() { _ = rdb.Close() }()
29+
30+
ctx := context.Background()
31+
rdb.Set(ctx, "name", "alice", 0)
32+
rdb.Set(ctx, "age", 25, 0)
33+
34+
name, _ := rdb.Get(ctx, "name").Result()
35+
fmt.Println("name =", name)
36+
age, _ := rdb.Get(ctx, "age").Int()
37+
fmt.Println("age =", age)
38+
}
39+
40+
// mustOpen opens an in-memory Redka database.
41+
func mustOpen() *redka.DB {
42+
db, err := redka.Open("file:/redka.db?vfs=memdb", nil)
43+
if err != nil {
44+
panic(err)
45+
}
46+
return db
47+
}
48+
49+
// mustStart starts a Redka server on localhost:6380.
50+
func mustStart(db *redka.DB) *redsrv.Server {
51+
srv := redsrv.New("tcp", ":6380", db)
52+
53+
// The ready channel will receive a nil value when the server is ready,
54+
// or an error if it fails to start.
55+
ready := make(chan error, 1)
56+
go func() {
57+
if err := srv.Start(ready); err != nil {
58+
ready <- err
59+
return
60+
}
61+
}()
62+
63+
// Wait for the server to be ready.
64+
if err := <-ready; err != nil {
65+
panic(err)
66+
}
67+
return srv
68+
}

redka.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@ func (db *DB) ZSet() *rzset.DB {
262262
return db.zsetDB
263263
}
264264

265+
// Log returns the logger for the database.
266+
func (db *DB) Log() *slog.Logger {
267+
return db.log
268+
}
269+
265270
// Update executes a function within a writable transaction.
266271
func (db *DB) Update(f func(tx *Tx) error) error {
267272
return db.act.Update(f)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package server
1+
package redsrv
22

33
import (
44
"fmt"
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
package server
1+
package redsrv
22

33
import (
44
"log/slog"
55
"time"
66

77
"github.com/nalgeon/redka"
8-
"github.com/nalgeon/redka/internal/command"
9-
"github.com/nalgeon/redka/internal/redis"
8+
"github.com/nalgeon/redka/redsrv/internal/command"
9+
"github.com/nalgeon/redka/redsrv/internal/redis"
1010
"github.com/tidwall/redcon"
1111
)
1212

1313
// createHandlers returns the server command handlers.
1414
func createHandlers(db *redka.DB) redcon.HandlerFunc {
15-
return logging(parse(multi(handle(db))))
15+
return logging(parse(multi(handle(db))), db.Log())
1616
}
1717

1818
// logging logs the command processing time.
19-
func logging(next redcon.HandlerFunc) redcon.HandlerFunc {
19+
func logging(next redcon.HandlerFunc, log *slog.Logger) redcon.HandlerFunc {
2020
return func(conn redcon.Conn, cmd redcon.Command) {
2121
start := time.Now()
2222
next(conn, cmd)
23-
slog.Debug("process command", "client", conn.RemoteAddr(),
23+
log.Debug("process command", "client", conn.RemoteAddr(),
2424
"name", string(cmd.Args[0]), "time", time.Since(start))
2525
}
2626
}
@@ -100,15 +100,15 @@ func handleMulti(conn redcon.Conn, state *connState, db *redka.DB) {
100100
for _, pcmd := range state.cmds {
101101
_, err := pcmd.Run(conn, redis.RedkaTx(tx))
102102
if err != nil {
103-
slog.Warn("run multi command", "client", conn.RemoteAddr(),
103+
db.Log().Warn("run multi command", "client", conn.RemoteAddr(),
104104
"name", pcmd.Name(), "err", err)
105105
return err
106106
}
107107
}
108108
return nil
109109
})
110110
if err != nil {
111-
slog.Warn("run multi", "client", conn.RemoteAddr(), "err", err)
111+
db.Log().Warn("run multi", "client", conn.RemoteAddr(), "err", err)
112112
}
113113
}
114114

@@ -117,7 +117,7 @@ func handleSingle(conn redcon.Conn, state *connState, db *redka.DB) {
117117
pcmd := state.pop()
118118
_, err := pcmd.Run(conn, redis.RedkaDB(db))
119119
if err != nil {
120-
slog.Warn("run single command", "client", conn.RemoteAddr(),
120+
db.Log().Warn("run single command", "client", conn.RemoteAddr(),
121121
"name", pcmd.Name(), "err", err)
122122
return
123123
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package server
1+
package redsrv
22

33
import (
44
"net"
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ package command
55
import (
66
"strings"
77

8-
"github.com/nalgeon/redka/internal/command/conn"
9-
"github.com/nalgeon/redka/internal/command/hash"
10-
"github.com/nalgeon/redka/internal/command/key"
11-
"github.com/nalgeon/redka/internal/command/list"
12-
"github.com/nalgeon/redka/internal/command/server"
13-
"github.com/nalgeon/redka/internal/command/set"
14-
str "github.com/nalgeon/redka/internal/command/string"
15-
"github.com/nalgeon/redka/internal/command/zset"
16-
"github.com/nalgeon/redka/internal/redis"
8+
"github.com/nalgeon/redka/redsrv/internal/command/conn"
9+
"github.com/nalgeon/redka/redsrv/internal/command/hash"
10+
"github.com/nalgeon/redka/redsrv/internal/command/key"
11+
"github.com/nalgeon/redka/redsrv/internal/command/list"
12+
"github.com/nalgeon/redka/redsrv/internal/command/server"
13+
"github.com/nalgeon/redka/redsrv/internal/command/set"
14+
str "github.com/nalgeon/redka/redsrv/internal/command/string"
15+
"github.com/nalgeon/redka/redsrv/internal/command/zset"
16+
"github.com/nalgeon/redka/redsrv/internal/redis"
1717
)
1818

1919
// Parse parses a text representation of a command into a Cmd.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package conn
33
import (
44
"testing"
55

6-
"github.com/nalgeon/redka/internal/redis"
76
"github.com/nalgeon/redka/internal/testx"
7+
"github.com/nalgeon/redka/redsrv/internal/redis"
88
)
99

1010
func getRedka(tb testing.TB) redis.Redka {

0 commit comments

Comments
 (0)