
时间轴 :
微小的密钥值存储库 .
键入脚本。节点或网络。 内存,平分db,地盘存储,或索引eddb. 范围命名空间和原子写入批次。 将测距和输入的 kv 实例传递到您的应用组件中, 他们不需要担心数据的实际存在.
npm install @e280/kv
import {Kv} from "@e280/kv"
kv很简单.
- 让你的kv.
const kv = new Kv() - 准备和得到的东西.
await kv.set("penguins", 123) // setting undefined is the same as deleteawait kv.get("penguins") // 123 - 键是字符串。 值可以是任何结构化数据.
await kv.set("hello", {alpha: 123, bravo: ["bingus"]}) - 从解剖学角度来说, 执行了一系列行动.
await kv.commit([ kv.op.set("pangolins", 100), kv.op.delete("bingus"), ])
插上你最喜欢的kv杂志.
- 记忆- 马加锡 (违约), 麻黄入内贮.
记忆杂志是缓慢和非原子的。 用来测试的.
import {Kv, MemoryMagazine} from "@e280/kv" const kv = new Kv(new MemoryMagazine()) - 马加锡级, 磁盘上的节点 职等db。 。 。 .
import {Level} from "level" import {Kv, LevelMagazine} from "@e280/kv" const level = new Level("./kv") const kv = new Kv(new LevelMagazine(level)) - Idb Magazine, (意大利语), 内浏览器索引 DB 存储.
import {Kv, IdbMagazine, idbOpen} from "@e280/kv" const idb = await idbOpen("kv") const kv = new Kv(new IdbMagazine(idb)) - 储存马加锡, 正在浏览的本地Storage/会话Storage.
存储杂志是缓慢和非原子的。 它意味着少量的数据.
import {Kv, StorageMagazine} from "@e280/kv" const kv = new Kv(new StorageMagazine(localStorage)) - 写自己的杂志, 你不会相信它是多么容易.
见 杂志/杂志 给灵感.import {Magazine, Op, Scan, Value} from "@e280/kv" // three methods and you're done! export class MyMagazine implements Magazine { async commit(ops: Op<Value>[]): Promise<void> {/*...*/} async getMany(keys: string[]): Promise<(unknown | undefined)[]> {/*...*/} async* entries(scan?: Scan): AsyncIterable<[key: string, value: unknown]> {/*...*/} }
kv瞄准镜.
scope使 Kv 实例具有命名空间.const users = kv.scope("users") const messages = kv.scope("messages")await users.set("111", "chase") await messages.set("222", ["111", "yo"])await kv.get("111") // undefined // 👮 parent is blind to child entries await users.get("222") // undefined // 👮 child is blind to sibling and parent entries- 瞄准镜是可嵌入的, 它的龟 一路下.
kv.scope("animals").scope("turtles") // 🥸 equivalent kv.scope("animals", "turtles") // 🙅 illegal: empty strings, reserved characters "." and ":" kv.scope("", "e280.org", "e280:org") - 所有kv操作都被隔离到自己的范围.
root kv 是一个和任何其他区域相同的范围.
const animals = kv.scope("animals") const turtles = animals.scope("turtles") const squirrels = animals.scope("squirrels")await animals.clear() // 👮 turtles and squirrels are safeawait squirrels.clear() // 👮 turtles are safe - ☣️
subtree很危险, 它允许父母范围伤害孩子.它返回一个特殊
Subtree实例count财务报告和审定财务报表clear方法。 。 .await animals.subtree.count() // count includes animals, turtles, and squirrelsawait animals.subtree.clear() // 💀 wipes out all animals, turtles, and squirrels. i'm sorry. - 别忘了你可以设置严格的类型, kV和瞄准镜上都有.
const kv = new Kv<unknown>() const users = kv.scope<string>("users") const messages = kv.scope<[author: string, text: string]>("messages") - 🍋🟩 承诺可以跨范围, 不要错过这个!
await kv.commit([ users.op.set("345", "bingus"), messages.op.set("456", ["345", "don't let the raccoons know"]), ])
更多kv方法.
delete一对按键.
也可以通过多键.await kv.delete("hello")await kv.delete("123", "234", "345")has检查密钥是否存在 .await kv.has("hello") // truesetMany立即设置许多密钥值对.await kv.setMany([["1", "alpha"], ["2", "bravo"]])getMany一次获取许多值.const values = await kv.getMany(["alpha", "bravo"]) // [123, undefined]need获取一个值, 如果值缺失/ 无效, 则丢出 .const value = await kv.need("hello") // "world" (or throws error)needMany获取许多值, 或丢入缺失/无效值.const values = await kv.needMany(["alpha", "bravo"]) // [123, 234] (or throws error)entries绕过密钥值对.
它的别名是for await (const [key, value] of kv.entries()) console.log(key, value)Symbol.asyncIterator,所以你可以做到这一点:
页:1for await (const [key, value] of kv) console.log(key, value)entries方法接受扫描选项.
{\fn华文楷体\fs16\1che0e0e0}你可以使用for await (const [key, value] of kv.entries({ limit: 100, reverse: false, start: "alpha", // inclusive end: "omega", // exclusive })) console.log(key, value)collect助手从@e280/stz以数组形式获取条目/键/值:import {collect} from "@e280/stz" const entries = await collect(kv) // [["123", "alpha"], ["234", "bravo"]] const keys = await collect(kv.keys()) // ["123", "234"]keys财务报告和审定财务报表values。 。 。 . (接受扫描选项)for await (const key of kv.keys()) console.log(key) for await (const value of kv.values()) console.log(value)count条目数 在这个范围. (接受扫描选项)await kv.count() // 123clear删除全部 在这个范围. (接受扫描选项)await kv.clear()cell做一个小熊, 用于存储单个值.(执行)
@e280/stz是因为Cubby类型)const muffins = kv.cell<number>("muffins")await muffins.set(99)await muffins.has() // true or false await muffins.get() // number or undefined await muffins.need() // number or throws error
您可以通过键入await muffins.delete()Cell<X>您的应用程序周围的所有实例 .import {Cell} from "@e280/kv" class MuffinCaptain { constructor(public muffins: Cell<number>) {} }