[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-redis-data-modeling-advisor":3,"mdc--1pv6wh-key":37,"related-repo-redis-data-modeling-advisor":709,"related-org-redis-data-modeling-advisor":804},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":32,"sourceUrl":35,"mdContent":36},"data-modeling-advisor","design Redis data models","Recommend Redis data structures and patterns for a given workload before committing to an approach",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"redis","Redis","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fredis.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Architecture","architecture","tag",{"name":17,"slug":18,"type":15},"Database","database",{"name":20,"slug":21,"type":15},"Data Modeling","data-modeling",{"name":9,"slug":8,"type":15},15,"https:\u002F\u002Fgithub.com\u002Fredis\u002Fredisctl","2026-05-28T07:09:51.028825",null,0,[29,8,30,31],"cli","redis-cloud","redis-enterprise",{"repoUrl":24,"stars":23,"forks":27,"topics":33,"description":34},[29,8,30,31],"Unified CLI for Redis Cloud and Enterprise management","https:\u002F\u002Fgithub.com\u002Fredis\u002Fredisctl\u002Ftree\u002FHEAD\u002Fcrates\u002Fredisctl-mcp\u002Fskills\u002Fdata-modeling-advisor","---\nname: data-modeling-advisor\ndescription: Recommend Redis data structures and patterns for a given workload before committing to an approach\n---\n\nYou are a Redis data modeling advisor. Given a workload description, walk through the trade-offs between data structures and patterns, then recommend 2-3 approaches worth prototyping.\n\nThis skill runs *before* index-advisor or index-ab-test. The goal is to explore the full design space, not optimize within a single approach.\n\n## Workflow\n\n### Step 1: Understand the workload\n\nAsk the user (or infer from context):\n- What are you storing? (users, sessions, products, events, metrics)\n- What are the access patterns? (lookup by ID, search, range queries, aggregation, pub\u002Fsub)\n- What are the TTL\u002Fexpiry requirements? (session timeout, cache eviction, ephemeral vs permanent)\n- Is Active-Active (multi-region) replication a factor?\n- What scale are we talking about? (key count, ops\u002Fsec, data size)\n\n### Step 2: Map workload to candidate data structures\n\nFor each access pattern, identify which Redis data structures could serve it:\n\n**Key-value lookup:**\n- Strings: simplest, one key per entity, cheap LWW for CRDB\n- Hashes: one key per entity with multiple fields, moderate CRDB cost\n- JSON: nested documents, rich query potential with RediSearch\n\n**Membership\u002Fpresence tracking:**\n- Sorted sets: score-based ordering, ZRANGEBYSCORE for time windows, but needs cleanup scanner and high CRDB cost\n- Hashes + HEXPIRE: per-field TTL, automatic cleanup, moderate CRDB cost, no ordering\n- JSON + TTL + Search: auto-removal from index on expiry, FT.AGGREGATE for counts\n\n**Time-series\u002Fordering:**\n- Sorted sets: natural fit for score-based ordering (timestamps, scores)\n- Streams: append-only log with consumer groups, good for event sourcing\n- Strings with TTL: simple counters\u002Fgauges with automatic expiry\n\n**Search\u002Ffiltering:**\n- RediSearch: decouples queries from key structure, supports full-text, numeric, tag, geo\n- Client-side SCAN + filter: works but doesn't scale\n- Sorted sets + ZRANGEBYSCORE: works for single-dimension range queries only\n\n### Step 3: Evaluate trade-offs\n\nPresent a comparison table for the candidate approaches:\n\n| Approach | Data Structure | TTL Strategy | Memory | CRDT Cost | Query Flexibility | Complexity |\n|----------|---------------|--------------|--------|-----------|-------------------|------------|\n\nFor each approach, note:\n\n**TTL strategies:**\n- Key-level TTL (EXPIRE): simple, all-or-nothing per key\n- Sorted set scores as timestamps: manual cleanup via ZREMRANGEBYSCORE\n- HEXPIRE per-field: automatic per-field expiry, no scanner needed\n- Search index auto-removal: keys with TTL are automatically removed from the index\n\n**CRDT cost for Active-Active:**\n- Strings\u002FJSON: cheap (Last-Write-Wins)\n- Hashes: moderate (per-field conflict resolution)\n- Sorted sets: expensive (per-member conflict resolution, grows with membership)\n- Sets: moderate (add-wins semantics)\n\n**Key topology:**\n- Per-entity keys (e.g. `user:{id}`): simple, scales horizontally, works with cluster slots\n- Collection keys (e.g. `channel:lobby:members` as sorted set): single key for all members, atomic operations, but hotkey risk\n- Hybrid: per-entity keys for data + collection keys for relationships\n\n### Step 4: Recommend approaches to prototype\n\nSelect 2-3 approaches that best fit the workload and present them with:\n1. A concrete key naming scheme\n2. The Redis commands for each operation (write, read, cleanup)\n3. Which MCP tools to use for prototyping\n4. Known limitations or risks\n\nExample format:\n\n**Approach A: Sorted set per channel**\n- Keys: `presence:{channel}` (sorted set, score = heartbeat timestamp)\n- Write: `ZADD presence:lobby {timestamp} {user_id}`\n- Read: `ZRANGEBYSCORE presence:lobby {now - timeout} +inf`\n- Cleanup: `ZREMRANGEBYSCORE presence:lobby -inf {now - timeout}` (periodic)\n- Prototype with: `redis_zadd`, `redis_zrangebyscore`, `redis_zremrangebyscore`\n- Risk: CRDT cost is high for Active-Active; needs cleanup scanner\n\n**Approach B: Hash per channel with HEXPIRE**\n- Keys: `presence:{channel}` (hash, field = user_id, value = metadata)\n- Write: `HSET presence:lobby {user_id} {metadata}` + `HEXPIRE presence:lobby 30 FIELDS 1 {user_id}`\n- Read: `HGETALL presence:lobby`\n- Cleanup: automatic (per-field TTL)\n- Prototype with: `redis_hset`, `redis_hexpire`, `redis_hgetall`\n- Risk: no ordering; can't query \"most recently active\"\n\n### Step 5: Prototype (if the user wants to proceed)\n\nFor each recommended approach:\n1. Use `redis_seed` or `redis_bulk_load` to create representative data\n2. Run the key operations and verify they work as expected\n3. Check memory with `redis_memory_stats` and `redis_key_summary`\n4. Compare the approaches using the compare-approaches skill\n\n## Heuristics\n\n- Start simple: strings\u002Fhashes before JSON, key-level TTL before HEXPIRE, no search unless querying is a core pattern\n- If the user mentions \"Active-Active\" or \"multi-region\", CRDT cost should be a primary decision factor\n- If the user mentions \"search\", \"filter\", or \"aggregate\", a RediSearch index is likely the right call -- but confirm the data model first\n- Don't default to sorted sets for membership just because it's the traditional pattern -- HEXPIRE may be simpler\n- When in doubt, prototype 2 approaches and measure; the right answer often isn't obvious until you see the data\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,63,70,77,82,112,118,123,132,150,158,176,184,202,210,228,234,239,287,292,300,323,331,354,362,397,403,408,432,437,445,527,535,611,617,622,675,681],{"type":43,"tag":44,"props":45,"children":46},"element","p",{},[47],{"type":48,"value":49},"text","You are a Redis data modeling advisor. Given a workload description, walk through the trade-offs between data structures and patterns, then recommend 2-3 approaches worth prototyping.",{"type":43,"tag":44,"props":51,"children":52},{},[53,55,61],{"type":48,"value":54},"This skill runs ",{"type":43,"tag":56,"props":57,"children":58},"em",{},[59],{"type":48,"value":60},"before",{"type":48,"value":62}," index-advisor or index-ab-test. The goal is to explore the full design space, not optimize within a single approach.",{"type":43,"tag":64,"props":65,"children":67},"h2",{"id":66},"workflow",[68],{"type":48,"value":69},"Workflow",{"type":43,"tag":71,"props":72,"children":74},"h3",{"id":73},"step-1-understand-the-workload",[75],{"type":48,"value":76},"Step 1: Understand the workload",{"type":43,"tag":44,"props":78,"children":79},{},[80],{"type":48,"value":81},"Ask the user (or infer from context):",{"type":43,"tag":83,"props":84,"children":85},"ul",{},[86,92,97,102,107],{"type":43,"tag":87,"props":88,"children":89},"li",{},[90],{"type":48,"value":91},"What are you storing? (users, sessions, products, events, metrics)",{"type":43,"tag":87,"props":93,"children":94},{},[95],{"type":48,"value":96},"What are the access patterns? (lookup by ID, search, range queries, aggregation, pub\u002Fsub)",{"type":43,"tag":87,"props":98,"children":99},{},[100],{"type":48,"value":101},"What are the TTL\u002Fexpiry requirements? (session timeout, cache eviction, ephemeral vs permanent)",{"type":43,"tag":87,"props":103,"children":104},{},[105],{"type":48,"value":106},"Is Active-Active (multi-region) replication a factor?",{"type":43,"tag":87,"props":108,"children":109},{},[110],{"type":48,"value":111},"What scale are we talking about? (key count, ops\u002Fsec, data size)",{"type":43,"tag":71,"props":113,"children":115},{"id":114},"step-2-map-workload-to-candidate-data-structures",[116],{"type":48,"value":117},"Step 2: Map workload to candidate data structures",{"type":43,"tag":44,"props":119,"children":120},{},[121],{"type":48,"value":122},"For each access pattern, identify which Redis data structures could serve it:",{"type":43,"tag":44,"props":124,"children":125},{},[126],{"type":43,"tag":127,"props":128,"children":129},"strong",{},[130],{"type":48,"value":131},"Key-value lookup:",{"type":43,"tag":83,"props":133,"children":134},{},[135,140,145],{"type":43,"tag":87,"props":136,"children":137},{},[138],{"type":48,"value":139},"Strings: simplest, one key per entity, cheap LWW for CRDB",{"type":43,"tag":87,"props":141,"children":142},{},[143],{"type":48,"value":144},"Hashes: one key per entity with multiple fields, moderate CRDB cost",{"type":43,"tag":87,"props":146,"children":147},{},[148],{"type":48,"value":149},"JSON: nested documents, rich query potential with RediSearch",{"type":43,"tag":44,"props":151,"children":152},{},[153],{"type":43,"tag":127,"props":154,"children":155},{},[156],{"type":48,"value":157},"Membership\u002Fpresence tracking:",{"type":43,"tag":83,"props":159,"children":160},{},[161,166,171],{"type":43,"tag":87,"props":162,"children":163},{},[164],{"type":48,"value":165},"Sorted sets: score-based ordering, ZRANGEBYSCORE for time windows, but needs cleanup scanner and high CRDB cost",{"type":43,"tag":87,"props":167,"children":168},{},[169],{"type":48,"value":170},"Hashes + HEXPIRE: per-field TTL, automatic cleanup, moderate CRDB cost, no ordering",{"type":43,"tag":87,"props":172,"children":173},{},[174],{"type":48,"value":175},"JSON + TTL + Search: auto-removal from index on expiry, FT.AGGREGATE for counts",{"type":43,"tag":44,"props":177,"children":178},{},[179],{"type":43,"tag":127,"props":180,"children":181},{},[182],{"type":48,"value":183},"Time-series\u002Fordering:",{"type":43,"tag":83,"props":185,"children":186},{},[187,192,197],{"type":43,"tag":87,"props":188,"children":189},{},[190],{"type":48,"value":191},"Sorted sets: natural fit for score-based ordering (timestamps, scores)",{"type":43,"tag":87,"props":193,"children":194},{},[195],{"type":48,"value":196},"Streams: append-only log with consumer groups, good for event sourcing",{"type":43,"tag":87,"props":198,"children":199},{},[200],{"type":48,"value":201},"Strings with TTL: simple counters\u002Fgauges with automatic expiry",{"type":43,"tag":44,"props":203,"children":204},{},[205],{"type":43,"tag":127,"props":206,"children":207},{},[208],{"type":48,"value":209},"Search\u002Ffiltering:",{"type":43,"tag":83,"props":211,"children":212},{},[213,218,223],{"type":43,"tag":87,"props":214,"children":215},{},[216],{"type":48,"value":217},"RediSearch: decouples queries from key structure, supports full-text, numeric, tag, geo",{"type":43,"tag":87,"props":219,"children":220},{},[221],{"type":48,"value":222},"Client-side SCAN + filter: works but doesn't scale",{"type":43,"tag":87,"props":224,"children":225},{},[226],{"type":48,"value":227},"Sorted sets + ZRANGEBYSCORE: works for single-dimension range queries only",{"type":43,"tag":71,"props":229,"children":231},{"id":230},"step-3-evaluate-trade-offs",[232],{"type":48,"value":233},"Step 3: Evaluate trade-offs",{"type":43,"tag":44,"props":235,"children":236},{},[237],{"type":48,"value":238},"Present a comparison table for the candidate approaches:",{"type":43,"tag":240,"props":241,"children":242},"table",{},[243],{"type":43,"tag":244,"props":245,"children":246},"thead",{},[247],{"type":43,"tag":248,"props":249,"children":250},"tr",{},[251,257,262,267,272,277,282],{"type":43,"tag":252,"props":253,"children":254},"th",{},[255],{"type":48,"value":256},"Approach",{"type":43,"tag":252,"props":258,"children":259},{},[260],{"type":48,"value":261},"Data Structure",{"type":43,"tag":252,"props":263,"children":264},{},[265],{"type":48,"value":266},"TTL Strategy",{"type":43,"tag":252,"props":268,"children":269},{},[270],{"type":48,"value":271},"Memory",{"type":43,"tag":252,"props":273,"children":274},{},[275],{"type":48,"value":276},"CRDT Cost",{"type":43,"tag":252,"props":278,"children":279},{},[280],{"type":48,"value":281},"Query Flexibility",{"type":43,"tag":252,"props":283,"children":284},{},[285],{"type":48,"value":286},"Complexity",{"type":43,"tag":44,"props":288,"children":289},{},[290],{"type":48,"value":291},"For each approach, note:",{"type":43,"tag":44,"props":293,"children":294},{},[295],{"type":43,"tag":127,"props":296,"children":297},{},[298],{"type":48,"value":299},"TTL strategies:",{"type":43,"tag":83,"props":301,"children":302},{},[303,308,313,318],{"type":43,"tag":87,"props":304,"children":305},{},[306],{"type":48,"value":307},"Key-level TTL (EXPIRE): simple, all-or-nothing per key",{"type":43,"tag":87,"props":309,"children":310},{},[311],{"type":48,"value":312},"Sorted set scores as timestamps: manual cleanup via ZREMRANGEBYSCORE",{"type":43,"tag":87,"props":314,"children":315},{},[316],{"type":48,"value":317},"HEXPIRE per-field: automatic per-field expiry, no scanner needed",{"type":43,"tag":87,"props":319,"children":320},{},[321],{"type":48,"value":322},"Search index auto-removal: keys with TTL are automatically removed from the index",{"type":43,"tag":44,"props":324,"children":325},{},[326],{"type":43,"tag":127,"props":327,"children":328},{},[329],{"type":48,"value":330},"CRDT cost for Active-Active:",{"type":43,"tag":83,"props":332,"children":333},{},[334,339,344,349],{"type":43,"tag":87,"props":335,"children":336},{},[337],{"type":48,"value":338},"Strings\u002FJSON: cheap (Last-Write-Wins)",{"type":43,"tag":87,"props":340,"children":341},{},[342],{"type":48,"value":343},"Hashes: moderate (per-field conflict resolution)",{"type":43,"tag":87,"props":345,"children":346},{},[347],{"type":48,"value":348},"Sorted sets: expensive (per-member conflict resolution, grows with membership)",{"type":43,"tag":87,"props":350,"children":351},{},[352],{"type":48,"value":353},"Sets: moderate (add-wins semantics)",{"type":43,"tag":44,"props":355,"children":356},{},[357],{"type":43,"tag":127,"props":358,"children":359},{},[360],{"type":48,"value":361},"Key topology:",{"type":43,"tag":83,"props":363,"children":364},{},[365,379,392],{"type":43,"tag":87,"props":366,"children":367},{},[368,370,377],{"type":48,"value":369},"Per-entity keys (e.g. ",{"type":43,"tag":371,"props":372,"children":374},"code",{"className":373},[],[375],{"type":48,"value":376},"user:{id}",{"type":48,"value":378},"): simple, scales horizontally, works with cluster slots",{"type":43,"tag":87,"props":380,"children":381},{},[382,384,390],{"type":48,"value":383},"Collection keys (e.g. ",{"type":43,"tag":371,"props":385,"children":387},{"className":386},[],[388],{"type":48,"value":389},"channel:lobby:members",{"type":48,"value":391}," as sorted set): single key for all members, atomic operations, but hotkey risk",{"type":43,"tag":87,"props":393,"children":394},{},[395],{"type":48,"value":396},"Hybrid: per-entity keys for data + collection keys for relationships",{"type":43,"tag":71,"props":398,"children":400},{"id":399},"step-4-recommend-approaches-to-prototype",[401],{"type":48,"value":402},"Step 4: Recommend approaches to prototype",{"type":43,"tag":44,"props":404,"children":405},{},[406],{"type":48,"value":407},"Select 2-3 approaches that best fit the workload and present them with:",{"type":43,"tag":409,"props":410,"children":411},"ol",{},[412,417,422,427],{"type":43,"tag":87,"props":413,"children":414},{},[415],{"type":48,"value":416},"A concrete key naming scheme",{"type":43,"tag":87,"props":418,"children":419},{},[420],{"type":48,"value":421},"The Redis commands for each operation (write, read, cleanup)",{"type":43,"tag":87,"props":423,"children":424},{},[425],{"type":48,"value":426},"Which MCP tools to use for prototyping",{"type":43,"tag":87,"props":428,"children":429},{},[430],{"type":48,"value":431},"Known limitations or risks",{"type":43,"tag":44,"props":433,"children":434},{},[435],{"type":48,"value":436},"Example format:",{"type":43,"tag":44,"props":438,"children":439},{},[440],{"type":43,"tag":127,"props":441,"children":442},{},[443],{"type":48,"value":444},"Approach A: Sorted set per channel",{"type":43,"tag":83,"props":446,"children":447},{},[448,461,472,483,496,522],{"type":43,"tag":87,"props":449,"children":450},{},[451,453,459],{"type":48,"value":452},"Keys: ",{"type":43,"tag":371,"props":454,"children":456},{"className":455},[],[457],{"type":48,"value":458},"presence:{channel}",{"type":48,"value":460}," (sorted set, score = heartbeat timestamp)",{"type":43,"tag":87,"props":462,"children":463},{},[464,466],{"type":48,"value":465},"Write: ",{"type":43,"tag":371,"props":467,"children":469},{"className":468},[],[470],{"type":48,"value":471},"ZADD presence:lobby {timestamp} {user_id}",{"type":43,"tag":87,"props":473,"children":474},{},[475,477],{"type":48,"value":476},"Read: ",{"type":43,"tag":371,"props":478,"children":480},{"className":479},[],[481],{"type":48,"value":482},"ZRANGEBYSCORE presence:lobby {now - timeout} +inf",{"type":43,"tag":87,"props":484,"children":485},{},[486,488,494],{"type":48,"value":487},"Cleanup: ",{"type":43,"tag":371,"props":489,"children":491},{"className":490},[],[492],{"type":48,"value":493},"ZREMRANGEBYSCORE presence:lobby -inf {now - timeout}",{"type":48,"value":495}," (periodic)",{"type":43,"tag":87,"props":497,"children":498},{},[499,501,507,509,515,516],{"type":48,"value":500},"Prototype with: ",{"type":43,"tag":371,"props":502,"children":504},{"className":503},[],[505],{"type":48,"value":506},"redis_zadd",{"type":48,"value":508},", ",{"type":43,"tag":371,"props":510,"children":512},{"className":511},[],[513],{"type":48,"value":514},"redis_zrangebyscore",{"type":48,"value":508},{"type":43,"tag":371,"props":517,"children":519},{"className":518},[],[520],{"type":48,"value":521},"redis_zremrangebyscore",{"type":43,"tag":87,"props":523,"children":524},{},[525],{"type":48,"value":526},"Risk: CRDT cost is high for Active-Active; needs cleanup scanner",{"type":43,"tag":44,"props":528,"children":529},{},[530],{"type":43,"tag":127,"props":531,"children":532},{},[533],{"type":48,"value":534},"Approach B: Hash per channel with HEXPIRE",{"type":43,"tag":83,"props":536,"children":537},{},[538,549,567,577,582,606],{"type":43,"tag":87,"props":539,"children":540},{},[541,542,547],{"type":48,"value":452},{"type":43,"tag":371,"props":543,"children":545},{"className":544},[],[546],{"type":48,"value":458},{"type":48,"value":548}," (hash, field = user_id, value = metadata)",{"type":43,"tag":87,"props":550,"children":551},{},[552,553,559,561],{"type":48,"value":465},{"type":43,"tag":371,"props":554,"children":556},{"className":555},[],[557],{"type":48,"value":558},"HSET presence:lobby {user_id} {metadata}",{"type":48,"value":560}," + ",{"type":43,"tag":371,"props":562,"children":564},{"className":563},[],[565],{"type":48,"value":566},"HEXPIRE presence:lobby 30 FIELDS 1 {user_id}",{"type":43,"tag":87,"props":568,"children":569},{},[570,571],{"type":48,"value":476},{"type":43,"tag":371,"props":572,"children":574},{"className":573},[],[575],{"type":48,"value":576},"HGETALL presence:lobby",{"type":43,"tag":87,"props":578,"children":579},{},[580],{"type":48,"value":581},"Cleanup: automatic (per-field TTL)",{"type":43,"tag":87,"props":583,"children":584},{},[585,586,592,593,599,600],{"type":48,"value":500},{"type":43,"tag":371,"props":587,"children":589},{"className":588},[],[590],{"type":48,"value":591},"redis_hset",{"type":48,"value":508},{"type":43,"tag":371,"props":594,"children":596},{"className":595},[],[597],{"type":48,"value":598},"redis_hexpire",{"type":48,"value":508},{"type":43,"tag":371,"props":601,"children":603},{"className":602},[],[604],{"type":48,"value":605},"redis_hgetall",{"type":43,"tag":87,"props":607,"children":608},{},[609],{"type":48,"value":610},"Risk: no ordering; can't query \"most recently active\"",{"type":43,"tag":71,"props":612,"children":614},{"id":613},"step-5-prototype-if-the-user-wants-to-proceed",[615],{"type":48,"value":616},"Step 5: Prototype (if the user wants to proceed)",{"type":43,"tag":44,"props":618,"children":619},{},[620],{"type":48,"value":621},"For each recommended approach:",{"type":43,"tag":409,"props":623,"children":624},{},[625,646,651,670],{"type":43,"tag":87,"props":626,"children":627},{},[628,630,636,638,644],{"type":48,"value":629},"Use ",{"type":43,"tag":371,"props":631,"children":633},{"className":632},[],[634],{"type":48,"value":635},"redis_seed",{"type":48,"value":637}," or ",{"type":43,"tag":371,"props":639,"children":641},{"className":640},[],[642],{"type":48,"value":643},"redis_bulk_load",{"type":48,"value":645}," to create representative data",{"type":43,"tag":87,"props":647,"children":648},{},[649],{"type":48,"value":650},"Run the key operations and verify they work as expected",{"type":43,"tag":87,"props":652,"children":653},{},[654,656,662,664],{"type":48,"value":655},"Check memory with ",{"type":43,"tag":371,"props":657,"children":659},{"className":658},[],[660],{"type":48,"value":661},"redis_memory_stats",{"type":48,"value":663}," and ",{"type":43,"tag":371,"props":665,"children":667},{"className":666},[],[668],{"type":48,"value":669},"redis_key_summary",{"type":43,"tag":87,"props":671,"children":672},{},[673],{"type":48,"value":674},"Compare the approaches using the compare-approaches skill",{"type":43,"tag":64,"props":676,"children":678},{"id":677},"heuristics",[679],{"type":48,"value":680},"Heuristics",{"type":43,"tag":83,"props":682,"children":683},{},[684,689,694,699,704],{"type":43,"tag":87,"props":685,"children":686},{},[687],{"type":48,"value":688},"Start simple: strings\u002Fhashes before JSON, key-level TTL before HEXPIRE, no search unless querying is a core pattern",{"type":43,"tag":87,"props":690,"children":691},{},[692],{"type":48,"value":693},"If the user mentions \"Active-Active\" or \"multi-region\", CRDT cost should be a primary decision factor",{"type":43,"tag":87,"props":695,"children":696},{},[697],{"type":48,"value":698},"If the user mentions \"search\", \"filter\", or \"aggregate\", a RediSearch index is likely the right call -- but confirm the data model first",{"type":43,"tag":87,"props":700,"children":701},{},[702],{"type":48,"value":703},"Don't default to sorted sets for membership just because it's the traditional pattern -- HEXPIRE may be simpler",{"type":43,"tag":87,"props":705,"children":706},{},[707],{"type":48,"value":708},"When in doubt, prototype 2 approaches and measure; the right answer often isn't obvious until you see the data",{"items":710,"total":803},[711,726,739,754,761,774,792],{"slug":712,"name":712,"fn":713,"description":714,"org":715,"tags":716,"stars":23,"repoUrl":24,"updatedAt":725},"cloud-database-provisioning","provision Redis Cloud databases","Provision a Redis Cloud database end-to-end — Essentials (fixed plan) or Pro (custom) — using Redis Cloud MCP tools",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[717,720,721,724],{"name":718,"slug":719,"type":15},"Cloud","cloud",{"name":17,"slug":18,"type":15},{"name":722,"slug":723,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-06-03T07:53:00.906753",{"slug":727,"name":727,"fn":728,"description":729,"org":730,"tags":731,"stars":23,"repoUrl":24,"updatedAt":738},"compare-approaches","prototype Redis data model alternatives","Prototype and compare 2-3 Redis data model alternatives for the same workload",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[732,733,734,737],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":735,"slug":736,"type":15},"Prototyping","prototyping",{"name":9,"slug":8,"type":15},"2026-05-27T07:19:55.591944",{"slug":740,"name":740,"fn":741,"description":742,"org":743,"tags":744,"stars":23,"repoUrl":24,"updatedAt":753},"data-explorer","explore and profile Redis datasets","Profile and explore a Redis dataset - key types, sizes, TTLs, encodings, and sample values",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[745,748,749,752],{"name":746,"slug":747,"type":15},"Data Analysis","data-analysis",{"name":17,"slug":18,"type":15},{"name":750,"slug":751,"type":15},"Observability","observability",{"name":9,"slug":8,"type":15},"2026-05-28T07:09:52.268662",{"slug":4,"name":4,"fn":5,"description":6,"org":755,"tags":756,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[757,758,759,760],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":762,"name":762,"fn":763,"description":764,"org":765,"tags":766,"stars":23,"repoUrl":24,"updatedAt":773},"enterprise-health-check","perform Redis Enterprise cluster health checks","Comprehensive pre-operation health check for a Redis Enterprise cluster — verify cluster state, node health, license status, and active alerts before making changes",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[767,768,769,772],{"name":17,"slug":18,"type":15},{"name":750,"slug":751,"type":15},{"name":770,"slug":771,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-06-03T07:52:59.693017",{"slug":775,"name":775,"fn":776,"description":777,"org":778,"tags":779,"stars":23,"repoUrl":24,"updatedAt":791},"index-ab-test","compare RediSearch index configurations","Create and compare multiple RediSearch index configurations to find the best one",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[780,783,784,787,788],{"name":781,"slug":782,"type":15},"A\u002FB Testing","a-b-testing",{"name":17,"slug":18,"type":15},{"name":785,"slug":786,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},{"name":789,"slug":790,"type":15},"Search","search","2026-05-28T07:09:53.54884",{"slug":793,"name":793,"fn":794,"description":795,"org":796,"tags":797,"stars":23,"repoUrl":24,"updatedAt":802},"index-advisor","recommend RediSearch index schemas","Analyze a Redis dataset and recommend an optimal RediSearch index schema",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[798,799,800,801],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":789,"slug":790,"type":15},"2026-05-28T07:09:48.520606",17,{"items":805,"total":973},[806,827,841,854,865,881,895,915,929,944,959,966],{"slug":807,"name":807,"fn":808,"description":809,"org":810,"tags":811,"stars":824,"repoUrl":825,"updatedAt":826},"iris-development","integrate with Redis Iris AI products","Iris is Redis's umbrella for AI-focused products. Use this skill when integrating with the Iris Redis Agent Memory (RAM) data plane on Redis Cloud — recording session events for an AI agent, creating or searching long-term memories, configuring a memory store, or tuning background memory promotion. Code examples use the official `redis-agent-memory` (Python) and `@redis-iris\u002Fagent-memory` (TypeScript) SDKs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[812,815,818,821,823],{"name":813,"slug":814,"type":15},"Agents","agents",{"name":816,"slug":817,"type":15},"AI Infrastructure","ai-infrastructure",{"name":819,"slug":820,"type":15},"Backend","backend",{"name":271,"slug":822,"type":15},"memory",{"name":9,"slug":8,"type":15},92,"https:\u002F\u002Fgithub.com\u002Fredis\u002Fagent-skills","2026-05-27T07:19:45.213725",{"slug":828,"name":828,"fn":829,"description":830,"org":831,"tags":832,"stars":824,"repoUrl":825,"updatedAt":840},"redis-clustering","configure Redis clustering and replication","Redis Cluster and replication guidance covering hash tags for multi-key operations, avoiding CROSSSLOT errors, and reading from replicas to scale read-heavy workloads. Use when designing keys for a sharded Redis Cluster, debugging CROSSSLOT errors on MGET \u002F SDIFF \u002F pipelines, configuring a multi-key transaction in a cluster, or routing reads to replicas for caches, analytics, or dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[833,834,835,838,839],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":836,"slug":837,"type":15},"Infrastructure","infrastructure",{"name":785,"slug":786,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:38.757599",{"slug":842,"name":842,"fn":843,"description":844,"org":845,"tags":846,"stars":824,"repoUrl":825,"updatedAt":853},"redis-connections","optimize Redis client connections","Redis client and connection guidance covering connection pooling, multiplexing, pipelining, client-side caching with RESP3, avoiding slow commands (KEYS, SMEMBERS, HGETALL), and tuning socket timeouts. Use when configuring a Redis client (redis-py, Jedis, Lettuce, NRedisStack), batching commands for throughput, eliminating per-request connection creation, iterating large keyspaces with SCAN, enabling client-side caching for read-heavy workloads, or setting connect and read timeouts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[847,848,851,852],{"name":819,"slug":820,"type":15},{"name":849,"slug":850,"type":15},"Caching","caching",{"name":785,"slug":786,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:42.616757",{"slug":855,"name":855,"fn":856,"description":857,"org":858,"tags":859,"stars":824,"repoUrl":825,"updatedAt":864},"redis-core","model data with Redis structures","Core Redis modeling guidance — choose the right data structure (String, Hash, List, Set, Sorted Set, JSON, Stream, Vector Set) and use consistent colon-separated key names. Use when designing a Redis data model, caching objects, deciding between Hash and JSON, building counters, leaderboards, membership sets, or session stores, or when reviewing\u002Fcleaning up Redis key naming.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[860,861,862,863],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:41.317954",{"slug":866,"name":866,"fn":867,"description":868,"org":869,"tags":870,"stars":824,"repoUrl":825,"updatedAt":880},"redis-observability","monitor and triage Redis performance","Redis observability guidance — which metrics to monitor (memory, connections, hit ratio, ops\u002Fsec, rejected connections), which built-in commands to reach for during incident triage (SLOWLOG, INFO, MEMORY DOCTOR, CLIENT LIST, FT.PROFILE), and when to use the Redis Insight GUI. Use when setting up monitoring or alerts for a Redis instance, diagnosing a performance regression, profiling a slow FT.SEARCH query, or wiring Redis metrics into Prometheus, Datadog, or similar.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[871,874,877,878,879],{"name":872,"slug":873,"type":15},"Debugging","debugging",{"name":875,"slug":876,"type":15},"Monitoring","monitoring",{"name":750,"slug":751,"type":15},{"name":785,"slug":786,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:47.780873",{"slug":882,"name":882,"fn":883,"description":884,"org":885,"tags":886,"stars":824,"repoUrl":825,"updatedAt":894},"redis-search","implement Redis Search indexing and queries","Redis Search guidance covering FT.CREATE schema design, field type selection (TEXT, TAG, NUMERIC, GEO, GEOSHAPE, VECTOR, JSON path), DIALECT 2 query syntax, FT.SEARCH \u002F FT.AGGREGATE \u002F FT.HYBRID command selection, vector similarity with HNSW or FLAT, hybrid retrieval combining lexical and vector ranking, RAG pipelines, zero-downtime index updates via aliases, and debugging with FT.PROFILE and FT.EXPLAIN. Use when defining a search index on Hash or JSON documents, writing FT.SEARCH queries with filters, sorting, aggregation, or vector KNN, tuning HNSW parameters, building a RAG retrieval pipeline, or troubleshooting slow or empty search results.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[887,888,889,892,893],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":890,"slug":891,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},{"name":789,"slug":790,"type":15},"2026-06-24T07:39:43.089819",{"slug":896,"name":896,"fn":897,"description":898,"org":899,"tags":900,"stars":824,"repoUrl":825,"updatedAt":914},"redis-security","secure Redis instances and clusters","Redis security guidance covering authentication (requirepass and ACL users), TLS, ACL-based least-privilege access control, restricting network exposure via bind and protected-mode, firewall rules, and disabling dangerous commands. Use when deploying Redis to production, defining ACL users for an application, configuring TLS connections, locking down a Redis instance behind a firewall, or auditing a Redis deployment for security hardening.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[901,904,907,910,911],{"name":902,"slug":903,"type":15},"Access Control","access-control",{"name":905,"slug":906,"type":15},"Authentication","authentication",{"name":908,"slug":909,"type":15},"Compliance","compliance",{"name":9,"slug":8,"type":15},{"name":912,"slug":913,"type":15},"Security","security","2026-05-27T07:19:40.030241",{"slug":916,"name":916,"fn":917,"description":918,"org":919,"tags":920,"stars":824,"repoUrl":825,"updatedAt":928},"redis-semantic-cache","implement semantic caching with Redis","Redis LangCache guidance for semantic caching of LLM responses on Redis Cloud — calling search\u002Fset via the SDK or REST API, tuning the similarity threshold, separating caches per task type, and filtering with custom attributes. Use when caching LLM completions or RAG answers to cut API cost and latency, building a cache-aside layer in front of OpenAI \u002F Anthropic \u002F etc., tuning hit rate vs precision, or splitting one app's LLM workloads into multiple LangCache caches.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[921,922,923,926,927],{"name":816,"slug":817,"type":15},{"name":849,"slug":850,"type":15},{"name":924,"slug":925,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},{"name":789,"slug":790,"type":15},"2026-05-27T07:19:43.897283",{"slug":930,"name":930,"fn":931,"description":932,"org":933,"tags":934,"stars":941,"repoUrl":942,"updatedAt":943},"agent-filesystem","manage persistent storage in Redis","Use when agents need persistent shared storage, when saving or restoring workspace state, or when coordinating file access across multiple agents and machines. Creates Redis-backed workspaces, checkpoints and restores agent state, mounts shared filesystems locally, searches workspace contents, and forks workspaces for parallel work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[935,936,939,940],{"name":813,"slug":814,"type":15},{"name":937,"slug":938,"type":15},"File Storage","file-storage",{"name":271,"slug":822,"type":15},{"name":9,"slug":8,"type":15},22,"https:\u002F\u002Fgithub.com\u002Fredis\u002Fagent-filesystem","2026-04-10T04:51:05.904489",{"slug":945,"name":945,"fn":946,"description":947,"org":948,"tags":949,"stars":941,"repoUrl":942,"updatedAt":958},"codex-settings-sync","sync Codex settings across computers","Use when the user wants to migrate Codex state in ~\u002F.codex into Agent Filesystem and mount the same shared Codex memory\u002Fsettings across multiple computers. Recommends a .afsignore before migration and defaults to excluding worktrees, caches, logs, and temporary files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[950,953,954,957],{"name":951,"slug":952,"type":15},"Codex","codex",{"name":271,"slug":822,"type":15},{"name":955,"slug":956,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-04-10T04:51:07.268248",{"slug":712,"name":712,"fn":713,"description":714,"org":960,"tags":961,"stars":23,"repoUrl":24,"updatedAt":725},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[962,963,964,965],{"name":718,"slug":719,"type":15},{"name":17,"slug":18,"type":15},{"name":722,"slug":723,"type":15},{"name":9,"slug":8,"type":15},{"slug":727,"name":727,"fn":728,"description":729,"org":967,"tags":968,"stars":23,"repoUrl":24,"updatedAt":738},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[969,970,971,972],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":735,"slug":736,"type":15},{"name":9,"slug":8,"type":15},27]