A caching extension for Prisma, compatible with cache-manager.
- cache-manager v6 compatibility
- Only model queries can be cacheable (no $query or $queryRaw)
- Uses object-code as default key generator, but you can pass a custom one
Because cache-manager
needs a keyv
compatible store, string serialization is mandatory.
v8
object serialization is good enough to serialize JavaScript native types like BigInt
or Date
,
but be aware that it cannot serialize Prisma's Decimal
type for example.
Install:
npm i prisma-extension-cache-manager cache-manager cacheable keyv
import v8 from 'node:v8';
import { PrismaClient } from '@prisma/client';
import { KeyvCacheableMemory } from 'cacheable';
import Keyv from 'keyv';
import * as cm from 'cache-manager';
import cacheExtension from 'prisma-extension-cache-manager';
async function main() {
const cache = cm.createCache({
ttl: defaultTtl,
stores: [
new Keyv({
store: new KeyvCacheableMemory({ ttl: defaultTtl }),
serialize: (x) => v8.serialize(x).toString('base64'),
deserialize: (s) => v8.deserialize(Buffer.from(s, 'base64')),
}),
],
});
const prisma = new PrismaClient().$extends(cacheExtension({ cache }));
await prisma.user.findUniqueOrThrow({
where: {
email: user.email,
},
cache: true, // using cache default settings
});
await prisma.user.findMany({
cache: 5000, // setting ttl in milliseconds
});
await prisma.user.count({
cache: {
ttl: 2000,
key: 'user_count', // custom cache key
},
});
}
main().catch(console.error);