aboutsummaryrefslogtreecommitdiff
path: root/shards.go
blob: c69f92045fbe206ff49d641f8f0b6eed0f891184 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
	"hash/fnv"
	"sync"
)
type Shard struct{
	mu sync.Mutex
	id int
	data map[string]Item
}

func (db *RedisDB) getShard(key string)*Shard{
	hash := fnv.New64a()
	hash.Write([]byte(key))
	val := hash.Sum64()

	return db.shards[val%NumShards]
}

func (db *RedisDB) Execute(key string, fn func(*Shard) interface{}) interface{} {
    shard := db.getShard(key)
    shard.mu.Lock()
    defer shard.mu.Unlock()
    return fn(shard)
}