1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/johng-gkvdb

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 01:15 60484be

GKVDB — это высокопроизводительная и высокодоступная встроенная транзакционная база данных «ключ-значение», разработанная на языке Go с использованием алгоритма глубокого перехэширования (DRH).

Основные особенности:

  • Реализована на чистом Go, что обеспечивает отличную кроссплатформенность.
  • Использует алгоритм DRH для проектирования файлов базы данных, повышая производительность операций со случайными данными.
  • Имеет хорошо спроектированный механизм повторного использования ввода-вывода, что повышает производительность операций с файлами базы данных нижнего уровня.
  • Обеспечивает высокую доступность, гарантируя целостность данных в любых непредвиденных ситуациях.
  • Предоставляет основные интерфейсы операций: Set(), Get(), Remove().
  • Предоставляет интерфейсы транзакционных операций: Begin(), Commit(), Rollback().
  • Поддерживает многотабличные операции: Table(), SetTo(), GetFrom(), RemoveFrom().
  • Предлагает атомарные операции, пакетные операции, транзакции, многотабличные транзакции и произвольный обход.

Ограничения:

  • По умолчанию максимальная длина имени таблицы составляет 255 байт.
  • По умолчанию максимальная длина ключа составляет 255 байт.
  • По умолчанию максимальное значение ключа составляет 16 МБ.
  • По умолчанию максимальный объём данных одной таблицы составляет 1 ТБ.
  • Поддерживается произвольный обход, но не поддерживается диапазонный обход.
  • Это встроенная база данных без встроенной архитектуры клиент-сервер.

Для получения дополнительной информации посетите следующие ресурсы:

Установка:

go get -u gitee.com/johng/gf
go get -u gitee.com/johng/gkvdb

Использование:

  1. Базовый пример использования:
import "gitee.com/johng/gkvdb/gkvdb"

// Создание базы данных и указание каталога хранения
// GKVDB поддерживает несколько таблиц, по умолчанию таблица данных называется default
db, err := gkvdb.New("/tmp/gkvdb")
if err != nil {
    fmt.Println(err)
}

key   := []byte("name")
value := []byte("john")

// Вставка данных
if err := db.Set(key, value); err != nil {
    fmt.Println(err)
}

// Получение данных
fmt.Println(db.Get(key))

// Удаление данных
if err := db.Remove(key); err != nil {
    fmt.Println(err)
}

// Закрытие соединения с базой данных, позволяя GC автоматически освобождать связанные с базой данных ресурсы
db.Close()
  1. Пример использования транзакций:
// Открытие транзакции
tx := db.Begin()

// Запись данных в рамках транзакции
tx.Set(key, value)

// Чтение данных в рамках транзакции
fmt.Println(tx.Get(key))

// Подтверждение транзакции
tx.Commit()

// Откат транзакции
tx.Rollback()
  1. Пример пакетной обработки:
// Пакетная обработка требует использования транзакций
tx := db.Begin()

// Пакетное добавление данных
for i := 0; i < 100; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    tx.Set(key, value)
}
tx.Commit()

// Пакетное удаление данных
for i := 0; i < 100; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    tx.Remove(key)
}
tx.Commit()
  1. Пример работы с несколькими таблицами:
// Создание таблицы user
name    := "user"
tu, err := db.Table(name)
if err != nil {
    fmt.Println(err)
}

// Добавление данных в таблицу user
tu.Set([]byte("user_0"), []byte("name_0"))

// Чтение данных из таблицы user
fmt.Println(tu.Get([]byte("user_0")))

// Удаление данных из таблицы user
tu.Remove([]byte("user_0"))

// Работа с таблицей user через объект db
db.SetTo([]byte("user_1"), []byte("name_1"), name)

// Чтение данных из таблицы user через объект db
fmt.Println(db.GetFrom([]byte("user_1"), name))

// Удаление данных из таблицы user через объект db
db.RemoveFrom([]byte("user_1"), name)

// Ручное закрытие таблицы, освобождение ресурсов таблицы
// Обычно не требуется ручное закрытие, при закрытии базы данных все таблицы закрываются автоматически
tu.Close()
  1. Пример многотабличных транзакций:
// Две таблицы
name1 := "user1"
name2 := "user2"

// Запуск транзакции
tx := db.Begin()

// Транзакционные операции над таблицей user
tx.SetTo([]byte("user_1"), []byte("name_1"), name1)
tx.SetTo([]byte("user_2"), []byte("name_2"), name2)

