{"_id":"@codecaine/bun-redis-wrapper","_rev":"3-52f29823bc7b8fc122ac0461a80406ff","name":"@codecaine/bun-redis-wrapper","dist-tags":{"latest":"1.2.1"},"versions":{"1.1.0":{"name":"@codecaine/bun-redis-wrapper","version":"1.1.0","keywords":["redis","bun","wrapper","namespace","typescript","session","cache","rate-limit","queue","analytics","controller","production-ready"],"author":{"name":"codecaine-zz"},"license":"MIT","_id":"@codecaine/bun-redis-wrapper@1.1.0","maintainers":[{"name":"codecaine","email":"codecaine@gmail.com"}],"homepage":"https://github.com/codecaine-zz/bun_redis_wrapper#readme","bugs":{"url":"https://github.com/codecaine-zz/bun_redis_wrapper/issues"},"dist":{"shasum":"ca833fb89dce25cea9174099ae4febdf7725e87e","tarball":"https://registry.npmjs.org/@codecaine/bun-redis-wrapper/-/bun-redis-wrapper-1.1.0.tgz","fileCount":63,"integrity":"sha512-yushhs+aqKqwVMJxBGuH9CfydeCeyXNYFZ4R9unzMXqPs98L2Ss2+imMnAhSJ6b9taD2MM1xQEwzRkIeproWKA==","signatures":[{"sig":"MEQCIA8kAh6vrm8wuZAE4cEdY65T70EmZOm9TvA3h3p0vDIsAiBNbWW18lbWRvpcwxdg6P1O2Q0Wgskeqw5nqpIvlRZN7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":351556},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./controllers":{"types":"./dist/controllers/index.d.ts","import":"./dist/controllers/index.js","default":"./dist/controllers/index.js"},"./controllers/*":{"types":"./dist/controllers/*.d.ts","import":"./dist/controllers/*.js","default":"./dist/controllers/*.js"}},"gitHead":"33ecd7ee437e40226e6b59033884a560ff39e00b","scripts":{"dev":"bun run index.ts","test":"bun test","build":"bun build:clean && bun build:ts","example":"bun run example.ts","prepare":"bun run build","build:ts":"tsc --project tsconfig.build.json","test:watch":"bun test --watch","build:clean":"rm -rf dist","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"codecaine","email":"codecaine@gmail.com"},"repository":{"url":"git+https://github.com/codecaine-zz/bun_redis_wrapper.git","type":"git"},"_npmVersion":"11.6.2","description":"Production-ready Redis wrapper for Bun with namespaces, controllers, and TypeScript support","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.3.0"},"peerDependencies":{"bun":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/bun-redis-wrapper_1.1.0_1766841635422_0.3525678842920317","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@codecaine/bun-redis-wrapper","version":"1.2.0","keywords":["redis","bun","wrapper","namespace","typescript","session","cache","rate-limit","queue","analytics","controller","production-ready"],"author":{"name":"codecaine-zz"},"license":"MIT","_id":"@codecaine/bun-redis-wrapper@1.2.0","maintainers":[{"name":"codecaine","email":"codecaine@gmail.com"}],"homepage":"https://github.com/codecaine-zz/bun_redis_wrapper#readme","bugs":{"url":"https://github.com/codecaine-zz/bun_redis_wrapper/issues"},"dist":{"shasum":"2ba18c634458b3df74ff468f8f7e14a6f80af436","tarball":"https://registry.npmjs.org/@codecaine/bun-redis-wrapper/-/bun-redis-wrapper-1.2.0.tgz","fileCount":63,"integrity":"sha512-lpC0G/QHMkLZei0G5wNxuVf+LnwnDC+rnMMmIrqdTbTgB2Kaa7KKmgxpKMSLGy3Ai4B7uGtQBiDe9byr+z4rng==","signatures":[{"sig":"MEUCIFIqLgJ/qMUSSadQdHksiJqtzROLzFmBvQZtlPUadaogAiEApMRqw1jhBxaP4M2GGxg0cPU7wUECDKFMu61CP7Xqryc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359162},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./controllers":{"types":"./dist/controllers/index.d.ts","import":"./dist/controllers/index.js","default":"./dist/controllers/index.js"},"./controllers/*":{"types":"./dist/controllers/*.d.ts","import":"./dist/controllers/*.js","default":"./dist/controllers/*.js"}},"gitHead":"6287432594a803b5192fc09a533454638be09f17","scripts":{"dev":"bun run index.ts","test":"bun test","build":"bun build:clean && bun build:ts","demos":"bun run demos/run-all.ts","example":"bun run example.ts","prepare":"bun run build","build:ts":"tsc --project tsconfig.build.json","test:watch":"bun test --watch","build:clean":"rm -rf dist","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"codecaine","email":"codecaine@gmail.com"},"repository":{"url":"git+https://github.com/codecaine-zz/bun_redis_wrapper.git","type":"git"},"_npmVersion":"11.6.2","description":"Production-ready Redis wrapper for Bun with namespaces, controllers, and TypeScript support","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.3.0"},"peerDependencies":{"bun":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/bun-redis-wrapper_1.2.0_1766844978750_0.6595854009261144","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@codecaine/bun-redis-wrapper","version":"1.2.1","description":"Production-ready Redis wrapper for Bun with namespaces, controllers, and TypeScript support","author":{"name":"codecaine-zz"},"license":"MIT","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./controllers":{"types":"./dist/controllers/index.d.ts","import":"./dist/controllers/index.js","default":"./dist/controllers/index.js"},"./controllers/*":{"types":"./dist/controllers/*.d.ts","import":"./dist/controllers/*.js","default":"./dist/controllers/*.js"}},"scripts":{"build":"bun build:clean && bun build:ts","build:clean":"rm -rf dist","build:ts":"tsc --project tsconfig.build.json","dev":"bun run index.ts","demos":"bun run demos/run-all.ts","example":"bun run example.ts","test":"bun test","test:watch":"bun test --watch","prepublishOnly":"bun run test && bun run build","prepare":"bun run build"},"keywords":["redis","bun","wrapper","namespace","typescript","session","cache","rate-limit","queue","analytics","controller","production-ready"],"repository":{"type":"git","url":"git+https://github.com/codecaine-zz/bun_redis_wrapper.git"},"bugs":{"url":"https://github.com/codecaine-zz/bun_redis_wrapper/issues"},"homepage":"https://github.com/codecaine-zz/bun_redis_wrapper#readme","devDependencies":{"@types/bun":"latest","typescript":"^5.3.0"},"peerDependencies":{"bun":">=1.0.0"},"engines":{"node":">=18.0.0","bun":">=1.0.0"},"gitHead":"63290cf4bb28a570840ce7d7d90a74dae166d5bb","_id":"@codecaine/bun-redis-wrapper@1.2.1","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-L6vxVftAQQw3i0oyCu1SkRncq4SShD6b5lOTNlQSOpLSISL9qn8phekKqNAXjG+ZeJjYfck8wOBn7JtwH4LTUg==","shasum":"16ab84df947acb01f50ac23ebb611d73d029b27f","tarball":"https://registry.npmjs.org/@codecaine/bun-redis-wrapper/-/bun-redis-wrapper-1.2.1.tgz","fileCount":63,"unpackedSize":359162,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHvVVyOmWkfban0zPh4cUTh5S1etLcFonviu66K+m8MtAiEA2tBR3c6Ad0kil1rssljEFCeZnzPkPVYGpeXc9DQvgrk="}]},"_npmUser":{"name":"codecaine","email":"codecaine@gmail.com"},"directories":{},"maintainers":[{"name":"codecaine","email":"codecaine@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bun-redis-wrapper_1.2.1_1766845455335_0.29059703118439284"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-27T13:20:35.351Z","modified":"2025-12-27T14:24:15.702Z","1.1.0":"2025-12-27T13:20:35.582Z","1.2.0":"2025-12-27T14:16:18.904Z","1.2.1":"2025-12-27T14:24:15.492Z"},"bugs":{"url":"https://github.com/codecaine-zz/bun_redis_wrapper/issues"},"author":{"name":"codecaine-zz"},"license":"MIT","homepage":"https://github.com/codecaine-zz/bun_redis_wrapper#readme","keywords":["redis","bun","wrapper","namespace","typescript","session","cache","rate-limit","queue","analytics","controller","production-ready"],"repository":{"type":"git","url":"git+https://github.com/codecaine-zz/bun_redis_wrapper.git"},"description":"Production-ready Redis wrapper for Bun with namespaces, controllers, and TypeScript support","maintainers":[{"name":"codecaine","email":"codecaine@gmail.com"}],"readme":"# Bun Redis Wrapper - Production Ready\n\n[![npm version](https://img.shields.io/npm/v/@codecaine/bun-redis-wrapper.svg)](https://www.npmjs.com/package/@codecaine/bun-redis-wrapper)\n[![npm downloads](https://img.shields.io/npm/dm/@codecaine/bun-redis-wrapper.svg)](https://www.npmjs.com/package/@codecaine/bun-redis-wrapper)\n[![license](https://img.shields.io/npm/l/@codecaine/bun-redis-wrapper.svg)](https://github.com/codecaine-zz/bun_redis_wrapper/blob/main/LICENSE)\n\nA powerful Redis wrapper for Bun with **production-ready controllers** for building real applications. Drop-in solutions for sessions, caching, rate limiting, job queues, and more.\n\n## 🎯 Quick Start for Beginners\n\n### Option 1: Use Production Controllers (Recommended)\n\n```typescript\nimport { createRedis } from \"@codecaine/bun-redis-wrapper\";\nimport { SessionController, CacheController } from \"@codecaine/bun-redis-wrapper/controllers\";\n\nconst redis = await createRedis();\n\n// Sessions - ready to use!\nconst sessions = new SessionController(redis);\nconst sessionId = await sessions.create(\"user-123\", { name: \"Alice\" });\n\n// Caching - intelligent and automatic!\nconst cache = new CacheController(redis);\nconst user = await cache.getOrSet(\"user:123\", () => db.getUser(123), 300);\n```\n\n**📦 Available Controllers:**\n- **SessionController** - User sessions with multi-device support\n- **CacheController** - Intelligent caching with cache-aside pattern\n- **RateLimiterController** - API rate limiting (fixed/sliding window, token bucket)\n- **QueueController** - Background job processing with priorities\n- **StorageController** - Simple key-value storage with JSON\n- **AnalyticsController** - Metrics tracking with HyperLogLog\n- **PubSubController** - Publish/subscribe messaging\n- **LockController** - Distributed locks (simple mutex)\n- **LeaderboardController** - Rankings and leaderboards (sorted sets)\n- **CounterController** - Atomic counters and stats\n- **FormularyController** - Example domain controller (healthcare formulary)\n- **RadAppController** - Example domain controller (RAD app patterns)\n\n👉 **[Controllers Documentation](src/controllers/README.md)** - Complete guide with examples  \n👉 **[Example Application](demos/14-controller-app.ts)** - Full app using all controllers\n\n### Option 2: Use Core Wrapper Directly\n\n```typescript\nimport { createRedis, createNamespacedRedis } from \"@codecaine/bun-redis-wrapper\";\n\nawait using redis = await createRedis(\"redis://localhost:6379\");\nawait redis.set(\"key\", \"value\");\n\n// With namespaces\nconst authApp = createNamespacedRedis(redis, \"auth\");\nconst shopApp = createNamespacedRedis(redis, \"shop\");\n```\n\n## ✨ Features\n\n✅ **Production-Ready Controllers** - Drop-in solutions for common use cases ⭐ NEW  \n✅ **Beginner Friendly** - Clear documentation and examples ⭐ NEW  \n✅ **Type-Safe** - Full TypeScript support with proper types  \n✅ **Namespace Support** - Automatic key prefixing to prevent collisions  \n✅ **Comprehensive API** - All common Redis operations supported  \n✅ **JSON Helpers** - Built-in JSON serialization/deserialization  \n✅ **Sorted Sets** - Leaderboards, rankings, and priority queues  \n✅ **Streams** - Event sourcing and real-time data processing  \n✅ **Geospatial** - Location-based queries and proximity search  \n✅ **HyperLogLog** - Memory-efficient unique counting  \n✅ **Async Dispose** - Works with `await using` syntax  \n✅ **Zero Dependencies** - Uses Bun's native RedisClient  \n\n## 📊 Supported Redis Data Types\n\n- **Strings** - GET, SET, INCR, DECR\n- **Hashes** - HGET, HSET, HGETALL\n- **Lists** - LPUSH, RPUSH, LRANGE\n- **Sets** - SADD, SREM, SMEMBERS\n- **Sorted Sets** - ZADD, ZRANGE, ZRANK (leaderboards)\n- **Streams** - XADD, XREAD, XRANGE (event logs)\n- **Geospatial** - GEOADD, GEODIST, GEORADIUS\n- **HyperLogLog** - PFADD, PFCOUNT (unique counting)\n\n## 📚 Documentation\n\n### For Beginners\n- **[Controllers Guide](src/controllers/README.md)** - Production-ready controllers ⭐ START HERE\n- **[Example Application](demos/14-controller-app.ts)** - Complete app example ⭐\n- **[Demos](demos/)** - 15 comprehensive examples with best practices\n\nRun all demos locally:\n\n```bash\nbun run demos\n```\n\n### For Advanced Users\n- **[API.md](docs/API.md)** - Complete API reference with all methods\n- **[REDIS_FEATURES.md](docs/REDIS_FEATURES.md)** - Redis features coverage analysis\n- **[QUICK_REFERENCE.md](docs/QUICK_REFERENCE.md)** - Common patterns cheat sheet\n- **[index.test.ts](tests/index.test.ts)** - Full test suite (83 tests)\n\n## 🚀 Installation\n\n```bash\n# Using Bun\nbun add @codecaine/bun-redis-wrapper\n\n# Using npm\nnpm install @codecaine/bun-redis-wrapper\n\n# Using pnpm\npnpm add @codecaine/bun-redis-wrapper\n\n# Using yarn\nyarn add @codecaine/bun-redis-wrapper\n```\n\n## 📖 Quick Examples\n\n### Sessions (Production-Ready)\n\n```typescript\nimport { SessionController } from \"@codecaine/bun-redis-wrapper/controllers\";\n\nconst sessions = new SessionController(redis);\n\n// Create session\nconst sessionId = await sessions.create(\"user-123\", {\n  name: \"Alice\",\n  email: \"alice@example.com\"\n});\n\n// Validate session\nconst session = await sessions.validate(sessionId);\nif (session) {\n  console.log(`Welcome ${session.data.name}!`);\n}\n\n// Logout\nawait sessions.destroy(sessionId);\n```\n\n### Caching (Production-Ready)\n\n```typescript\nimport { CacheController } from \"@codecaine/bun-redis-wrapper/controllers\";\n\nconst cache = new CacheController(redis);\n\n// Cache-aside pattern (automatic!)\nconst user = await cache.getOrSet(\n  \"user:123\",\n  async () => await database.getUser(123), // Only called on cache miss\n  300 // Cache for 5 minutes\n);\n\n// Check cache stats\nconst stats = await cache.getStats();\nconsole.log(`Hit rate: ${stats.hitRate}%`);\n```\n\n### Rate Limiting (Production-Ready)\n\n```typescript\nimport { RateLimiterController } from \"@codecaine/bun-redis-wrapper/controllers\";\n\nconst limiter = new RateLimiterController(redis);\n\n// Check rate limit (10 requests per minute)\nconst result = await limiter.check(\"user-123\", 10, 60);\n\nif (!result.allowed) {\n  throw new Error(`Rate limited. Retry after ${result.retryAfter}s`);\n}\n\nconsole.log(`${result.remaining} requests remaining`);\n```\n\n### Background Jobs (Production-Ready)\n\n```typescript\nimport { QueueController } from \"@codecaine/bun-redis-wrapper/controllers\";\n\nconst queue = new QueueController(redis);\n\n// Add job\nawait queue.add(\"send-email\", {\n  to: \"user@example.com\",\n  subject: \"Welcome!\"\n}, { priority: 8 });\n\n// Process jobs (in worker)\nconst job = await queue.next();\nif (job) {\n  await sendEmail(job.data);\n  await queue.complete(job.id);\n}\n```\n\n### Core Wrapper Usage\n```\n\n### Multi-Tenant Application\n\n```typescript\nimport { createRedis, createNamespacedRedis } from \"@codecaine/bun-redis-wrapper\";\n\nawait using redis = await createRedis();\n\n// Each tenant gets isolated namespace\nconst tenant1 = createNamespacedRedis(redis, \"tenant:acme\");\nconst tenant2 = createNamespacedRedis(redis, \"tenant:globex\");\n\nawait tenant1.setJSON(\"config\", { theme: \"dark\" });\nawait tenant2.setJSON(\"config\", { theme: \"light\" });\n\n// No collisions - each tenant has separate data\n```\n\n### Environment-Based Isolation\n\n```typescript\nconst env = process.env.NODE_ENV || \"development\";\nconst namespace = `myapp:${env}`;\nconst redis = createNamespacedRedis(baseRedis, namespace);\n\n// Keys stored as: \"myapp:development:...\" or \"myapp:production:...\"\n```\n\n## API Reference\n\n### Factory Functions\n\n#### `createRedis(url?: string)`\n\nCreates a base Redis connection.\n\n```typescript\nawait using redis = await createRedis(\"redis://localhost:6379\");\n```\n\n#### `createNamespacedRedis(redis, namespace)`\n\nCreates a namespaced wrapper with automatic key prefixing.\n\n```typescript\nconst app = createNamespacedRedis(redis, \"myapp\");\n```\n\n#### `clearNamespace(redis, namespace)`\n\nDeletes all keys in a namespace.\n\n```typescript\nconst deleted = await clearNamespace(redis, \"myapp\");\n\n#### `copyNamespace(redis, fromNamespace, toNamespace, options?)`\n\nCopies all keys from one namespace to another (useful for dev → staging → prod promotions within the same Redis instance).\n\n```typescript\nconst result = await copyNamespace(redis, \"myapp:dev\", \"myapp:staging\", { replace: false });\nconsole.log(result); // { scanned, copied, skipped }\n```\n```\n\n### Available Operations\n\nAll operations support both the base `RedisWrapper` and `NamespacedRedisWrapper`:\n\n**Core Operations**\n- `get(key)`, `set(key, value, options?)`\n- `del(...keys)`, `exists(...keys)`\n\n**JSON Operations**\n- `getJSON<T>(key)`, `setJSON<T>(key, value, options?)`\n\n**Multi Operations**\n- `mget(...keys)`, `mset(data)`\n\n**Hash Operations**\n- `hget(key, field)`, `hset(key, field, value)`\n- `hmget(key, ...fields)`, `hmset(key, data)`\n- `hgetAll(key)`\n\n**Counter Operations**\n- `incr(key)`, `decr(key)`\n\n**TTL Operations**\n- `ttl(key)`, `setTTL(key, seconds)`, `expire(key, seconds)`\n\n**Pattern Matching**\n- `scanAll(pattern, count?)`\n\n**Pub/Sub**\n- `subscribe(channel, callback)`, `publish(channel, message)`\n\n**List Operations**\n- `lpush(key, ...values)`, `rpush(key, ...values)`\n- `lrange(key, start?, stop?)`, `lpop(key)`, `rpop(key)`\n\n**Set Operations**\n- `sadd(key, ...members)`, `srem(key, ...members)`, `smembers(key)`\n\n## Examples\n\n### JSON Storage with TTL\n\n```typescript\ninterface UserSession {\n  userId: number;\n  username: string;\n  loginAt: number;\n}\n\nconst sessions = createNamespacedRedis(redis, \"sessions\");\n\nconst session: UserSession = {\n  userId: 123,\n  username: \"alice\",\n  loginAt: Date.now()\n};\n\n// Store with 1 hour expiration\nawait sessions.setJSON(\"user:123\", session, { EX: 3600 });\n\n// Retrieve\nconst active = await sessions.getJSON<UserSession>(\"user:123\");\n```\n\n### Rate Limiting\n\n```typescript\nasync function checkRateLimit(\n  client: NamespacedRedisWrapper,\n  userId: string,\n  maxRequests: number,\n  windowSeconds: number\n): Promise<boolean> {\n  const key = `ratelimit:${userId}`;\n  const count = await client.incr(key);\n  \n  if (count === 1) {\n    await client.setTTL(key, windowSeconds);\n  }\n  \n  return count <= maxRequests;\n}\n\nconst api = createNamespacedRedis(redis, \"api:v1\");\nconst allowed = await checkRateLimit(api, \"user:123\", 10, 60);\n```\n\n### Pattern Matching\n\n```typescript\nconst app = createNamespacedRedis(redis, \"myapp\");\n\n// Store user sessions\nawait app.set(\"session:user:1\", \"data1\");\nawait app.set(\"session:user:2\", \"data2\");\nawait app.set(\"config:timeout\", \"30\");\n\n// Find all sessions (scoped to namespace)\nconst sessionKeys = await app.scanAll(\"session:*\");\nconsole.log(sessionKeys); // [\"session:user:1\", \"session:user:2\"]\n```\n\n## Best Practices\n\n### 1. Use Consistent Naming\n\n```typescript\n// ✅ Good: Clear hierarchy with colons\n\"app:entity:id:field\"\n\"myapp:user:12345:profile\"\n\n// ❌ Avoid: Inconsistent separators\n\"myapp_user_12345\"\n```\n\n### 2. Share Base Connection\n\n```typescript\n// ✅ Good: One connection, multiple namespaces\nawait using redis = await createRedis();\nconst app1 = createNamespacedRedis(redis, \"app1\");\nconst app2 = createNamespacedRedis(redis, \"app2\");\n\n// ❌ Bad: Multiple connections\nconst redis1 = await createRedis();\nconst redis2 = await createRedis();\n```\n\n### 3. Clean Up in Tests\n\n```typescript\nimport { test, afterEach } from \"bun:test\";\n\nafterEach(async () => {\n  await clearNamespace(redis, \"test\");\n});\n```\n\n## Use Cases\n\n- 🏢 **Microservices** - Isolate data per service\n- 👥 **Multi-tenant SaaS** - Separate data per customer\n- 🌍 **Environment Isolation** - dev/staging/prod separation\n- 🔄 **API Versioning** - v1/v2 namespace isolation\n- 👨‍💻 **Team Resources** - Team-based access control\n\n## Performance\n\nThe namespace wrapper adds minimal overhead - just string concatenation. No additional network calls or memory overhead.\n\n## 📝 Testing\n\nRun the comprehensive test suite:\n\n```bash\n# Run all tests\nbun test\n\n# Run tests in watch mode\nbun test --watch\n```\n\nThe test suite includes 83 tests covering:\n- Core Redis operations\n- JSON operations\n- Multi operations\n- Hash operations\n- Counter operations\n- TTL operations\n- Pattern matching\n- List operations\n- Set operations\n- Namespace isolation\n- Multi-tenant scenarios\n- Integration tests\n\n## Requirements\n\n- Bun v1.0+\n- Redis server\n\n## License\n\nMIT\n\n---\n","readmeFilename":"README.md"}