diff options
| -rw-r--r-- | handlers.go | 27 | ||||
| -rw-r--r-- | shards.go | 28 |
2 files changed, 43 insertions, 12 deletions
diff --git a/handlers.go b/handlers.go index 1a04db9..980e805 100644 --- a/handlers.go +++ b/handlers.go @@ -74,28 +74,31 @@ func handleSet(conn net.Conn, args []string) { conn.Write(serializeRESP(result)) } -/* + func handleDel(conn net.Conn, args []string) { - db.mu.Lock() - defer db.mu.Unlock() if len(args) < 2 { err := errors.New("wrong number of arguments for 'DEL'") conn.Write(serializeRESP(err)) return } - - deletedKeys := 0 - for i := 1; i<len(args);i++{ - _, exists := db.data[args[i]] - if exists { - delete(db.data, args[i]) - deletedKeys += 1 - } - } + keys := args[:1] + deletedKeys := db.ExecuteMulti(keys, func(shards []*Shard) interface{}{ + count := 0 + for _, key := range keys{ + shard := db.getShard(key) + _, exists := shard.data[key] + if exists { + delete(shard.data, key) + count += 1 + } + } + return count + }) conn.Write(serializeRESP(deletedKeys)) } +/* func handleIncr(conn net.Conn, args []string) { db.mu.Lock() defer db.mu.Unlock() @@ -2,6 +2,7 @@ package main import ( "hash/fnv" + "sort" "sync" ) type Shard struct{ @@ -24,3 +25,30 @@ func (db *RedisDB) Execute(key string, fn func(*Shard) interface{}) interface{} defer shard.mu.Unlock() return fn(shard) } + +func ( db *RedisDB) ExecuteMulti(keys []string, fn func([]*Shard) interface{})interface{}{ + shardMap := make(map[int]*Shard) + for _, k := range keys { + shard := db.getShard(k) + shardMap[shard.id] = shard + } + var sortedIDs []int + for id := range shardMap { + sortedIDs = append(sortedIDs, id) + } + sort.Ints(sortedIDs) + for _, id := range sortedIDs{ + shardMap[id].mu.Lock() + } + defer func(){ + for i := len(sortedIDs)-1; i >= 0; i --{ + shardMap[sortedIDs[i]].mu.Unlock() + } + }() + + shards := make([]*Shard, 0, len(shardMap)) + for _, id := range sortedIDs { + shards = append(shards, shardMap[id]) + } + return fn(shards) +} |
