Skip to content

jkelin/cache-sqlite-lru-ttl

Repository files navigation

SQLite cache with LRU and TTL eviction

coverage NPM npm version

SQLite is great for high-performance local cache. This library is perfectly viable for caching strings, objects or whole files. Caching files in SQLite is generally faster than storing them in a filesystem. This library tries to have sane defaults and features:

  • TTL eviction mechanism which allows you to set maximum datetime to expire an item
  • LRU eviction mechanism that enforces that no more than maxItems will be cached based on least recent get
  • Optional value compression with gzip
  • Values encoded with CBOR which is like JSON, but is binary and serializes Buffer and Date
  • Inspired by node-cache-manager-sqlite but with easier configuration, TypeScript, LRU and compression
  • Make sure to call await cache.close() during graceful shutdown of your application to ensure SQLite is properly persisted to disk

Basic usage

  import SqliteCache from `cache-sqlite-lru-ttl`

  const cache = new SqliteCache({
    database: ':memory:', // or path to your database on disk
    defaultTtlMs: 1000 * 60 * 60, // optional TTL in milliseconds
    maxItems: 1000, // optional LRU
    compress: true, // use gzip for values > 1024 bytes, can be smaller, but slower
  });

  await cache.set('bar', 'baz')

  await cache.get('bar') // 'baz' 🎉

More usage

  import SqliteCache from `cache-sqlite-lru-ttl`

  const cache = new SqliteCache({
    database: './cache.db',
  });

  await cache.set('obj', {
    a: 5,
    b: true,
    c: new Date(), // you can store dates because CBOR
    d: Buffer.from("hello world")
  })

  await cache.set('bar', 'baz', {
    ttlMs: 60 * 1000, // short LRU for this item
    compress: false, // disable compression for this item
  })

  await cache.delete('bar') // delete 'bar'

  await cache.clear() // delete everything

  await cache.close() // close the database once you are done using it (usually during graceful shutdown of your application server)