4 ms·
A database without any code, actually. It's less than a few hundred lines of Go that just wraps two other databases (syndtr/goleveldb and ledisdb/ledisdb) with
by tomnipotent 5y ago
A database without any code, actually.
It's less than a few hundred lines of Go that just wraps two other databases (syndtr/goleveldb and ledisdb/ledisdb) with a third library (tidwall/uhaha) that provides a Raft API.
- 3np 5y agoOooh that means I can form it to do Redis instead right? Because that could be a nice way to to Redis clustering
- tomnipotent 5y agoI suppose you could stick tidwall/uhaha directly in front of redis, but I'm not entirely certain what you'd call that... Here's the LSET code: https://github.com/gitsrc/IceFireDB/blob/main/lists.go#L232 https://github.com/gitsrc/IceFireDB/blob/main/lists.go#L232 func cmdLSET(m uhaha.Machine, args []string) (interface{}, error) { if len(args) != 4 { return nil, rafthub.ErrWrongNumArgs } index, err := ledis.StrInt64([]byte(args[2]), nil) if err != nil { return nil, err } if err := ldb.LSet([]byte(args[1]), int32(index), []byte(args[3])); err != nil { return nil, err } return redcon.SimpleString("OK"), nil } So what "IceFireDB" is: 1. tidwall/uhaha - Raft server (m uhaha.Machine, rafthub) 2. tidwall/redcon - Read/write redis protocol (redcon.SimpleString) 3. ledisdb/ledisdb - Redis-compatible with disk persistence via leveldb (ldb.LSet) 4. syndtr/goleveldb/leveldb - Provides snapshots, other scattered references throughout code It also includes this seemingly random file below, which seems to implement some string slice overloads using unsafe.Pointer: https://github.com/siddontang/go/blob/master/hack/hack.go https://github.com/siddontang/go/blob/master/hack/hack.go // no copy to change slice to string // use your own risk func String(b []byte) (s string) { pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pstring.Data = pbytes.Data pstring.Len = pbytes.Len return } // no copy to change string to slice // use your own risk func Slice(s string) (b []byte) { pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pbytes.Data = pstring.Data pbytes.Len = pstring.Len pbytes.Cap = pstring.Len return }
- sitkack 5y agoDo you need Redis or the Redis protocol? Aerospike and ScyllaDB both support a subset of the Redis API and run as a durable cluster. Both have been tested with Jepsen.
- tomnipotent 5y ago> Do you need Redis or the Redis protocol? Only if you want to be a drop-in replacement and take advantage of existing compatible libraries. With the recent tea around the official Elasticsearch Python library, it becomes a more interesting question.