วันก่อนเห็นมีคนแชร์กัน เกี่ยวกับ Keyv ซึ่งเป็นตัวจัดการข้อมูลแบบ key-value โดยที่เราสามารถเปลี่ยนที่จัดเก็บได้ด้วย adapter ต่างๆ
ประกอบไปด้วย

  • Redis
  • ValKey
  • MongoDB
  • SQLite
  • PostgreSQL
  • MySQL
  • etcd
  • Memcached
  • หรือทำการ custom adapter ได้อีกด้วย

และยังมีการบีบอัดข้อมูลที่จัดเก็บ เช่น gzip และ brotli เป็นต้น
มาเริ่มทำความรู้จักกัน


มาลองใช้งานกันเลย

  • ใช้งาน Redis หรือ SQLite ในการจัดเก็บข้อมูลผ่าน Adapter
  • การ monitoring ผ่าน Hook
  • ใช้งาน namespace เพื่อจัดการข้อมูลแต่ละกลุ่ม

การใช้งาน Redis หรือ SQLite

// Redis
import KeyvRedis from '@keyv/redis';
const keyv = new Keyv(new KeyvRedis('redis://user:pass@localhost:6379'));

// SQLite
import KeyvSqlite from '@keyv/sqlite';
const keyvSqlite = new KeyvSqlite('sqlite://path/to/database.sqlite');
const keyv = new Keyv({ store: keyvSqlite, ttl: 5000, namespace: 'cache' });

การเรียกใช้งานั้น

await keyv.set('foo', 'expires in 1 second', 1000);
await keyv.set('foo', 'never expires');
await keyv.get('foo');
await keyv.delete('foo');
await keyv.clear();

การ monitoring ผ่าน Hook

const keyv = new Keyv();
keyv.hooks.addHandler(KeyvHooks.PRE_SET, (key, value) => console.log(`Setting key ${key} to ${value}`));

const keyv = new Keyv();
keyv.hooks.addHandler(KeyvHooks.POST_SET, (key, value) => console.log(`Set key ${key} to ${value}`));

Namespace

ทั้งนี้เรายังสามารถการใช้งาน namespace เพื่อจัดการข้อมูลแต่ละกลุ่ม

const users = new Keyv('redis://user:pass@localhost:6379', { namespace: 'users' });
const cache = new Keyv('redis://user:pass@localhost:6379', { namespace: 'cache' });

// Set a key-value pair using the key 'foo' in both namespaces
await users.set('foo', 'users'); // returns true
await cache.set('foo', 'cache'); // returns true

// Retrieve a Value
await users.get('foo'); // returns 'users'
await cache.get('foo'); // returns 'cache'

// Delete all values for the specified namespace
await users.clear();

References: