{"id":26704954,"url":"https://github.com/stacksjs/ts-cache","last_synced_at":"2026-05-08T08:12:28.430Z","repository":{"id":284467088,"uuid":"955031286","full_name":"stacksjs/ts-cache","owner":"stacksjs","description":"⚡ A fast, type-safe, and feature-rich caching library for modern applications.","archived":false,"fork":false,"pushed_at":"2025-03-26T03:27:06.000Z","size":0,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-26T03:29:12.187Z","etag":null,"topics":["bun","cache","in-memory","library","nodejs","typescript"],"latest_commit_sha":null,"homepage":"https://ts-cache.netlify.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stacksjs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["stacksjs","chrisbbreuer"],"open_collective":"stacksjs"}},"created_at":"2025-03-26T02:07:56.000Z","updated_at":"2025-03-26T03:27:08.000Z","dependencies_parsed_at":"2025-03-26T03:39:20.497Z","dependency_job_id":null,"html_url":"https://github.com/stacksjs/ts-cache","commit_stats":null,"previous_names":["stacksjs/ts-cache"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacksjs%2Fts-cache","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacksjs%2Fts-cache/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacksjs%2Fts-cache/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacksjs%2Fts-cache/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stacksjs","download_url":"https://codeload.github.com/stacksjs/ts-cache/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245785973,"owners_count":20671659,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bun","cache","in-memory","library","nodejs","typescript"],"created_at":"2025-03-27T05:19:40.301Z","updated_at":"2026-05-08T08:12:28.418Z","avatar_url":"https://github.com/stacksjs.png","language":"TypeScript","funding_links":["https://github.com/sponsors/stacksjs","https://github.com/sponsors/chrisbbreuer","https://opencollective.com/stacksjs"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg src=\".github/art/cover.jpg\" alt=\"Social Card of this repo\"\u003e\u003c/p\u003e\n\n[![npm version](https://img.shields.io/npm/v/@stacksjs/ts-cache.svg)](https://www.npmjs.com/package/ts-cache)\n[![License](https://img.shields.io/npm/l/@stacksjs/ts-cache.svg)](https://github.com/stacksjs/ts-cache/blob/main/LICENSE)\n[![Bundle Size](https://img.shields.io/bundlephobia/minzip/@stacksjs/ts-cache)](https://bundlephobia.com/package/@stacksjs/ts-cache)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.8%2B-blue)](https://www.typescriptlang.org/)\n\n# ts-cache\n\nA high-performance, type-safe caching library for TypeScript and JavaScript applications with support for multiple storage drivers including in-memory and Redis (using Bun's native Redis client).\n\n## Features\n\n- 🚀 **Multiple Drivers** - Memory, Memory-LRU, and Redis (using Bun's native client)\n- 🔄 **Async \u0026 Sync APIs** - Promise-based async API with legacy sync support\n- ⏱️ **Flexible TTL** - Per-key TTL with fixed, sliding window, and probabilistic strategies\n- 📦 **Batch Operations** - Efficient mset/mget for multiple keys at once\n- 🏷️ **Tagging System** - Organize and invalidate cache entries by tags\n- 🔀 **Caching Patterns** - Cache-aside, read-through, write-through, write-behind, refresh-ahead, multi-level\n- 🎯 **CLI Tool** - Complete command-line interface with 11 commands\n- 🗜️ **Compression** - gzip, brotli, and smart compression with configurable thresholds\n- 🛡️ **Type Safety** - Full TypeScript support with generics\n- 🔧 **Highly Configurable** - 27+ configuration options for fine-tuned control\n\n## Performance\n\n**ts-cache can be faster than lru-cache!** 🏆\n\nWith ultra-fast mode enabled, ts-cache achieves:\n\n- **GET: 3.90 ns** (3.2x faster than lru-cache's 12.37 ns)\n- **SET: 30.24 ns** (1.3x faster than lru-cache's 39.52 ns)\n\nEnable ultra-fast mode for maximum performance:\n\n```typescript\nconst cache = new Cache({\n  useClones: false, // Store references (no cloning)\n  enableStats: false, // Disable statistics\n  enableEvents: false, // Disable events\n  stdTTL: 0, // Disable TTL checking\n  checkPeriod: 0, // Disable expiration checks\n  maxPerformance: true, // Use Map storage\n})\n\n// Now faster than lru-cache!\ncache.set('key', value) // 30ns vs lru-cache 40ns\ncache.get('key') // 4ns vs lru-cache 12ns\n```\n\nSee [benchmarks](./benchmarks/ULTRA-FAST-MODE.md) for details.\n\n## Installation\n\n```bash\n# Using npm\nnpm install @stacksjs/ts-cache\n\n# Using yarn\nyarn add @stacksjs/ts-cache\n\n# Using pnpm\npnpm add @stacksjs/ts-cache\n\n# Using bun\nbun add @stacksjs/ts-cache\n```\n\n## Quick Start\n\n### Memory Cache (Default)\n\n```typescript\nimport { createCache } from '@stacksjs/ts-cache'\n\nconst cache = createCache() // Uses memory driver by default\n\n// Store a value (with 5 minute TTL)\nawait cache.set('user:123', { name: 'John', role: 'admin' }, 300)\n\n// Retrieve a value with type safety\nconst user = await cache.get\u003c{ name: string, role: string }\u003e('user:123')\nif (user) {\n  console.log(user.name) // TypeScript knows this is a string\n}\n\n// Check if a key exists\nif (await cache.has('user:123')) {\n  // Key exists and is not expired\n}\n\n// Delete a key\nawait cache.del('user:123')\n```\n\n### Redis Cache (Bun Native)\n\n```typescript\nimport { createCache } from '@stacksjs/ts-cache'\n\nconst cache = createCache({\n  driver: 'redis',\n  url: 'redis://localhost:6379',\n  prefix: 'myapp',\n  stdTTL: 3600, // Default TTL: 1 hour\n})\n\n// Same API as memory cache\nawait cache.set('session:abc', { userId: 1 })\nconst session = await cache.get('session:abc')\n\n// Close connection when done\nawait cache.close()\n```\n\n## Advanced Features\n\n### Namespaces\n\nIsolate cache data with namespaced prefixes:\n\n```typescript\nconst cache = createCache()\n\n// Create namespaced caches\nconst userCache = cache.namespace('users')\nconst postCache = cache.namespace('posts')\n\nawait userCache.set('1', { name: 'Alice' })\nawait postCache.set('1', { title: 'Hello World' })\n\n// No collision between namespaces\nconsole.log(await userCache.get('1')) // { name: 'Alice' }\nconsole.log(await postCache.get('1')) // { title: 'Hello World' }\n```\n\n### Tagging\n\nOrganize and invalidate cache by tags:\n\n```typescript\n// Set values with tags\nawait cache.set('user:1', { name: 'John' })\nawait cache.tag('user:1', ['users', 'active'])\n\nawait cache.set('user:2', { name: 'Jane' })\nawait cache.tag('user:2', ['users', 'premium'])\n\n// Get all keys by tag\nconst userKeys = await cache.getKeysByTag('users')\n\n// Delete all entries with a tag\nawait cache.deleteByTag('users')\n```\n\n### Remember Pattern\n\nLaravel-style remember pattern for fetch-or-compute:\n\n```typescript\n// Fetch from cache or compute if missing\nconst user = await cache.remember('user:1', 60, async () =\u003e {\n  // Only called if cache miss\n  return await database.getUser(1)\n})\n\n// Remember forever (no expiration)\nconst config = await cache.rememberForever('config', async () =\u003e {\n  return await loadConfig()\n})\n```\n\n### Rate Limiting\n\nBuilt-in rate limiting utility:\n\n```typescript\nimport { RateLimiter } from '@stacksjs/ts-cache'\n\nconst limiter = new RateLimiter(cache, 100, 60) // 100 requests per 60 seconds\n\nconst result = await limiter.check('user:123')\nif (result.limited) {\n  console.log('Rate limited! Try again at:', new Date(result.resetAt))\n}\nelse {\n  console.log('Request allowed. Remaining:', result.remaining)\n}\n```\n\n### Distributed Locking\n\nImplement distributed locks for critical sections:\n\n```typescript\nimport { CacheLock } from '@stacksjs/ts-cache'\n\nconst lock = new CacheLock(cache, 30) // 30 second lock timeout\n\nconst result = await lock.withLock('critical:resource', async () =\u003e {\n  // This code only runs if lock is acquired\n  return await performCriticalOperation()\n})\n\nif (result === null) {\n  console.log('Could not acquire lock')\n}\n```\n\n### Memoization\n\nCache function results with automatic key generation:\n\n```typescript\nimport { memoize } from '@stacksjs/ts-cache'\n\nasync function expensiveFunction(a: number, b: number) {\n  // Expensive computation\n  return a + b\n}\n\nconst memoized = memoize(expensiveFunction, cache, {\n  ttl: 60,\n  keyGenerator: (a, b) =\u003e `sum:${a}:${b}`,\n})\n\n// First call computes\nconsole.log(await memoized(5, 3)) // Computes and caches\n\n// Second call uses cache\nconsole.log(await memoized(5, 3)) // Returns cached result\n```\n\n## Caching Patterns\n\nts-cache includes built-in support for common caching patterns:\n\n### Cache-Aside (Lazy Loading)\n\n```typescript\nimport { CacheAside } from '@stacksjs/ts-cache'\n\nconst pattern = new CacheAside(cache)\n\n// Load data on-demand\nconst user = await pattern.get('user:123', async (key) =\u003e {\n  return await database.getUser(123)\n}, 3600)\n```\n\n### Read-Through\n\n```typescript\nimport { ReadThrough } from '@stacksjs/ts-cache'\n\nconst pattern = new ReadThrough(cache, async (key) =\u003e {\n  return await database.get(key)\n}, 3600)\n\nconst data = await pattern.get('key')\n```\n\n### Write-Through\n\n```typescript\nimport { WriteThrough } from '@stacksjs/ts-cache'\n\nconst pattern = new WriteThrough(cache, async (key, value) =\u003e {\n  await database.save(key, value)\n})\n\n// Writes to both cache and database\nawait pattern.set('user:123', userData, 3600)\n```\n\n### Write-Behind (Write-Back)\n\n```typescript\nimport { WriteBack } from '@stacksjs/ts-cache'\n\nconst pattern = new WriteBack(\n  cache,\n  async (key, value) =\u003e await database.save(key, value),\n  1000, // Flush delay in ms\n)\n\n// Writes to cache immediately, database later\nawait pattern.set('user:123', userData)\n\n// Manually flush pending writes\nawait pattern.flush()\n```\n\n### Refresh-Ahead\n\n```typescript\nimport { RefreshAhead } from '@stacksjs/ts-cache'\n\nconst pattern = new RefreshAhead(\n  cache,\n  async key =\u003e await fetchFreshData(key),\n  3600, // TTL\n  0.8, // Refresh when 80% of TTL has passed\n)\n\n// Returns cached value, refreshes in background if stale\nconst data = await pattern.get('key')\n```\n\n### Multi-Level Cache\n\n```typescript\nimport { createCache, MultiLevelPattern } from '@stacksjs/ts-cache'\n\nconst l1 = createCache({ driver: 'memory', maxKeys: 100 })\nconst l2 = createCache({ driver: 'redis' })\n\nconst pattern = new MultiLevelPattern([l1, l2], [300, 3600])\n\n// Checks L1, then L2, populates higher levels on hit\nconst value = await pattern.get('key')\n\n// Writes to all levels\nawait pattern.set('key', 'value')\n```\n\n## Batch Operations\n\nEfficiently handle multiple operations:\n\n```typescript\n// Set multiple values at once\nawait cache.mset([\n  { key: 'key1', value: 'value1', ttl: 60 },\n  { key: 'key2', value: 'value2', ttl: 120 },\n  { key: 'key3', value: 'value3' },\n])\n\n// Get multiple values at once\nconst values = await cache.mget(['key1', 'key2', 'key3'])\nconsole.log(values) // { key1: 'value1', key2: 'value2', key3: 'value3' }\n\n// Delete multiple keys\nawait cache.del(['key1', 'key2'])\n```\n\n## Serializers\n\nMultiple serialization strategies for different data types:\n\n```typescript\nimport { createCache, serializers } from '@stacksjs/ts-cache'\n\nconst cache = createCache({\n  driver: 'redis',\n  serializer: serializers.auto, // Auto-detects and preserves types\n})\n\n// Complex data types are preserved\nawait cache.set('date', new Date())\nawait cache.set('regex', /test/gi)\nawait cache.set('set', new Set([1, 2, 3]))\nawait cache.set('map', new Map([['a', 1]]))\n\n// Available serializers:\n// - serializers.json (default)\n// - serializers.string\n// - serializers.number\n// - serializers.boolean\n// - serializers.buffer\n// - serializers.auto (preserves types)\n// - serializers.msgpack (requires msgpack-lite)\n```\n\n## Events\n\nListen for cache events:\n\n```typescript\ncache.on('hit', (key, value) =\u003e {\n  console.log(`Cache hit: ${key}`)\n})\n\ncache.on('miss', (key) =\u003e {\n  console.log(`Cache miss: ${key}`)\n})\n\ncache.on('set', (key, value, ttl) =\u003e {\n  console.log(`Cache set: ${key}`)\n})\n\ncache.on('del', (keys, count) =\u003e {\n  console.log(`Deleted ${count} keys`)\n})\n\ncache.on('flush', () =\u003e {\n  console.log('Cache flushed')\n})\n```\n\n## Statistics\n\nTrack cache performance:\n\n```typescript\nconst stats = await cache.getStats()\nconsole.log(stats)\n// {\n//   hits: 127,\n//   misses: 9,\n//   keys: 42,\n//   ksize: 840,\n//   vsize: 2390\n// }\n```\n\n## CLI Tool\n\nts-cache includes a powerful command-line interface for managing your cache:\n\n```bash\n# Install globally for CLI access\nnpm install -g @stacksjs/ts-cache\n\n# Or use with npx/bunx\nbunx cache --help\n```\n\n### Available Commands\n\n```bash\n# Get a value from cache\ncache get user:123\ncache get user:123 --json\n\n# Set a value with TTL\ncache set user:123 '{\"name\":\"John\"}' --json --ttl 3600\n\n# Delete keys\ncache del user:123\ncache del user:* session:*\n\n# Check if key exists\ncache has user:123\n\n# List all keys\ncache keys\ncache keys \"user:*\"\n\n# Get TTL of a key\ncache ttl session:abc\n\n# View cache statistics\ncache stats\ncache stats --json\n\n# Show current configuration\ncache config\ncache config --json\n\n# Flush all cache data\ncache flush --force\n\n# Test cache connectivity\ncache test\ncache test --driver redis\n\n# Show library info\ncache info\n\n# Show version\ncache version\n```\n\n### CLI Options\n\nAll commands support these options:\n\n- `--driver \u003cdriver\u003e` - Use specific driver (memory, memory-lru, redis)\n- `--prefix \u003cprefix\u003e` - Add key prefix\n- `--json` - Output in JSON format (machine-readable)\n- `--ttl \u003cseconds\u003e` - Set time-to-live for set operations\n\n## Configuration\n\nts-cache supports comprehensive configuration through a `cache.config.ts` file at the root of your project:\n\n```typescript\n// cache.config.ts\nimport type { CacheConfig } from '@stacksjs/ts-cache'\n\nconst config: CacheConfig = {\n  // General Settings\n  driver: 'memory', // 'memory' | 'memory-lru' | 'redis'\n  prefix: 'myapp',\n  verbose: true,\n\n  // Common Cache Settings\n  stdTTL: 3600, // Default TTL in seconds\n  checkPeriod: 600, // Cleanup interval\n  maxKeys: 1000,\n  useClones: true,\n\n  // Redis Configuration\n  redis: {\n    url: process.env.REDIS*URL,\n    host: 'localhost',\n    port: 6379,\n    password: process.env.REDIS*PASSWORD,\n    database: 0,\n  },\n\n  // Compression\n  compression: {\n    algorithm: 'gzip', // 'gzip' | 'brotli' | 'smart' | 'none'\n    level: 6,\n    threshold: 1024, // Only compress if larger than 1KB\n    enabled: true,\n  },\n\n  // Middleware\n  middleware: {\n    enabled: true,\n    logging: true,\n    metrics: true,\n    retry: {\n      enabled: true,\n      maxRetries: 3,\n      initialDelay: 100,\n    },\n  },\n\n  // Caching Patterns\n  patterns: {\n    refreshAhead: {\n      ttl: 3600,\n      thresholdPercentage: 0.8, // Refresh when 80% of TTL passed\n    },\n    slidingWindow: {\n      ttl: 3600, // Reset TTL on access\n    },\n  },\n\n  // Event Hooks\n  events: {\n    onSet: (key, value) =\u003e console.log(`Set: ${key}`),\n    onGet: (key, value) =\u003e console.log(`Get: ${key}`),\n    onMiss: key =\u003e console.log(`Miss: ${key}`),\n  },\n\n  // Performance Tuning\n  performance: {\n    enableStats: true,\n    batchSize: 100,\n    warmup: {\n      enabled: true,\n      keys: ['popular:item:1', 'popular:item:2'],\n    },\n  },\n\n  // Multi-Level Cache\n  multiLevel: {\n    enabled: true,\n    levels: [\n      { driver: 'memory', ttl: 300, maxKeys: 1000 }, // L1: Fast\n      { driver: 'redis', ttl: 3600 }, // L2: Persistent\n    ],\n  },\n\n  // TTL Strategy\n  ttlStrategy: {\n    mode: 'sliding', // 'fixed' | 'sliding' | 'probabilistic'\n    jitter: 0.1, // Add 10% jitter to prevent thundering herd\n  },\n\n  // Error Handling\n  errorHandling: {\n    throwOnError: false,\n    circuitBreaker: {\n      enabled: true,\n      threshold: 5,\n      timeout: 60000,\n    },\n  },\n\n  // Debug Mode\n  debug: {\n    enabled: false,\n    logLevel: 'info',\n    trackAccess: true,\n  },\n}\n\nexport default config\n```\n\n### Configuration Options\n\nSee the [complete configuration reference](./cache.config.ts) for all 27+ available options.\n\n### Memory Driver Options\n\n```typescript\nconst cache = createCache({\n  driver: 'memory',\n  stdTTL: 3600, // Default TTL in seconds\n  checkPeriod: 600, // Check for expired items every 10 minutes\n  maxKeys: 1000, // Maximum number of keys\n  useClones: true, // Clone values on get/set\n  deleteOnExpire: true, // Remove items when they expire\n  prefix: 'myapp', // Key prefix for namespacing\n})\n```\n\n### Redis Driver Options\n\n```typescript\nconst cache = createCache({\n  driver: 'redis',\n  url: 'redis://localhost:6379', // Redis connection URL\n  // Or use individual options:\n  host: 'localhost',\n  port: 6379,\n  password: 'secret',\n  database: 0,\n\n  // Connection options\n  connectionTimeout: 5000,\n  autoReconnect: true,\n  maxRetries: 10,\n  tls: false,\n\n  // Cache options\n  stdTTL: 3600,\n  prefix: 'myapp',\n})\n```\n\n## Utilities\n\n### Circuit Breaker\n\nProtect against cascading failures:\n\n```typescript\nimport { CircuitBreaker } from '@stacksjs/ts-cache'\n\nconst breaker = new CircuitBreaker(cache, 5, 60) // 5 failures in 60 seconds\n\ntry {\n  const result = await breaker.execute('api:endpoint', async () =\u003e {\n    return await callExternalAPI()\n  })\n}\ncatch (error) {\n  console.log('Circuit breaker is open')\n}\n```\n\n### Cache Warmer\n\nPreload cache with data:\n\n```typescript\nimport { CacheWarmer } from '@stacksjs/ts-cache'\n\nconst warmer = new CacheWarmer(cache)\n\nawait warmer.warm([\n  { key: 'user:1', fetcher: () =\u003e getUser(1), ttl: 3600 },\n  { key: 'user:2', fetcher: () =\u003e getUser(2), ttl: 3600 },\n])\n```\n\n### Debounced Cache\n\nDebounce cache writes:\n\n```typescript\nimport { DebouncedCache } from '@stacksjs/ts-cache'\n\nconst debounced = new DebouncedCache(cache, 1000) // 1 second delay\n\n// Multiple rapid calls only write once\ndebounced.set('key', 'value1')\ndebounced.set('key', 'value2')\ndebounced.set('key', 'value3') // Only this value is written after 1 second\n```\n\n## Migration from v0.1.x\n\nThe legacy synchronous API is still available for backwards compatibility:\n\n```typescript\nimport { Cache, createCache } from '@stacksjs/ts-cache'\n\n// Old synchronous API (still works)\nconst syncCache = new Cache()\nsyncCache.set('key', 'value')\nconst syncValue = syncCache.get('key')\n\n// New async API (recommended)\nconst asyncCache = createCache()\nawait asyncCache.set('key', 'value')\nconst asyncValue = await asyncCache.get('key')\n```\n\n## Use Cases\n\n- **API Response Caching**: Reduce API calls by caching responses\n- **Session Management**: Store user sessions with Redis for distributed apps\n- **Rate Limiting**: Implement request throttling with automatic expiration\n- **Distributed Locking**: Coordinate access to shared resources\n- **Function Memoization**: Cache expensive function results\n- **Database Query Caching**: Speed up repeated database queries\n- **Computed Values**: Store results of expensive calculations\n\n## Documentation\n\nFor detailed documentation, see:\n\n- [Introduction](https://github.com/stacksjs/ts-cache/blob/main/docs/intro.md)\n- [Installation Guide](https://github.com/stacksjs/ts-cache/blob/main/docs/install.md)\n- [Usage Guide](https://github.com/stacksjs/ts-cache/blob/main/docs/usage.md)\n- [API Reference](https://github.com/stacksjs/ts-cache/blob/main/docs/api.md)\n- [Configuration Options](https://github.com/stacksjs/ts-cache/blob/main/docs/config.md)\n- [Features](https://github.com/stacksjs/ts-cache/blob/main/docs/features.md)\n\n## Contributing\n\nPlease see the [Contributing Guide](https://github.com/stacksjs/contributing) for details.\n\n## Community\n\nFor help, discussion about best practices, or any other conversation that would benefit from being searchable:\n\n[Discussions on GitHub](https://github.com/stacksjs/stacks/discussions)\n\nFor casual chit-chat with others using this package:\n\n[Join the Stacks Discord Server](https://discord.gg/stacksjs)\n\n## Postcardware\n\n\"Software that is free, but hopes for a postcard.\" We love receiving postcards from around the world showing where Stacks is being used! We showcase them on our website too.\n\nOur address: Stacks.js, 12665 Village Ln #2306, Playa Vista, CA 90094, United States 🌎\n\n## Sponsors\n\nWe would like to extend our thanks to the following sponsors for funding Stacks development. If you are interested in becoming a sponsor, please reach out to us.\n\n- [JetBrains](https://www.jetbrains.com/)\n- [The Solana Foundation](https://solana.com/)\n\n## Credits\n\n- [`node-cache`](https://github.com/node-cache/node-cache) *for the original Node.js implementation*\n- [Bun](https://bun.sh) *for the native Redis client*\n- [Chris Breuer](https://github.com/chrisbbreuer)\n- [All Contributors](https://github.com/stacksjs/ts-cache/contributors)\n\n## License\n\nThe MIT License (MIT). Please see [LICENSE](LICENSE.md) for more information.\n\nMade with 💙\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstacksjs%2Fts-cache","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstacksjs%2Fts-cache","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstacksjs%2Fts-cache/lists"}