From aac1dd50b61090461cefc0263f065140be4bf50b Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 8 Jul 2026 21:04:46 +0200 Subject: added ExecuteMulti method and refactored del to work with shards --- shards.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'shards.go') diff --git a/shards.go b/shards.go index c69f920..ae6e069 100644 --- a/shards.go +++ b/shards.go @@ -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) +} -- cgit v1.2.3