@gabrielpotter/lru-lfu-cache
Version:
94 lines (89 loc) • 4.91 kB
text/typescript
import { UnifiedCache } from "../src";
describe("LRU test", () => {
it("simple set,get", async () => {
const cache = new UnifiedCache<string, string>(100, 1024 * 1024, "LRU");
await cache.set("key1", "data1");
const data = await cache.get("key1");
expect(data).toEqual("data1");
});
it("delete the lru item cache item limit", async () => {
const cache = new UnifiedCache<string, string>(3, 1024 * 1024, "LRU");
await cache.set("key1", "data1");
await cache.set("key2", "data2");
await cache.set("key3", "data3"); // key3 -> key2 -> key1 : insert to head
const data2 = await cache.get("key2"); // key2 -> key3 -> key1 : move to head
expect(data2).toEqual("data2");
await cache.set("key4", "data4"); //size limit key4 -> key2 -> key3 : insert head remove tail
const data1 = await cache.get("key1");
expect(data1).toEqual(undefined);
await cache.set("key5", "data5"); //size limit key5 -> key4 -> key2 : insert head remove tail
const data3 = await cache.get("key3");
expect(data3).toEqual(undefined);
await cache.get("key2");
await cache.get("key5"); // key5 -> key2 -> key4
await cache.set("key6", "data6"); // key6 -> key5 -> key2
const data4 = await cache.get("key4");
expect(data4).toEqual(undefined);
});
it("delete the lru item cache memory limit", async () => {
const cache = new UnifiedCache<string, string>(10, 100, "LRU");
await cache.set("key1", "data112345678");
await cache.set("key2", "data212345678");
await cache.set("key3", "data312345678"); // key3 -> key2 -> key1 : insert to head
const data2 = await cache.get("key2"); // key2 -> key3 -> key1 : move to head
await cache.set("key4", "data412345678"); //size limit key4 -> key2 -> key3 : insert head remove tail
const data1 = await cache.get("key1");
await cache.set("key5", "data512345678"); //size limit key5 -> key4 -> key2 : insert head remove tail
const data3 = await cache.get("key3");
await cache.get("key2");
await cache.get("key5"); // key5 -> key2 -> key4
await cache.set("key6", "data612345678"); // key6 -> key5 -> key2
const data4 = await cache.get("key4");
expect(data2).toEqual("data212345678");
expect(data1).toEqual(undefined);
expect(data3).toEqual(undefined);
expect(data4).toEqual(undefined);
const stat = cache.getStats();
expect(stat).toEqual({ strategy: "LRU", currentNodes: 3, maxNodes: 10, currentMemory: 78, maxMemory: 100,absHitRate:0.5,relHitRate:0.5 });
});
it("delete the lru item cache item limit", async () => {
const cache = new UnifiedCache<string, string>(3, 1024 * 1024, "LRU");
await cache.set("key1", "data1");
await cache.set("key2", "data2");
await cache.set("key3", "data3"); // key3 -> key2 -> key1 : insert to head
const data2 = await cache.get("key2"); // key2 -> key3 -> key1 : move to head
expect(data2).toEqual("data2");
await cache.set("key4", "data4"); //size limit key4 -> key2 -> key3 : insert head remove tail
const data1 = await cache.get("key1");
expect(data1).toEqual(undefined);
await cache.set("key5", "data5"); //size limit key5 -> key4 -> key2 : insert head remove tail
const data3 = await cache.get("key3");
expect(data3).toEqual(undefined);
await cache.get("key2");
await cache.get("key5"); // key5 -> key2 -> key4
await cache.set("key6", "data6"); // key6 -> key5 -> key2
const data4 = await cache.get("key4");
expect(data4).toEqual(undefined);
});
it("remove specified cache item", async () => {
const cache = new UnifiedCache<string, string>(3, 1024 * 1024, "LRU");
await cache.set("key1", "data1");
await cache.set("key2", "data2");
await cache.set("key3", "data3"); // key3 -> key2 -> key1 : insert to head
const data2 = await cache.get("key2"); // key2 -> key3 -> key1 : move to head
expect(data2).toEqual("data2");
await cache.remove("key2"); // key3 -> key1
const data1 = await cache.get("key1"); //key1 -> key3
expect(data1).toEqual("data1");
const data3 = await cache.get("key2")
expect(data3).toEqual(undefined);
// await cache.set("key5", "data5"); //size limit key5 -> key4 -> key2 : insert head remove tail
// const data3 = await cache.get("key3");
// expect(data3).toEqual(undefined);
// await cache.get("key2");
// await cache.get("key5"); // key5 -> key2 -> key4
// await cache.set("key6", "data6"); // key6 -> key5 -> key2
// const data4 = await cache.get("key4");
// expect(data4).toEqual(undefined);
});
});