shard

package module
v1.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2025 License: MIT Imports: 8 Imported by: 0

README

shard

Библиотека пригодится для in memory cache. В отличии с стандартным подходом из мапы обернутой в мьютекс или sync.Map, я предлогаю подход когда данные хранятся не в одной мапе, а поделены на шарды. Каждый шард это lock-free структура. Этот подход сильно ускоряет работу с данными при частой записи.

В качестве ключа может использоваться любой сравниваемый тип. Из ключа через хеш сумму высчитывается индекс шарда, вы можете переопределить эту функцию.

Примеры инициализации

// Простой тип ключа
NewStore[string, int32](nil) // k: int32 v: string

// Alias тип ключа
type myString string
NewStore[string, myString](nil) // k: myString v: string

// Своя хеш функция 
NewStore[string]( // k: struct{ A int } v: string
   Options[struct{ A int }]().
      SetFuncGetIndex(getIndex),
)
func getIndex(countShard uint64, k struct{ A int }) int { return k.A }

Записи с просроченным ttl удаляются автоматически. Периодичность проверки можно задать через опции.

Если в процессе выполнения программы нужно увеличить или уменьшить хранилище, то есть метод Resize, под капотом создается временный пул новых шардов с стартовым размером как allCount / countShards. Работает по аналогии с мапой поэтому задержки минимальны.

Для статистики метод GetCount вернет количество записей в каждом шарде.

Для тех кому нужен только блокировщик есть github.com/0LuigiCode0/shard/spinner это блокировки на атомиках с спинлоком на ассемблере

Сравнение бенчмарков

При 24 ядрах
cpu: AMD Ryzen 9 7900X 12-Core Processor
BenchmarkShardInt-24           10000000                34.86 ns/op
BenchmarkMapIntSpinner-24      10000000               326.9 ns/op
BenchmarkMapIntMutex-24        10000000               301.1 ns/op
BenchmarkShardUUID-24           10000000                64.91 ns/op
BenchmarkMapUUIDSpinner-24      10000000               539.9 ns/op
BenchmarkMapUUIDMutex-24        10000000               597.6 ns/op

При 4 ядрах
cpu: AMD Ryzen 9 7900X 12-Core Processor
BenchmarkShardInt-24           10000000                69.79 ns/op
BenchmarkMapIntSpinner-24      10000000               190.8 ns/op
BenchmarkMapIntMutex-24        10000000               375.0 ns/op
BenchmarkShardUUID-24           10000000               164.1 ns/op
BenchmarkMapUUIDSpinner-24      10000000               358.7 ns/op
BenchmarkMapUUIDMutex-24        10000000               664.2 ns/op

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrItemExists   = errors.New("item already exists")
	ErrItemNotFound = errors.New("item not found")
	ErrItemExpired  = errors.New("item already expired")
	ErrNilSlice     = errors.New("slice is nil")
)

Functions

func Option added in v1.1.1

func Option[k comparable]() *option[k]

Types

type IStore added in v1.1.0

type IStore[k comparable, v any] interface {
	// Получить данные по ключу
	Get(key k) (data v, err error)
	// Сохранить данные по ключу
	Set(key k, data v) error
	// Изменят количество шардов с пересчетом ключей
	Resize(countShards uint)
	// Чистит записи в шардах
	Clear()
	// Останавливает удаление по ttl
	Stop()
	// Возвращает количество записей в каждом шарде
	GetCount() []uint
}

func NewStore added in v1.1.0

func NewStore[v any, k comparable](opt *option[k]) IStore[k, v]

Directories

Path Synopsis
spinner module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL