{"_id":"@0x0bit/sails-hook-redis","_rev":"5-a4eeb5178a24554beef9e018b88943b8","name":"@0x0bit/sails-hook-redis","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"@0x0bit/sails-hook-redis","version":"0.1.1","keywords":["sails","hook","redis"],"author":{"name":"bo.yang","email":"cn6bo.y@gmail.com"},"license":"MIT","_id":"@0x0bit/sails-hook-redis@0.1.1","maintainers":[{"name":"01bit","email":"cn6bo.y@gmail.com"}],"homepage":"https://github.com/0x0bit/sails-hook-redis#readme","bugs":{"url":"https://github.com/0x0bit/sails-hook-redis/issues"},"dist":{"shasum":"acd30f2922e9262e8fef0c68252b80fc1723ddff","tarball":"https://registry.npmjs.org/@0x0bit/sails-hook-redis/-/sails-hook-redis-0.1.1.tgz","fileCount":5,"integrity":"sha512-8B3L3UI5rPNDhGo/tX+TD4LJt26cEIWKnyMDL7mcvF/htkP1/an2hfJuKbadbHKxSG6MOM9p5j/zPtaTY5hXxA==","signatures":[{"sig":"MEYCIQDo8NnL8X0laEZoTPW+TmCRMQemCht/XAsrFXIpsPyt/gIhAPiBvdCB13Dy1rNlnpdp7V17eVUW6/XP4tvrvogoImjy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15911},"main":"src/index.js","sails":{"isHook":true},"gitHead":"bd26de9ecf58fb54f87e26c9392220a000b27503","_npmUser":{"name":"01bit","email":"cn6bo.y@gmail.com"},"repository":{"url":"git+https://github.com/0x0bit/sails-hook-redis.git","type":"git"},"_npmVersion":"10.9.2","description":"sail ","directories":{},"_nodeVersion":"22.17.0","dependencies":{"sails":"^1.2.4","ioredis":"^5.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sails-hook-redis_0.1.1_1755740677206_0.798914566086129","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@0x0bit/sails-hook-redis","version":"0.1.2","description":"sail ","main":"src/index.js","author":{"name":"bo.yang","email":"cn6bo.y@gmail.com"},"sails":{"isHook":true},"keywords":["sails","hook","redis"],"repository":{"type":"git","url":"git+https://github.com/0x0bit/sails-hook-redis.git"},"homepage":"https://github.com/0x0bit/sails-hook-redis#readme","license":"MIT","dependencies":{"ioredis":"^5.1.0","sails":"^1.2.4"},"_id":"@0x0bit/sails-hook-redis@0.1.2","gitHead":"a80a3de277716c5c997ca297cbe45caa7c21807d","bugs":{"url":"https://github.com/0x0bit/sails-hook-redis/issues"},"_nodeVersion":"22.17.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-uNwsAFqmzfQY4LWEgggNLy2aWRxca53Fs/cpcJQhqJDYNvnZE89y9hlcELfcd7wuHuma94f+JgkU7aV8DKIRxA==","shasum":"af1e662c633ac47dfb2cf112e2bb719db37ac253","tarball":"https://registry.npmjs.org/@0x0bit/sails-hook-redis/-/sails-hook-redis-0.1.2.tgz","fileCount":5,"unpackedSize":15905,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCFdgSecboAvx/oCqHXXiXrADFtLsG403awCubvl/c4bwIgNbwm5Klqo2l5tcDPc+i2H16NzDp5PCoNVReOv2LLkEs="}]},"_npmUser":{"name":"01bit","email":"cn6bo.y@gmail.com"},"directories":{},"maintainers":[{"name":"01bit","email":"cn6bo.y@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sails-hook-redis_0.1.2_1755740859908_0.07976514037681048"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-21T01:44:37.110Z","modified":"2025-08-21T01:47:40.329Z","0.1.0":"2025-08-20T08:05:03.348Z","0.1.1":"2025-08-21T01:44:37.408Z","0.1.2":"2025-08-21T01:47:40.144Z"},"bugs":{"url":"https://github.com/0x0bit/sails-hook-redis/issues"},"author":{"name":"bo.yang","email":"cn6bo.y@gmail.com"},"license":"MIT","homepage":"https://github.com/0x0bit/sails-hook-redis#readme","keywords":["sails","hook","redis"],"repository":{"type":"git","url":"git+https://github.com/0x0bit/sails-hook-redis.git"},"description":"sail ","maintainers":[{"name":"01bit","email":"cn6bo.y@gmail.com"}],"readme":"# Sails Redis 通用连接钩子 (sails-hook-redis)\n\n一个为 [Sails.js](https://sailsjs.com) 设计的通用Redis连接钩子。它能够以一致的方式连接到 **单机（Standalone）**、**哨兵（Sentinel）** 或 **集群（Cluster）** 模式的Redis，并将功能强大的 `ioredis` 客户端实例暴露为全局的 `sails.hooks.redis` 对象。\n\n## ✨ 主要特性\n\n-   **统一的API**：在应用的任何地方，始终通过 `sails.hooks.redis` 访问Redis，无需关心底层连接的是哪种模式。\n-   **智能模式识别**：只需提供配置，钩子会自动检测并以正确的模式（单机、哨兵或集群）进行初始化。\n-   **功能强大**：基于性能卓越的 `ioredis` 库，支持所有Redis命令、Lua脚本、事务（Pipeline）等高级功能。\n-   **生命周期管理**：遵循Sails的生命周期，在应用启动时自动连接，在应用关闭时安全地断开连接。\n-   **配置简单**：提供清晰、直观的配置文件，轻松上手。\n\n## 🚀 安装\n\n在您的Sails项目根目录下执行：\n\n```bash\nnpm install @0x0bit/sails-hook-redis --save\n```\n\n安装完成后，Sails会在启动时自动加载此钩子。\n\n## ⚙️ 配置\n\n在您的 Sails 项目的 `config/` 目录下创建一个名为 `redis.js` 的文件。钩子会根据此文件中的配置自动选择连接模式。\n\n---\n\n### 示例 1：单机模式 (Standalone)\n\n这是最基础的连接方式，适用于连接单个Redis实例。\n\n```javascript\n// config/redis.js\n\nmodule.exports.redis = {\n  // 默认为 false 来启用此钩子，如果想要禁用该hook，只需要设置为true\n  disabled: false,\n\n  // 提供 host 和 port\n  host: '127.0.0.1',\n  port: 6379,\n\n  // 或者，您也可以直接提供一个 URL\n  // url: 'redis://user:password@hostname:port/db_number',\n\n  password: 'your-redis-password', // 如果有密码\n  db: 0, // 数据库编号\n\n  // 在这里可以传入任何 ioredis 支持的额外选项\n  // 更多选项请参考: https://github.com/luin/ioredis/blob/main/API.md#new-redisport-host-options\n  options: {\n    // 例如，为所有 key 添加统一的前缀\n    // keyPrefix: 'myapp:'\n  }\n};\n```\n\n---\n\n### 示例 2：哨兵模式 (Sentinel)\n\n适用于连接到由Sentinel保障高可用的Redis主从集群。\n\n```javascript\n// config/redis.js\n\nmodule.exports.redis = {\n  enabled: true,\n\n  // 提供所有哨兵节点的地址列表\n  sentinels: [\n    { host: '10.0.0.1', port: 26379 },\n    { host: '10.0.0.2', port: 26379 },\n    { host: '10.0.0.3', port: 26379 },\n  ],\n\n  // 指定在 sentinel.conf 中配置的主节点组名 (master group name)\n  name: 'mymaster',\n\n  password: 'your-redis-password', // 如果有密码\n  db: 0,\n};\n```\n\n---\n\n### 示例 3：集群模式 (Cluster)\n\n适用于连接到官方的Redis Cluster集群。\n\n**备注**：Redis Cluster模式不支持 `db` 数据库选择的概念。\n\n```javascript\n// config/redis.js\n\nmodule.exports.redis = {\n  enabled: true,\n\n  // 提供集群中部分或全部节点的地址列表\n  clusterNodes: [\n    { host: '10.0.1.1', port: 7000 },\n    { host: '10.0.1.2', port: 7001 },\n    { host: '10.0.1.3', port: 7002 },\n    // ...更多节点\n  ],\n\n  // 密码将应用于集群中的所有节点\n  password: 'your-cluster-password',\n\n  // ioredis 集群模式的额外选项\n  // 更多选项请参考: https://github.com/luin/ioredis/blob/main/API.md#new-clusterstartupnodes-options\n  options: {\n    // 例如，启用从节点读取\n    // scaleReads: 'slave'\n  }\n};\n```\n\n## 📝 使用方法\n\n配置完成后，Sails启动时会自动建立连接。您可以在应用的任何位置（控制器、服务、模型等）通过全局的 `sails.hooks.redis` 对象来调用所有Redis命令。\n\n所有命令均为异步，并返回Promise，建议与 `async/await` 配合使用。\n\n**控制器示例 (`api/controllers/UserController.js`):**\n\n```javascript\nmodule.exports = {\n  /**\n   * 获取用户资料，优先从缓存读取\n   */\n  async getProfile(req, res) {\n    const userId = req.param('id');\n    const cacheKey = `user:profile:${userId}`;\n\n    try {\n      // 1. 尝试从Redis缓存中获取数据\n      let cachedProfile = await sails.hooks.redis.get(cacheKey);\n\n      if (cachedProfile) {\n        sails.log.info(`用户 ${userId} 的资料从缓存中命中。`);\n        // 将JSON字符串解析回对象并返回\n        return res.json(JSON.parse(cachedProfile));\n      }\n\n      // 2. 如果缓存未命中，从数据库查询\n      sails.log.info(`用户 ${userId} 的资料缓存未命中，从数据库查询。`);\n      const user = await User.findOne({ id: userId });\n\n      if (!user) {\n        return res.notFound();\n      }\n\n      // 3. 将数据存入Redis，并设置1小时的过期时间（3600秒）\n      // 注意：存入对象前需要先将其序列化为字符串\n      await sails.hooks.redis.set(cacheKey, JSON.stringify(user), 'EX', 3600);\n\n      return res.json(user);\n\n    } catch (err) {\n      sails.log.error('获取用户资料时出错:', err);\n      return res.serverError(err);\n    }\n  }\n};\n```\n\n## 📚 API\n\n`sails.hooks.redis` 对象是一个完整的 `ioredis` 客户端实例。关于所有可用的Redis命令和方法，请直接参考官方的 [ioredis API 文档](https://github.com/luin/ioredis/blob/main/API.md)。\n","readmeFilename":"README.zh-CN.md"}