@unikvs/lru-cache
@unikvs/lru-cache の LruCache。上限付きで任意の値を保持する LRU ストレージの使い方を説明します。
概要
@unikvs/lru-cache は上限付きで任意の値をメモリーに保持する LRU ストレージです。直近に使った値を残して古いものから追い出すため、キャッシュに使います。
nameはLruCacheです。open・closeが必要です。closeは保存値をすべて破棄します。maxEntries・maxBytesで上限を指定します。どちらも省略できます。sizeで件数を、bytesでバイト数(maxBytes設定時)を確認できます。
インストールは次のコマンドで行います。
npm install @unikvs/lru-cachepnpm add @unikvs/lru-cacheyarn add @unikvs/lru-cachebun add @unikvs/lru-cachenub add @unikvs/lru-cacheaube add @unikvs/lru-cache使い方
LruCache は IStorage を実装しています。UniKvs には persist() で渡します。
import { LruCache } from "@unikvs/lru-cache";
コンストラクターの引数は次のとおりです。
clone?(<T>(value: T) => T) | undefined
データの複製に使う関数です。省略した場合は structuredClone を使います。
(<T>(value: T) => T) | undefinedstructuredClonemaxEntries?number | undefined
保持する最大件数です。0 以上の整数を指定します。
number | undefinedmaxBytes?number | undefined
保持する最大バイト数です。0 以上の有限数を指定します。
number | undefinedsizeOf?((value: any, key: string) => number) | undefined
キーごとのバイト数を決める関数です。省略した場合は Uint8Array で byteLength、それ以外で 1 を使います。
((value: any, key: string) => number) | undefined以下は、件数に上限を付けて値を保存する例です。
import { LruCache } from "@unikvs/lru-cache";
import * as unikvs from "unikvs";
const kvs = new unikvs.Builder<{
greeting: unikvs.PlainValue<string>;
}>()
.persist(new LruCache({ maxEntries: 100 }))
.build();
await kvs.open();
await kvs.set("greeting", "hello");
const value = await kvs.get("greeting");
console.log(value); // "hello"
await kvs.close();
データ型
| 操作 | 対応するデータ型 |
|---|---|
write・read |
任意の値(文字列・オブジェクトなど) |
getWritable・getReadable のチャンク |
Uint8Array<ArrayBuffer> |
- 任意の値を保存できます。文字列やオブジェクトなど、
structuredCloneで複製できる値を扱います。 - 読み書きする値は既定では
structuredCloneで複製します。複製方法はコンストラクターのcloneで変更できます。 maxEntriesを超えたときは、直近に使っていないキーから追い出します。maxEntriesが0の場合は何も保存しません。maxBytesを設定した場合は、合計バイト数が上限を超えないよう古いキーから追い出します。- ストリームのチャンクは
Uint8Array<ArrayBuffer>のみに対応します。 getWritableで取得したストリームは、書き込まれたチャンクを結合し、close時に保存します。getReadableで取得したストリームは、保存値を単一チャンクとして送出します。保存値がUint8Arrayでない場合はInvalidChunkTypeErrorを投げます。
エラー
このパッケージが投げるエラーは次のとおりです。
KeyNotFoundError
意味
指定したキーが存在しない場合に投げます。@unikvs/core の共通エラーです。
対処方法
exists で確認してから読み出してください。
例
以下は、KeyNotFoundError を捕捉する例です。
import { KeyNotFoundError } from "@unikvs/lru-cache";
try {
await kvs.get("missing-key");
} catch (ex) {
if (ex instanceof KeyNotFoundError) {
console.log("キーが見つかりません");
} else {
throw ex;
}
}
InvalidChunkTypeError
意味
ストリームに Uint8Array<ArrayBuffer> 以外のチャンクを書き込んだ場合や、保存値が Uint8Array でないのに getReadable を呼んだ場合に投げます。
対処方法
ストリームには Uint8Array のチャンクを書き込んでください。getReadable を使う値はバイト列で保存してください。
InvalidMaxEntriesError
actualunknown
指定された maxEntries の値です。
unknown意味
コンストラクターの maxEntries が 0 以上の整数でない場合に投げます。
対処方法
maxEntries に 0 以上の整数を指定してください。
InvalidMaxBytesError
actualunknown
指定された maxBytes の値です。
unknown意味
コンストラクターの maxBytes が 0 以上の有限数でない場合に投げます。
対処方法
maxBytes に 0 以上の有限数を指定してください。
InvalidSizeOfResultError
意味
sizeOf の戻り値が 0 以上の有限数でない場合に投げます。
対処方法
sizeOf が 0 以上の有限数を返すように修正してください。