// Транзакционное чтение данных из таблицы user
fmt.Println("tx get1:", tx.GetFrom([]byte("user_1"), name1))
fmt.Println("tx get2:", tx.GetFrom([]byte("user_2"), name2))
tx.Commit()
fmt.Println("db get1:", db.GetFrom([]byte("user_1"), name1))
fmt.Println("db get2:", db.GetFrom([]byte("user_2"), name2))

// Транзакционное удаление данных из таблицы user
tx.RemoveFrom([]byte("user_1"), name1)
tx.RemoveFrom([]byte("user_2"), name2)
fmt.Println("tx removed1:",tx.GetFrom([]byte("user_1"), name1))
fmt.Println("tx removed2:",tx.GetFrom([]byte("user_2"), name2))

// Операция удаления будет отменена
tx.Rollback()

// Повторное чтение
fmt.Println("tx get1:", tx.GetFrom([]byte("user_1"), name1))
fmt.Println("tx get2:", tx.GetFrom([]byte("user_2"), name2))
fmt.Println("db get1:", db.GetFrom([]byte("user_1"), name1))
fmt.Println("db get2:", db.GetFrom([]byte("user_2"), name2))
  1. Пример произвольного обхода:
// ====== Обход по умолчанию таблицы default ======
// Случайный выбор 10 элементов
fmt.Println(db.Items(10))

// Выбор всех пар ключ-значение
fmt.Println(db.Items(-1))

// Выбор всех ключей
fmt.Println(db.Keys(-1))

// Выбор всех значений
fmt.Println(db.Values(-1))

// ====== Обход указанной таблицы ======
t1, err := db.Table("user1")
if err != nil {
    fmt.Println(err)
}
t2, err := db.Table("user2")
if err != nil {
    fmt.Println(err)
}
for i := 0; i < 10; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    t1.Set(key, value)
}
for i := 10; i < 20; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoа(i))
    t2.Set(key, value)
}

fmt.Println(t1.Items(-1))
``` ```
fmt.Println(t2.Items(-1))

Производительность

john@workstation:~/gkvdb/gkvdb_test/benchmark_test$ go test *.go -bench=".*"
goos: linux
goarch: amd64
BenchmarkSet-8            300000          5130 нс/опер.
BenchmarkGet-8           1000000          9628 нс/опер.
BenchmarkRemove-8         500000          4053 нс/опер.
PASS
ok      command-line-arguments  13.964 с

План

v2.10

1. Улучшить дизайн структуры файла binlog (добавить поле checksum), добавить проверку контрольной суммы в процессе записи в binlog;
2. Ещё раз проанализировать дизайн менеджера фрагментов, посмотреть, есть ли ещё возможности для повышения производительности;
3. Ещё раз проанализировать дизайн пула файловых указателей, посмотреть, есть ли ещё возможности для повышения производительности.

v2.50

1. В базовой структуре файлов базы данных нет необходимости добавлять поле контрольной суммы и проводить проверку контрольной суммы;
2. Однако в потоке синхронизации данных необходимо добавить проверку контрольной суммы данных (после записи данных считывать их снова и проверять контрольную сумму, чтобы обеспечить строгую правильность данных);
3. В базовом дизайне файлов данных рассмотреть возможность добавления поддержки нескольких файлов (использовать разделение на разделы?), чтобы облегчить многопоточную параллельную синхронизацию данных и повысить производительность синхронизации данных и записи файлов.

v3.00

1. Добавить функцию кэширования LRU для горячих точек;
2. Добавить поддержку автоматического истечения срока действия KV.

Вклад

GKVDB — это открытое и бесплатное программное обеспечение, что означает, что любой человек может внести свой вклад в его разработку и улучшение. В настоящее время исходный код проекта GKVDB размещается одновременно на платформах Gitee и GitHub, вы можете выбрать платформу по своему вкусу, чтобы разветвить проект и объединить свои вклады, репозитории двух платформ будут синхронизироваться в реальном времени. Мы очень приветствуем больше друзей, присоединяющихся к разработке GKVDB, и любой ваш вклад в GKVDB будет записан в историю GKVDB.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/johng-gkvdb.git
git@api.gitlife.ru:oschina-mirror/johng-gkvdb.git
oschina-mirror
johng-gkvdb
johng-gkvdb
master