aboutsummaryrefslogtreecommitdiff
path: root/shards.go
diff options
context:
space:
mode:
authoralex <[email protected]>2026-07-10 20:24:59 +0200
committeralex <[email protected]>2026-07-10 20:24:59 +0200
commit36d70e64340033f1e5b928524436c0b2f44c831e (patch)
treeacbfc67b411f184f2de14a24838aaf1d547b7d91 /shards.go
parentd1628cb76ac4f907d8e57346809e3ac0b8e12de5 (diff)
downloadredis-clone-36d70e64340033f1e5b928524436c0b2f44c831e.tar.xz
redis-clone-36d70e64340033f1e5b928524436c0b2f44c831e.zip
moved commands and database and main into separate packages
Diffstat (limited to 'shards.go')
-rw-r--r--shards.go132
1 files changed, 0 insertions, 132 deletions
diff --git a/shards.go b/shards.go
deleted file mode 100644
index 591e121..0000000
--- a/shards.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package main
-
-import (
- "hash/fnv"
- "sort"
- "sync"
-)
-type Shard struct{
- mu sync.RWMutex
- 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)
-}
-func (db *RedisDB) ExecuteRead(key string, fn func(*Shard) interface{}) interface{} {
- shard := db.getShard(key)
- shard.mu.RLock()
- defer shard.mu.RUnlock()
- return fn(shard)
-}
-func ( db *RedisDB) ExecuteMulti(keys []string, fn func([]*Shard) interface{})interface{}{
- if len(keys) == 1{
- shard := db.getShard(keys[0])
- shard.mu.Lock()
- defer shard.mu.Unlock()
- shards := []*Shard{shard}
- return fn(shards)
- }else{
- 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)
- }
-}
-
-func ( db *RedisDB) ExecuteAll(fn func([]*Shard) interface{})interface{}{
- for _, shard := range db.shards {
- shard.mu.Lock()
- }
-
- defer func(){
- for i := len(db.shards)-1;i >= 0; i --{
- db.shards[i].mu.Unlock()
- }
- }()
-
- return fn(db.shards)
-}
-
-func ( db *RedisDB) ExecuteReadAll(fn func([]*Shard) interface{})interface{}{
- for _, shard := range db.shards {
- shard.mu.RLock()
- }
-
- defer func(){
- for i := len(db.shards)-1;i >= 0; i --{
- db.shards[i].mu.RUnlock()
- }
- }()
-
- return fn(db.shards)
-}
-
-func ( db *RedisDB) Lock(keys []string){
- if len(keys) == 1{
- shard := db.getShard(keys[0])
- shard.mu.Lock()
- }else{
- 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()
- }
- }
-}
-func ( db *RedisDB) Unlock(keys []string){
- 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 i := len(sortedIDs)-1; i >= 0; i --{
- shardMap[sortedIDs[i]].mu.Unlock()
- }
-} \ No newline at end of file