{
  "schemaVersion": "1.0",
  "item": {
    "slug": "redis-store",
    "name": "Redis",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/ivangdavila/redis-store",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/redis-store",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/redis-store",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=redis-store",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/redis-store"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/redis-store",
    "agentPageUrl": "https://openagent3.xyz/skills/redis-store/agent",
    "manifestUrl": "https://openagent3.xyz/skills/redis-store/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/redis-store/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Expiration (Memory Leaks)",
        "body": "Keys without TTL live forever—set expiry on every cache key: SET key value EX 3600\nCan't add TTL after SET without another command—use SETEX or SET ... EX\nEXPIRE resets on key update by default—SET removes TTL; use SET ... KEEPTTL (Redis 6+)\nLazy expiration: expired keys removed on access—may consume memory until touched\nSCAN with large database: expired keys still show until cleanup cycle runs"
      },
      {
        "title": "Data Structures I Underuse",
        "body": "Sorted sets for rate limiting: ZADD limits:{user} {now} {request_id} + ZREMRANGEBYSCORE for sliding window\nHyperLogLog for unique counts: PFADD visitors {ip} uses 12KB for billions of uniques\nStreams for queues: XADD, XREAD, XACK—better than LIST for reliable queues\nHashes for objects: HSET user:1 name \"Alice\" email \"a@b.com\"—more memory efficient than JSON string"
      },
      {
        "title": "Atomicity Traps",
        "body": "GET then SET is not atomic—another client can modify between; use INCR, SETNX, or Lua\nSETNX for locks: SET lock:resource {token} NX EX 30—NX = only if not exists\nWATCH/MULTI/EXEC for optimistic locking—transaction aborts if watched key changed\nLua scripts are atomic—use for complex operations: EVAL \"script\" keys args"
      },
      {
        "title": "Pub/Sub Limitations",
        "body": "Messages not persisted—subscribers miss messages sent while disconnected\nAt-most-once delivery—no acknowledgment, no retry\nUse Streams for reliable messaging—XREAD BLOCK + XACK pattern\nPub/Sub across cluster: message goes to all nodes—works but adds overhead"
      },
      {
        "title": "Persistence Configuration",
        "body": "RDB (snapshots): fast recovery, but data loss between snapshots—default every 5min\nAOF (append log): less data loss, slower recovery—appendfsync everysec is good balance\nBoth off = pure cache—acceptable if data can be regenerated\nBGSAVE for manual snapshot—doesn't block but forks process, needs memory headroom"
      },
      {
        "title": "Memory Management (Critical)",
        "body": "maxmemory must be set—without it, Redis uses all RAM, then swap = disaster\nEviction policies: allkeys-lru for cache, volatile-lru for mixed, noeviction for persistent data\nINFO memory shows usage—monitor used_memory vs maxmemory\nLarge keys hurt eviction—one 1GB key evicts poorly; prefer many small keys"
      },
      {
        "title": "Clustering",
        "body": "Hash slots: keys distributed by hash—same slot required for multi-key operations\nHash tags: {user:1}:profile and {user:1}:sessions go to same slot—use for related keys\nNo cross-slot MGET/MSET—error unless all keys in same slot\nMOVED redirect: client must follow—use cluster-aware client library"
      },
      {
        "title": "Common Patterns",
        "body": "Cache-aside: check Redis, miss → fetch DB → write Redis—standard caching\nWrite-through: write DB + Redis together—keeps cache fresh\nRate limiter: INCR requests:{ip}:{minute} with EXPIRE—simple fixed window\nDistributed lock: SET ... NX EX + unique token—verify token on release"
      },
      {
        "title": "Connection Management",
        "body": "Connection pooling: reuse connections—creating is expensive\nPipeline commands: send batch without waiting—reduces round trips\nQUIT on shutdown—graceful disconnect\nSentinel or Cluster for HA—single Redis is SPOF"
      },
      {
        "title": "Common Mistakes",
        "body": "No TTL on cache keys—memory grows until OOM\nUsing as primary database without persistence—data loss on restart\nBlocking operations in single-threaded Redis—KEYS * blocks everything; use SCAN\nStoring large blobs—Redis is RAM; 100MB values are expensive\nIgnoring maxmemory—production Redis without limit will crash host"
      }
    ],
    "body": "Expiration (Memory Leaks)\nKeys without TTL live forever—set expiry on every cache key: SET key value EX 3600\nCan't add TTL after SET without another command—use SETEX or SET ... EX\nEXPIRE resets on key update by default—SET removes TTL; use SET ... KEEPTTL (Redis 6+)\nLazy expiration: expired keys removed on access—may consume memory until touched\nSCAN with large database: expired keys still show until cleanup cycle runs\nData Structures I Underuse\nSorted sets for rate limiting: ZADD limits:{user} {now} {request_id} + ZREMRANGEBYSCORE for sliding window\nHyperLogLog for unique counts: PFADD visitors {ip} uses 12KB for billions of uniques\nStreams for queues: XADD, XREAD, XACK—better than LIST for reliable queues\nHashes for objects: HSET user:1 name \"Alice\" email \"a@b.com\"—more memory efficient than JSON string\nAtomicity Traps\nGET then SET is not atomic—another client can modify between; use INCR, SETNX, or Lua\nSETNX for locks: SET lock:resource {token} NX EX 30—NX = only if not exists\nWATCH/MULTI/EXEC for optimistic locking—transaction aborts if watched key changed\nLua scripts are atomic—use for complex operations: EVAL \"script\" keys args\nPub/Sub Limitations\nMessages not persisted—subscribers miss messages sent while disconnected\nAt-most-once delivery—no acknowledgment, no retry\nUse Streams for reliable messaging—XREAD BLOCK + XACK pattern\nPub/Sub across cluster: message goes to all nodes—works but adds overhead\nPersistence Configuration\nRDB (snapshots): fast recovery, but data loss between snapshots—default every 5min\nAOF (append log): less data loss, slower recovery—appendfsync everysec is good balance\nBoth off = pure cache—acceptable if data can be regenerated\nBGSAVE for manual snapshot—doesn't block but forks process, needs memory headroom\nMemory Management (Critical)\nmaxmemory must be set—without it, Redis uses all RAM, then swap = disaster\nEviction policies: allkeys-lru for cache, volatile-lru for mixed, noeviction for persistent data\nINFO memory shows usage—monitor used_memory vs maxmemory\nLarge keys hurt eviction—one 1GB key evicts poorly; prefer many small keys\nClustering\nHash slots: keys distributed by hash—same slot required for multi-key operations\nHash tags: {user:1}:profile and {user:1}:sessions go to same slot—use for related keys\nNo cross-slot MGET/MSET—error unless all keys in same slot\nMOVED redirect: client must follow—use cluster-aware client library\nCommon Patterns\nCache-aside: check Redis, miss → fetch DB → write Redis—standard caching\nWrite-through: write DB + Redis together—keeps cache fresh\nRate limiter: INCR requests:{ip}:{minute} with EXPIRE—simple fixed window\nDistributed lock: SET ... NX EX + unique token—verify token on release\nConnection Management\nConnection pooling: reuse connections—creating is expensive\nPipeline commands: send batch without waiting—reduces round trips\nQUIT on shutdown—graceful disconnect\nSentinel or Cluster for HA—single Redis is SPOF\nCommon Mistakes\nNo TTL on cache keys—memory grows until OOM\nUsing as primary database without persistence—data loss on restart\nBlocking operations in single-threaded Redis—KEYS * blocks everything; use SCAN\nStoring large blobs—Redis is RAM; 100MB values are expensive\nIgnoring maxmemory—production Redis without limit will crash host"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/redis-store",
    "publisherUrl": "https://clawhub.ai/ivangdavila/redis-store",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/redis-store",
    "downloadUrl": "https://openagent3.xyz/downloads/redis-store",
    "agentUrl": "https://openagent3.xyz/skills/redis-store/agent",
    "manifestUrl": "https://openagent3.xyz/skills/redis-store/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/redis-store/agent.md"
  }
}