discordjs-nextgen-cache
v1.0.5
Published
Production-ready caching system for discordjs-nextgen
Maintainers
Readme
discordjs-nextgen-cache
Turkish Documentation (Türkçe Dökümantasyon)
A flexible, high-performance, and production-ready caching system designed specifically for the discordjs-nextgen framework.
🚀 Features
- Adapter-Based Architecture: Seamlessly switch between Memory (default) and Redis.
- Framework Agnostic: While optimized for
discordjs-nextgen, the core logic remains decoupled. - Pluggable System: Easy integration using the
CachePlugin. - Intelligent Namespacing: Built-in support for
user,guild, andchannelsnamespaces to prevent key collisions. - Smart
wrapMethod: Automatically fetch, cache, and return data in a single call. - Dynamic Imports: Redis dependencies are only loaded if you use the
RedisAdapter. - Full TypeScript Support: Module augmentation for
AppandContexttypes.
📦 Installation
npm install discordjs-nextgen-cacheIf you plan to use Redis:
npm install ioredis🛠️ Setup
Basic (Memory)
import { App } from 'discordjs-nextgen';
import { CachePlugin } from 'discordjs-nextgen-cache';
const app = new App();
// Uses MemoryAdapter by default
app.use(new CachePlugin());
app.run('TOKEN');Advanced (Redis)
import { App } from 'discordjs-nextgen';
import { CachePlugin, RedisAdapter } from 'discordjs-nextgen-cache';
const app = new App();
app.use(new CachePlugin({
adapter: new RedisAdapter({
host: 'localhost',
port: 6379,
password: 'your_password'
})
}));
app.run('TOKEN');💡 Usage
Once the plugin is installed, you can access the cache via app.cache or ctx.cache (inside commands/events).
Basic Operations
// Set value with 1 minute TTL (milisec)
await ctx.cache.set('my_key', { hello: 'world' }, 60000);
// Get value
const data = await ctx.cache.get('my_key');
// Delete value
await ctx.cache.delete('my_key');
// Clear all cache
await ctx.cache.clear();Namespaces (Recommended)
Namespaces automatically prefix your keys (e.g., user:ID) to keep your cache organized.
// User namespace
await ctx.cache.user.set(ctx.user.id, { coins: 100 });
const coins = await ctx.cache.user.get(ctx.user.id);
// Guild namespace
await ctx.cache.guild.set(ctx.guild.id, { settings: true });
// Channels namespace
await ctx.cache.channels.get(channelId);The wrap Method
The wrap method is the most efficient way to handle "Cache-Aside" logic. It checks the cache first; if the data is missing, it executes your function, stores the result, and returns it.
const profile = await ctx.cache.wrap(`profile:${userId}`, async () => {
// This function only runs if cache is empty
return await db.users.findUnique({ where: { id: userId } });
}, 300000); // Cache for 5 minutes🏗️ Architecture
core/Cache: The main logic handler.adapters/: ContainsMemoryAdapterandRedisAdapter.CachePlugin: Injects the cache instance into thediscordjs-nextgenlifecycle.
📄 License
Apache-2.0
