ZIO LMDB
ZIO LMDB is an embedded, ACID, key-value database for ZIO. It needs no infrastructure: the data lives in a single file.
Introductionโ
ZIO LMDB is built on top of lmdbjava and offers a type-safe, ZIO-native API.
Key features of ZIO LMDB:
- Three Collection Kinds โ
LMDBCollection(one key to one value),LMDBMulti(one key to many values), andLMDBIndex(one key to many keys). - Customizable Codecs โ Use the JSON codec (
derives LMDBCodecJson), the bytes-optimized codecs for keys, or our own. - Atomic Transactions โ Run transactions on a single collection or across collections.
- Lexicographic Ordering โ Keys are sorted, so range scans and pagination come for free.
Installationโ
In order to use this library, we need to add the following line to our build.sbt file:
libraryDependencies += "fr.janalyse" %% "zio-lmdb" % "2.8.6"
Exampleโ
In the following example, we create a collection of Person values, insert one, update it, and fetch it back:
import zio.*, zio.lmdb.*, zio.lmdb.json.*
import java.util.UUID
case class Person(name: String, age: Int) derives LMDBCodecJson
object Example extends ZIOAppDefault:
def run = (for {
people <- LMDB.collectionCreate[UUID, Person]("people", failIfExists = false)
id <- Random.nextUUID
_ <- people.insert(id, Person("Alice", 30))
_ <- people.update(id, previous => previous.copy(age = previous.age + 1))
result <- people.fetch(id)
_ <- Console.printLine(result)
} yield ()).provide(LMDB.liveWithDatabaseName("my-app"), Scope.default)
When running with Scala CLI, the JVM needs the following options to give LMDB access to NIO internals:
//> using dep fr.janalyse::zio-lmdb:2.8.6
//> using javaOpt --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED
For the full API reference, including transactions, codecs, indexes, and configuration, see the ZIO LMDB documentation.