Writing A Database: Part 1 — Skeleton Implementation
Code lives at https://github.com/danchia/ddb
After the requisite installing of things (golang, protoc, vim-go plugins), I put together a quick skeleton implementation of a key-value store.
I’ve often found that getting all the initial plumbing together can be a bit of a pain. Thankfully that wasn’t too much the case this time, although I have used gRPC / proto3 in the past, and have some familiarity with golang.
Thoughts on Go so far
- Compiling is really snappy! Granted I don’t have much code yet, it will be interesting to see if this keeps up.
- The
vim-go
plugin is really nice. Works out of the box and gives me auto-complete, auto format and auto import. - Go recommends not using any assertion library for tests. It’s an interesting choice, and I’m still on the fence. I think libraries like Truth are pretty useful. We’ll see.
The API
The API is really simple right now:
I initially had key
be of type bytes;
it turns out in Go you can’t compare slices, which was a little surprising, and I made it a string
instead mostly for convenience.
What’s Next
The current implementation accepts the request and sticks it into an in-memory map. This of course means on restart the server will lose all data, which isn’t very useful for a database.
Next up, I’ll delve a little into write-ahead logging, which will let us recover data on restart / crash.