LightningDB
$ dotnet add package LightningDBLightning.NET is a .NET library that provides a fast and easy-to-use interface to the Lightning Memory-Mapped Database (LMDB), a high-performance key-value store. This library enables .NET developers to leverage LMDB's efficiency and reliability in their applications.
Lightning.NET is available as a NuGet package. To install it, run the following command in the Package Manager Console:
Install-Package LightningDB
Alternatively, you can install it via the .NET CLI:
dotnet add package LightningDB
Here's a simple example demonstrating how to create an environment, open a database, and perform basic put and get operations:
using System;
using System.Text;
using LightningDB;
class Program
{
static void Main()
{
// Specify the path to the database environment
using var env = new LightningEnvironment("path_to_your_database");
env.Open();
// Begin a transaction and open (or create) a database
using (var tx = env.BeginTransaction())
using (var db = tx.OpenDatabase(configuration: new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }))
{
// Put a key-value pair into the database
tx.Put(db, UTF8.GetBytes("hello"), UTF8.GetBytes("world"));
tx.Commit();
}
// Begin a read-only transaction to retrieve the value
using (var tx = env.BeginTransaction(TransactionBeginFlags.ReadOnly))
using (var db = tx.OpenDatabase())
{
var (resultCode, key, value) = tx.Get(db, Encoding.UTF8.GetBytes("hello"));
if (resultCode == MDBResultCode.Success)
{
Console.WriteLine($"{UTF8.GetString(key)}: {UTF8.GetString(value)}");
}
else
{
Console.WriteLine("Key not found.");
}
}
}
}
In this example:
LMDB supports storing multiple values for a single key when the database is configured with the Dupsort flag. Here's how you can work with duplicate keys and use the cursor's NextDuplicate function:
using System;
using System.Text;
using LightningDB;
class Program
{
static void Main()
{
using var env = new LightningEnvironment("path_to_your_database");
env.Open();
// Configure the database to support duplicate keys
var dbConfig = new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create | DatabaseOpenFlags.DuplicatesSort };
// Begin a transaction and open the database
using (var tx = env.BeginTransaction())
using (var db = tx.OpenDatabase(configuration: dbConfig))
{
var key = Encoding.UTF8.GetBytes("fruit");
var value1 = Encoding.UTF8.GetBytes("apple");
var value2 = Encoding.UTF8.GetBytes("cherry");
var value3 = Encoding.UTF8.GetBytes("banana");
// Insert multiple values for the same key
tx.Put(db, key, value1);
tx.Put(db, key, value2);
tx.Put(db, key, value3);
tx.Commit();
}
// Begin a read-only transaction to retrieve the values
using (var tx = env.BeginTransaction(TransactionBeginFlags.ReadOnly))
using (var db = tx.OpenDatabase())
using (var cursor = tx.CreateCursor(db))
{
var key = Encoding.UTF8.GetBytes("fruit");
// Position the cursor at the first occurrence of the key
var result = cursor.Set(key);
if(result == MDBResultCode.Success)
{
do
{
var current = cursor.GetCurrent();
var currentKey = current.key.AsSpan();
var currentValue = current.value.AsSpan();
Console.WriteLine($"{UTF8.GetString(currentKey)}: {UTF8.GetString(currentValue)}");
}
// Move to the next duplicate value
while (cursor.NextDuplicate().resultCode == MDBResultCode.Success);
}
else
{
Console.WriteLine("Key not found.");
}
//Or even simpler
var values = cursor.AllValuesFor(key);
foreach(var value in values)
{
Console.WriteLine($"fruit: {Encoding.UTF8.GetString(value.AsSpan())}");
}
}
}
}
In this example:
DupSort flag to allow multiple values for a single key.For more detailed examples and advanced usage, refer to the unit tests in the Lightning.NET repository.
The <a href="http://lmdb.tech/doc" target="_blank">Official LMDB API documentation</a> is also a valuable resource for understanding the underlying database engine.