{"_id":"@databuddy/cache","_rev":"9-5b5d5534fc5bec8330db27930bb3b7dd","name":"@databuddy/cache","dist-tags":{"latest":"0.0.120"},"versions":{"0.0.1":{"name":"@databuddy/cache","version":"0.0.1","_id":"@databuddy/cache@0.0.1","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"dist":{"shasum":"887a7531997a33617295c217b100cc8cb44e38cf","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.1.tgz","fileCount":6,"integrity":"sha512-KuTICns+iNfzlyzEyFz1kZfaSxV7NCPac9Lhp62cgSvS1uDu+smTcjRkpp/e2Tor6HAfYcTmDvDaMM4UiZbKaA==","signatures":[{"sig":"MEUCIFUSUBejvsUfOU3AgMo2mN1A3Q25JoBIwsqNMoY1kcdEAiEA0fXdEoxtcaIQBr4OuZBk347tVsirFUGCWlTguu5VvCM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51252},"main":"./dist/drizzle.js","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"}},"gitHead":"3e06e49453ffbce3d4afe073f9746d5566d273e7","private":false,"scripts":{"build":"bun run build.ts"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"_npmVersion":"11.6.2","description":"A Redis-based caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.1_1765575271299_0.4946402522169282","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@databuddy/cache","version":"0.0.10","_id":"@databuddy/cache@0.0.10","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"dist":{"shasum":"5f44248954a569421e091de623ca5b8c89184bf8","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.10.tgz","fileCount":5,"integrity":"sha512-KdlBbzQ+Xp1W88i/d7JD/uhe6eZlwme+ScGBHBbS1gGPGjOpQGHQsHB4p/W3HGvKtB0yINeoJnofiSMlQ583Yw==","signatures":[{"sig":"MEUCIQCCEXOkxeFnORX+k5B5BaKrJeBbqHIUpWP7UPgHDW1FAwIgSxkoMRA9lGkyYd06db64WmSKsEKU4nqgUxnoOSpJphE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27566},"main":"./dist/drizzle.js","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"}},"gitHead":"792fe80bc941f1230208a8fa3f0195a8b55c9e9f","private":false,"scripts":{"build":"bun run build.ts"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"_npmVersion":"11.6.2","description":"A Redis-based caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ioredis":"^5.8.2","drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.10_1765577061103_0.5028103448788181","host":"s3://npm-registry-packages-npm-production"}},"0.0.100":{"name":"@databuddy/cache","version":"0.0.100","_id":"@databuddy/cache@0.0.100","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"dist":{"shasum":"7a390ab680975892231bcf9c3cd65f10e07f4426","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.100.tgz","fileCount":3,"integrity":"sha512-a5UV9V5EXPFZuka24Z/tS1gAhslodFzQavQ+w/VfuUcM7CiT0AZQaO4hc0OBP0Yn01y/eFHw0uMwVf9RUGOMgA==","signatures":[{"sig":"MEUCIFXbXt8DF1ouiPc4FLlKoJniSLdMYp9TFb36hgpnK/hkAiEA0cYJf17r+okAzrBqC1NiYC7LJHmv8bBobBUcOwx1XlI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12606},"main":"./dist/drizzle.js","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"}},"gitHead":"792fe80bc941f1230208a8fa3f0195a8b55c9e9f","private":false,"scripts":{"build":"rm -rf dist && bun run build.ts"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"_npmVersion":"11.6.2","description":"A Redis-based caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ioredis":"^5.8.2","drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.100_1765577150916_0.7715915950291068","host":"s3://npm-registry-packages-npm-production"}},"0.0.110":{"name":"@databuddy/cache","version":"0.0.110","_id":"@databuddy/cache@0.0.110","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"dist":{"shasum":"83c68ddc4bdb14ef85baff345deea0c927bd60ce","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.110.tgz","fileCount":4,"integrity":"sha512-69SlOBZLF8nKyGPgcEKwM+nJsURIvC+krS9KyPbTkwNgp+bDyMVXZ5jSPdsu190/IatwIPeAMOL/astbtPNzzw==","signatures":[{"sig":"MEUCIQC9PYOK3A9PW+iABwAvSeo0zXlxa06YME3sYyIcP55RcgIgYoneS5SaHzXt5Xe0nylNvBSh4rW1POUdeE0a9ORQn8Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35792},"main":"./dist/drizzle.js","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"}},"gitHead":"fb9c983d3ccc8d8938242026f5d9fb0981da4641","private":false,"scripts":{"build":"rm -rf dist && bun run build.ts"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"_npmVersion":"11.6.2","description":"A Redis-based caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ioredis":"^5.8.2","drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.110_1765618322431_0.015205126396957258","host":"s3://npm-registry-packages-npm-production"}},"0.0.111":{"name":"@databuddy/cache","version":"0.0.111","keywords":["cache","caching","drizzle","drizzle-orm","redis","query-cache","database","orm","typescript"],"license":"AGPL-3.0","_id":"@databuddy/cache@0.0.111","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"homepage":"https://databuddy.cc","bugs":{"url":"https://github.com/databuddy-analytics/databuddy/issues"},"dist":{"shasum":"aa48a8703b0d709d53806f7725d422e69cec63c5","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.111.tgz","fileCount":4,"integrity":"sha512-BQJnMWzZWe9oZEggtC7KCb+jni6RxcPOjctFVuWqy46a7YP/3Gz/gvHpMmDCnZt8yCO7jkl/YmTzVijLQJqHWQ==","signatures":[{"sig":"MEYCIQCBGXHQQK5UWbCAqFcNswKn36/iYhrNabfpqIybzVfuRwIhAKKta/BgZ/EMYeLAFQhmjuMXTjxnHGQI2rsAZIHdgoQE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36392},"main":"./dist/drizzle.js","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"}},"gitHead":"451a73d77167d29b4a040ab217454738ad72616c","private":false,"scripts":{"build":"rm -rf dist && bun run build.ts"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"repository":{"url":"git+https://github.com/databuddy-analytics/databuddy.git","type":"git","directory":"packages/cache"},"_npmVersion":"11.6.2","description":"A generic caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ioredis":"^5.8.2","drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.111_1765621734400_0.020192657126725466","host":"s3://npm-registry-packages-npm-production"}},"0.0.112":{"name":"@databuddy/cache","version":"0.0.112","keywords":["cache","caching","drizzle","drizzle-orm","redis","query-cache","database","orm","typescript"],"license":"MIT","_id":"@databuddy/cache@0.0.112","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"homepage":"https://databuddy.cc","bugs":{"url":"https://github.com/databuddy-analytics/databuddy/issues"},"dist":{"shasum":"df26abf2b4e101fbd3c51065e2e501fc59bbd339","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.112.tgz","fileCount":5,"integrity":"sha512-tYLG3h3c0aaM6SOBYi9virui5MJrSJzk+Q8sSJMv50k16hnqqZK6fikU33sgN6Eu1T//nBcSmgvlAzJFHY0xgQ==","signatures":[{"sig":"MEUCIF6vJWIN3pl3UikQY8Pw8nE9+EkEr6c7EC2TA4o04WFcAiEA2Bez8juhRJHbZJ52bBp8xMq6UUuAS0PdNTO8+WX9iKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37479},"main":"./dist/drizzle.js","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"}},"gitHead":"451a73d77167d29b4a040ab217454738ad72616c","private":false,"scripts":{"build":"rm -rf dist && bun run build.ts"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"repository":{"url":"git+https://github.com/databuddy-analytics/databuddy.git","type":"git","directory":"packages/cache"},"_npmVersion":"11.6.2","description":"A generic caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ioredis":"^5.8.2","drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.112_1765625013039_0.36348357057997327","host":"s3://npm-registry-packages-npm-production"}},"0.0.113":{"name":"@databuddy/cache","version":"0.0.113","keywords":["cache","caching","drizzle","drizzle-orm","redis","query-cache","database","orm","typescript"],"license":"MIT","_id":"@databuddy/cache@0.0.113","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"homepage":"https://databuddy.cc","bugs":{"url":"https://github.com/databuddy-analytics/databuddy/issues"},"dist":{"shasum":"8e891f7d99197ab55a926c79953dcfc6126579b7","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.113.tgz","fileCount":6,"integrity":"sha512-ZdzCzI4GGLtXtmc++mYC5uL7hJ6oKT/1edgfufyPGJPP2ZauM1ZuK23FmmYtFD+pZSZtLhbgm6PLAwvMNFEL5w==","signatures":[{"sig":"MEQCIAaCCcge8C2v9YYvK/0iA1IrIrzyPa3aoMbUO4ER0rrCAiADirGVo3syyop2q0L7gQVOYYeFDaWZwac5dPjObcRWbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42827},"main":"./dist/drizzle.mjs","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.mjs"}},"gitHead":"344666da747219e31fc3f9231029cef9420169d3","private":false,"scripts":{"build":"rm -rf dist && unbuild","vscode:prepublish":"bun run build"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"repository":{"url":"git+https://github.com/databuddy-analytics/databuddy.git","type":"git","directory":"packages/cache"},"_npmVersion":"11.6.2","description":"A generic caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ioredis":"^5.8.2","unbuild":"^3.6.1","drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"unbuild":"^3.6.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.113_1765625627113_0.7429567594004123","host":"s3://npm-registry-packages-npm-production"}},"0.0.114":{"name":"@databuddy/cache","version":"0.0.114","keywords":["cache","caching","drizzle","drizzle-orm","redis","query-cache","database","orm","typescript"],"license":"MIT","_id":"@databuddy/cache@0.0.114","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"homepage":"https://databuddy.cc","bugs":{"url":"https://github.com/databuddy-analytics/databuddy/issues"},"dist":{"shasum":"f6f074e7ad58c9ee3567dca0b42b3b68561cec09","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.114.tgz","fileCount":6,"integrity":"sha512-+wVa1YE9tmXrPyvlkJAXBAWX/fetgVfY4E4JkL2C2+GGM9zhHJsiURTYx3lYIOI9HKa5rXGgED4bQw3pTnNfKw==","signatures":[{"sig":"MEYCIQDpYbUJvPPdU5ZWsVTwHHV7tqoiEHuS3Qz7aEAtR/JjEQIhAKPBsPtgWb8MKPVl/x/0XHMUJ2YwLNRM/3jKrkfZO+td","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42777},"main":"./dist/drizzle.mjs","type":"module","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.mjs"}},"gitHead":"344666da747219e31fc3f9231029cef9420169d3","private":false,"scripts":{"build":"rm -rf dist && unbuild","vscode:prepublish":"bun run build"},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"repository":{"url":"git+https://github.com/databuddy-analytics/databuddy.git","type":"git","directory":"packages/cache"},"_npmVersion":"11.6.2","description":"A generic caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation","directories":{},"_nodeVersion":"25.2.1","dependencies":{"drizzle-orm":"^0.45.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"unbuild":"^3.6.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.0.114_1765625704578_0.5575653326651144","host":"s3://npm-registry-packages-npm-production"}},"0.0.120":{"name":"@databuddy/cache","version":"0.0.120","description":"A generic caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation","type":"module","private":false,"main":"./dist/drizzle.mjs","types":"./dist/drizzle.d.ts","exports":{".":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.mjs"}},"scripts":{"build":"rm -rf dist && unbuild","vscode:prepublish":"bun run build"},"keywords":["cache","caching","drizzle","drizzle-orm","redis","query-cache","database","orm","typescript"],"license":"MIT","homepage":"https://databuddy.cc","repository":{"type":"git","url":"git+https://github.com/databuddy-analytics/databuddy.git","directory":"packages/cache"},"bugs":{"url":"https://github.com/databuddy-analytics/databuddy/issues"},"dependencies":{"drizzle-orm":"^0.45.1"},"devDependencies":{"typescript":"^5.9.3","unbuild":"^3.6.1"},"publishConfig":{"access":"public"},"gitHead":"e71ffa23713b2641ae9075deffedbc7307be4ee3","_id":"@databuddy/cache@0.0.120","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-3uA0y/ZEPE1ZcSshsJfNDmNfegEIbyok58BSM2JFgQsytMeGiKGaDEN+nq8qIEyqtdqQDRb5tykcp3M7BhNjrA==","shasum":"7f06f727b1e1af2ae74721f0cda4535fc1d7a400","tarball":"https://registry.npmjs.org/@databuddy/cache/-/cache-0.0.120.tgz","fileCount":6,"unpackedSize":42777,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFnh5L0kmTHgTENdLqAB9kG1QUTUlsM5EeiiBs8ObPb/AiEA4p5jlp3otqkdwtmNYvqP2dUBXZZ9PK0DjXkmM5FOGtg="}]},"_npmUser":{"name":"izadoesdev","email":"contact@databuddy.cc"},"directories":{},"maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cache_0.0.120_1765651508391_0.3409740398401584"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-12T21:34:31.179Z","modified":"2025-12-13T18:45:08.718Z","0.0.1":"2025-12-12T21:34:31.465Z","0.0.10":"2025-12-12T22:04:21.247Z","0.0.100":"2025-12-12T22:05:51.043Z","0.0.110":"2025-12-13T09:32:02.609Z","0.0.111":"2025-12-13T10:28:54.557Z","0.0.112":"2025-12-13T11:23:33.182Z","0.0.113":"2025-12-13T11:33:47.277Z","0.0.114":"2025-12-13T11:35:04.737Z","0.0.120":"2025-12-13T18:45:08.535Z"},"bugs":{"url":"https://github.com/databuddy-analytics/databuddy/issues"},"license":"MIT","homepage":"https://databuddy.cc","keywords":["cache","caching","drizzle","drizzle-orm","redis","query-cache","database","orm","typescript"],"repository":{"type":"git","url":"git+https://github.com/databuddy-analytics/databuddy.git","directory":"packages/cache"},"description":"A generic caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation","maintainers":[{"name":"izadoesdev","email":"contact@databuddy.cc"}],"readme":"# @databuddy/cache\n\nA Redis-based caching implementation for Drizzle ORM that provides automatic query result caching and intelligent cache invalidation.\n\n## Overview\n\n`@databuddy/cache` extends Drizzle ORM's base Cache class to provide Redis-backed caching for database queries. It automatically caches query results and invalidates cache entries when mutations occur on tracked tables, ensuring data consistency while improving query performance.\n\n## Features\n\n- Automatic query result caching with configurable TTL\n- Intelligent cache invalidation based on table mutations\n- Configurable caching strategies (explicit or automatic)\n- Namespace support for cache key isolation\n- TypeScript support with full type definitions\n\n## Installation\n\n```bash\nbun add @databuddy/cache drizzle-orm\n```\n\n## Quick Start\n\n### Basic Usage with ioredis\n\n```typescript\nimport Redis from \"ioredis\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { RedisDrizzleCache } from \"@databuddy/cache\";\nimport * as schema from \"./schema\";\n\n// Create Redis client\nconst redis = new Redis(process.env.REDIS_URL!);\n\n// Create cache instance\nconst cache = new RedisDrizzleCache({\n    redis,\n    defaultTtl: 300, // 5 minutes\n    strategy: \"all\", // Cache all queries\n    namespace: \"myapp:drizzle\"\n});\n\n// Use with Drizzle\nconst db = drizzle(connectionString, {\n    schema,\n    cache\n});\n\n// Queries are automatically cached\nconst users = await db.select().from(usersTable);\n\n// Mutations automatically invalidate related cache entries\nawait db.update(usersTable).set({ name: \"John\" }).where(eq(usersTable.id, 1));\n// Cache entries for 'users' table are now invalidated\n```\n\n\n## Configuration\n\n### RedisCacheConfig\n\n```typescript\ntype RedisCacheConfig = {\n    redis: RedisAdapter | unknown;\n    defaultTtl?: number;\n    strategy?: \"explicit\" | \"all\";\n    namespace?: string;\n};\n```\n\n#### redis\n\nThe Redis client instance from ioredis. Must be a connected `Redis` instance.\n\n```typescript\nimport Redis from \"ioredis\";\nconst redis = new Redis(process.env.REDIS_URL!);\n```\n\nThe client must support the following methods:\n- `get(key: string): Promise<string | null>` - Retrieve a value from Redis\n- `setex(key: string, seconds: number, value: string): Promise<unknown>` - Set a value with TTL\n- `unlink(...keys: string[]): Promise<unknown>` - Delete one or more keys (falls back to `del` if unavailable)\n\n#### defaultTtl\n\nDefault time-to-live for cached entries in seconds. Used when no explicit TTL is provided via CacheConfig.\n\n**Default:** `300` (5 minutes)\n\n```typescript\nconst cache = new RedisDrizzleCache({\n    redis,\n    defaultTtl: 600 // 10 minutes\n});\n```\n\n#### strategy\n\nCache strategy determines when queries are cached:\n\n- `\"all\"` - All queries are automatically cached (default)\n- `\"explicit\"` - Only queries explicitly marked with `.$withCache()` are cached\n\n**Default:** `\"all\"`\n\n```typescript\n// Explicit strategy\nconst cache = new RedisDrizzleCache({\n    redis,\n    strategy: \"explicit\"\n});\n\n// Only explicitly marked queries are cached\nconst users = await db\n    .select()\n    .from(usersTable)\n    .$withCache({\n        key: \"all-users\",\n        ttl: 600,\n        tables: [\"users\"]\n    });\n```\n\n#### namespace\n\nOptional namespace prefix for all cache keys. Useful for isolating cache entries from different applications or environments.\n\n**Default:** `\"drizzle\"`\n\n```typescript\nconst cache = new RedisDrizzleCache({\n    redis,\n    namespace: \"myapp:drizzle\" // Keys will be prefixed with \"myapp:drizzle:...\"\n});\n```\n\n## Cache Configuration (CacheConfig)\n\nWhen using explicit caching with `.$withCache()`, you can provide additional cache configuration:\n\n```typescript\nawait db.select().from(usersTable).$withCache({\n    key: \"users\",\n    ttl: 300,\n    tables: [\"users\"],\n    config: {\n        ex: 60,        // Expire in 60 seconds\n        // OR\n        px: 60000,     // Expire in 60000 milliseconds\n        // OR\n        exat: 1735689600, // Expire at Unix timestamp (seconds)\n        // OR\n        pxat: 1735689600000 // Expire at Unix timestamp (milliseconds)\n    }\n});\n```\n\n### CacheConfig Options\n\n- `ex` - Expiration time in seconds\n- `px` - Expiration time in milliseconds\n- `exat` - Unix timestamp (seconds) at which the key will expire\n- `pxat` - Unix timestamp (milliseconds) at which the key will expire\n- `keepTtl` - Retain existing TTL when updating a key\n\n## How It Works\n\n### Caching Strategy: \"all\"\n\nWhen using the `\"all\"` strategy, all queries are automatically cached:\n\n1. Before executing a query, Drizzle checks the cache using the query hash as the key\n2. If found, the cached result is returned immediately\n3. If not found, the query executes and the result is stored in cache with the configured TTL\n4. The cache tracks which tables each cached query depends on\n\n### Cache Invalidation\n\nWhen mutations (INSERT, UPDATE, DELETE) occur:\n\n1. Drizzle calls `onMutate()` with the affected tables\n2. The cache finds all cached queries associated with those tables\n3. Those cache entries are deleted\n4. Subsequent queries for those tables will execute fresh queries\n\n### Caching Strategy: \"explicit\"\n\nWhen using the `\"explicit\"` strategy:\n\n1. Only queries explicitly marked with `.$withCache()` are cached\n2. You must provide a cache key, TTL, and associated tables\n3. Cache invalidation works the same way based on table mutations\n\n## API Reference\n\n### RedisDrizzleCache\n\n#### Constructor\n\n```typescript\nnew RedisDrizzleCache(config: RedisCacheConfig): RedisDrizzleCache\n```\n\nCreates a new RedisDrizzleCache instance.\n\n#### Methods\n\n##### strategy()\n\n```typescript\nstrategy(): \"explicit\" | \"all\"\n```\n\nReturns the cache strategy being used.\n\n##### get()\n\n```typescript\nget(key: string): Promise<any[] | undefined>\n```\n\nRetrieves cached data for a given query key. Called automatically by Drizzle.\n\n**Parameters:**\n- `key` - The hashed query key to look up in cache\n\n**Returns:** The cached query result as an array, or `undefined` if not found\n\n##### put()\n\n```typescript\nput(\n    key: string,\n    response: any,\n    tables: string[],\n    isTag: boolean,\n    config?: CacheConfig\n): Promise<void>\n```\n\nStores query results in the cache. Called automatically by Drizzle after executing a query.\n\n**Parameters:**\n- `key` - The hashed query key used as the cache key\n- `response` - The query result to cache (will be JSON stringified)\n- `tables` - Array of table names involved in the query (used for invalidation)\n- `isTag` - Whether this is a tag-based cache entry\n- `config` - Optional cache configuration for TTL and expiration\n\n##### onMutate()\n\n```typescript\nonMutate(params: {\n    tags?: string | string[];\n    tables?: string | string[] | Table<any> | Table<any>[];\n}): Promise<void>\n```\n\nInvalidates cache entries when mutations occur. Called automatically by Drizzle when mutations are executed.\n\n**Parameters:**\n- `params.tags` - Optional tag(s) to invalidate (for tag-based invalidation)\n- `params.tables` - Table(s) that were mutated (can be Table objects or strings)\n\n## Examples\n\n### Basic Setup\n\n```typescript\nimport Redis from \"ioredis\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { RedisDrizzleCache } from \"@databuddy/cache\";\nimport { users, posts } from \"./schema\";\n\nconst redis = new Redis(process.env.REDIS_URL!);\n\nconst cache = new RedisDrizzleCache({\n    redis,\n    defaultTtl: 300,\n    strategy: \"all\",\n    namespace: \"myapp\"\n});\n\nconst db = drizzle(connectionString, {\n    schema: { users, posts },\n    cache\n});\n```\n\n### Explicit Caching\n\n```typescript\nconst cache = new RedisDrizzleCache({\n    redis,\n    strategy: \"explicit\"\n});\n\n// Only this query will be cached\nconst popularPosts = await db\n    .select()\n    .from(posts)\n    .where(gt(posts.views, 1000))\n    .$withCache({\n        key: \"popular-posts\",\n        ttl: 600,\n        tables: [\"posts\"]\n    });\n```\n\n### Custom TTL per Query\n\n```typescript\n// Using explicit caching with custom TTL\nconst users = await db\n    .select()\n    .from(usersTable)\n    .$withCache({\n        key: \"all-users\",\n        ttl: 1800, // 30 minutes\n        tables: [\"users\"],\n        config: {\n            ex: 1800\n        }\n    });\n```\n\n\n## Error Handling\n\nThe cache implementation handles errors gracefully:\n\n- Cache GET failures return `undefined` and log errors to console\n- Cache PUT failures log errors but don't throw\n- Cache invalidation failures are logged but don't interrupt the mutation\n\nThis ensures that cache failures don't break your application - queries will simply execute without caching.\n\n## Performance Considerations\n\n- Cache hits avoid database queries entirely, significantly improving response times\n- Cache invalidation is performed in parallel for better performance\n- Table-to-key tracking is maintained in memory for fast invalidation lookups\n- Redis operations are non-blocking and asynchronous\n\n## TypeScript Support\n\nFull TypeScript support is provided with comprehensive type definitions:\n\n```typescript\nimport type { RedisCacheConfig } from \"@databuddy/cache\";\n\nconst config: RedisCacheConfig = {\n    redis: myRedisClient,\n    defaultTtl: 300,\n    strategy: \"all\",\n    namespace: \"myapp\"\n};\n```\n\n## Requirements\n\n- Drizzle ORM ^0.45.1\n- ioredis ^5.8.2\n- A Redis server (local or remote)\n\n## License\n\nSee the main repository license.","readmeFilename":"README.md"}