GKVDB — это высокопроизводительная и высокодоступная встроенная транзакционная база данных «ключ-значение», разработанная на языке Go с использованием алгоритма глубокого перехэширования (DRH).
Основные особенности:
Ограничения:
Для получения дополнительной информации посетите следующие ресурсы:
Установка:
go get -u gitee.com/johng/gf
go get -u gitee.com/johng/gkvdb
Использование:
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()
// Открытие транзакции
tx := db.Begin()
// Запись данных в рамках транзакции
tx.Set(key, value)
// Чтение данных в рамках транзакции
fmt.Println(tx.Get(key))
// Подтверждение транзакции
tx.Commit()
// Откат транзакции
tx.Rollback()
// Пакетная обработка требует использования транзакций
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()
// Создание таблицы 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()
// Две таблицы
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))
// ====== Обход по умолчанию таблицы 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 )