[{"data":1,"prerenderedAt":567},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Fredis-setup":151,"\u002Fgetting-started\u002Fredis-setup-surround":562},[4,29,56,79,94,121,128,144],{"title":5,"path":6,"stem":7,"children":8,"icon":27,"defaultOpen":28},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-book-open",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Redis setup","\u002Fgetting-started\u002Fredis-setup","1.getting-started\u002F3.redis-setup","i-lucide-database",{"title":23,"path":24,"stem":25,"icon":26},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F4.quickstart","i-lucide-zap","i-lucide-rocket",true,{"title":30,"icon":31,"path":32,"stem":33,"children":34,"page":55},"Concepts","i-lucide-lightbulb","\u002Fconcepts","2.concepts",[35,40,45,50],{"title":36,"path":37,"stem":38,"icon":39},"Keys","\u002Fconcepts\u002Fkeys","2.concepts\u002F1.keys","i-lucide-key-round",{"title":41,"path":42,"stem":43,"icon":44},"Strict vs lax","\u002Fconcepts\u002Fstrict-vs-lax","2.concepts\u002F2.strict-vs-lax","i-lucide-scale",{"title":46,"path":47,"stem":48,"icon":49},"Comparators","\u002Fconcepts\u002Fcomparators","2.concepts\u002F3.comparators","i-lucide-git-compare",{"title":51,"path":52,"stem":53,"icon":54},"Errors","\u002Fconcepts\u002Ferrors","2.concepts\u002F4.errors","i-lucide-triangle-alert",false,{"title":57,"path":58,"stem":59,"children":60,"icon":63},"Counters","\u002Fcounters","3.counters\u002F1.index",[61,64,69,74],{"title":62,"path":58,"stem":59,"icon":63},"Overview","i-lucide-hash",{"title":65,"path":66,"stem":67,"icon":68},"StrictCounter","\u002Fcounters\u002Fstrict-counter","3.counters\u002F2.strict-counter","i-lucide-target",{"title":70,"path":71,"stem":72,"icon":73},"LaxCounter","\u002Fcounters\u002Flax-counter","3.counters\u002F3.lax-counter","i-lucide-wind",{"title":75,"path":76,"stem":77,"icon":78},"Conditional & batch operations","\u002Fcounters\u002Fconditional-and-batch","3.counters\u002F4.conditional-and-batch","i-lucide-layers",{"title":80,"path":81,"stem":82,"children":83,"icon":85},"Instance-aware counters","\u002Finstance-aware-counters","4.instance-aware-counters\u002F1.index",[84,86,90],{"title":62,"path":81,"stem":82,"icon":85},"i-lucide-network",{"title":87,"path":88,"stem":89,"icon":68},"StrictInstanceAwareCounter","\u002Finstance-aware-counters\u002Fstrict","4.instance-aware-counters\u002F2.strict",{"title":91,"path":92,"stem":93,"icon":73},"LaxInstanceAwareCounter","\u002Finstance-aware-counters\u002Flax","4.instance-aware-counters\u002F3.lax",{"title":95,"path":96,"stem":97,"children":98,"icon":100},"Locks","\u002Flocks","5.locks\u002F1.index",[99,101,106,111,116],{"title":62,"path":96,"stem":97,"icon":100},"i-lucide-lock",{"title":102,"path":103,"stem":104,"icon":105},"Mutex","\u002Flocks\u002Fmutex","5.locks\u002F2.mutex","i-lucide-lock-keyhole",{"title":107,"path":108,"stem":109,"icon":110},"RwLock","\u002Flocks\u002Frwlock","5.locks\u002F3.rwlock","i-lucide-book-lock",{"title":112,"path":113,"stem":114,"icon":115},"Lock options","\u002Flocks\u002Foptions","5.locks\u002F4.options","i-lucide-sliders-horizontal",{"title":117,"path":118,"stem":119,"icon":120},"Guard state & errors","\u002Flocks\u002Fguard-state","5.locks\u002F5.guard-state","i-lucide-shield-alert",{"title":122,"path":123,"stem":124,"children":125,"icon":127},"Rate limiting","\u002Frate-limiting","6.rate-limiting\u002F1.index",[126],{"title":122,"path":123,"stem":124,"icon":127},"i-lucide-gauge",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":55},"Reference","i-lucide-book-marked","\u002Freference","7.reference",[134,139],{"title":135,"path":136,"stem":137,"icon":138},"Feature flags","\u002Freference\u002Ffeature-flags","7.reference\u002F1.feature-flags","i-lucide-flag",{"title":140,"path":141,"stem":142,"icon":143},"API reference","\u002Freference\u002Fapi","7.reference\u002F2.api","i-lucide-file-code",{"title":145,"path":146,"stem":147,"children":148,"icon":150},"Changelog","\u002Fchangelog","8.changelog\u002F1.index",[149],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-scroll",{"id":152,"title":18,"badge":153,"body":154,"date":153,"description":556,"extension":557,"links":153,"meta":558,"navigation":559,"path":19,"seo":560,"stem":20,"__hash__":561},"docs\u002F1.getting-started\u002F3.redis-setup.md",null,{"type":155,"value":156,"toc":550},"minimark",[157,166,171,174,209,212,216,306,316,411,415,429,528,532,546],[158,159,160,161,165],"p",{},"Every distkit primitive is constructed with a ",[162,163,164],"code",{},"redis::aio::ConnectionManager",". The connection manager is cheap to clone and reconnects on its own, so you build it once and hand a clone to each counter or lock.",[167,168,170],"h2",{"id":169},"a-redis-to-talk-to","A Redis to talk to",[158,172,173],{},"For local development, any Redis 5.0+ works. With Docker:",[175,176,181],"pre",{"className":177,"code":178,"language":179,"meta":180,"style":180},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","docker run --rm -p 6379:6379 redis:7.2-alpine\n","bash","",[162,182,183],{"__ignoreMap":180},[184,185,188,192,196,200,203,206],"span",{"class":186,"line":187},"line",1,[184,189,191],{"class":190},"sbgvK","docker",[184,193,195],{"class":194},"s_sjI"," run",[184,197,199],{"class":198},"stzsN"," --rm",[184,201,202],{"class":198}," -p",[184,204,205],{"class":194}," 6379:6379",[184,207,208],{"class":194}," redis:7.2-alpine\n",[158,210,211],{},"distkit only needs standard Redis - no modules.",[167,213,215],{"id":214},"building-a-connection","Building a connection",[175,217,221],{"className":218,"code":219,"language":220,"meta":180,"style":180},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","let client = redis::Client::open(\"redis:\u002F\u002F127.0.0.1\u002F\")?;\nlet conn = client.get_connection_manager().await?;\n","rust",[162,222,223,274],{"__ignoreMap":180},[184,224,225,229,233,237,240,243,246,248,252,256,260,263,265,268,271],{"class":186,"line":187},[184,226,228],{"class":227},"sbsja","let",[184,230,232],{"class":231},"su5hD"," client ",[184,234,236],{"class":235},"smGrS","=",[184,238,239],{"class":190}," redis",[184,241,242],{"class":235},"::",[184,244,245],{"class":190},"Client",[184,247,242],{"class":235},[184,249,251],{"class":250},"sGLFI","open",[184,253,255],{"class":254},"sP7_E","(",[184,257,259],{"class":258},"sjJ54","\"",[184,261,262],{"class":194},"redis:\u002F\u002F127.0.0.1\u002F",[184,264,259],{"class":258},[184,266,267],{"class":254},")",[184,269,270],{"class":235},"?",[184,272,273],{"class":254},";\n",[184,275,277,279,282,284,287,290,293,296,298,302,304],{"class":186,"line":276},2,[184,278,228],{"class":227},[184,280,281],{"class":231}," conn ",[184,283,236],{"class":235},[184,285,286],{"class":231}," client",[184,288,289],{"class":235},".",[184,291,292],{"class":250},"get_connection_manager",[184,294,295],{"class":254},"()",[184,297,289],{"class":235},[184,299,301],{"class":300},"sVHd0","await",[184,303,270],{"class":235},[184,305,273],{"class":254},[158,307,308,311,312,315],{},[162,309,310],{},"conn"," is a ",[162,313,314],{},"ConnectionManager",". Clone it freely - clones share the same underlying connection pool:",[175,317,319],{"className":218,"code":318,"language":220,"meta":180,"style":180},"let counter = StrictCounter::new(CounterOptions::new(prefix.clone(), conn.clone()));\nlet mutex = Mutex::new(LockOptions::new(key, conn.clone()));\n",[162,320,321,370],{"__ignoreMap":180},[184,322,323,325,328,330,333,335,338,340,343,345,347,349,352,354,357,360,363,365,367],{"class":186,"line":187},[184,324,228],{"class":227},[184,326,327],{"class":231}," counter ",[184,329,236],{"class":235},[184,331,332],{"class":190}," StrictCounter",[184,334,242],{"class":235},[184,336,337],{"class":250},"new",[184,339,255],{"class":254},[184,341,342],{"class":190},"CounterOptions",[184,344,242],{"class":235},[184,346,337],{"class":250},[184,348,255],{"class":254},[184,350,351],{"class":231},"prefix",[184,353,289],{"class":235},[184,355,356],{"class":250},"clone",[184,358,359],{"class":254},"(),",[184,361,362],{"class":231}," conn",[184,364,289],{"class":235},[184,366,356],{"class":250},[184,368,369],{"class":254},"()));\n",[184,371,372,374,377,379,382,384,386,388,391,393,395,397,400,403,405,407,409],{"class":186,"line":276},[184,373,228],{"class":227},[184,375,376],{"class":231}," mutex ",[184,378,236],{"class":235},[184,380,381],{"class":190}," Mutex",[184,383,242],{"class":235},[184,385,337],{"class":250},[184,387,255],{"class":254},[184,389,390],{"class":190},"LockOptions",[184,392,242],{"class":235},[184,394,337],{"class":250},[184,396,255],{"class":254},[184,398,399],{"class":231},"key",[184,401,402],{"class":254},",",[184,404,362],{"class":231},[184,406,289],{"class":235},[184,408,356],{"class":250},[184,410,369],{"class":254},[167,412,414],{"id":413},"keys-and-namespacing","Keys and namespacing",[158,416,417,418,424,425,428],{},"distkit wraps every key in a ",[419,420,421],"a",{"href":37},[162,422,423],{},"DistkitRedisKey",", which validates it (non-empty, at most 255 bytes, no ",[162,426,427],{},":","). The colon is reserved because distkit uses it internally to namespace the keys it writes, so your data never collides with distkit's bookkeeping.",[175,430,432],{"className":218,"code":431,"language":220,"meta":180,"style":180},"use distkit::DistkitRedisKey;\n\nlet prefix = DistkitRedisKey::try_from(\"my_app\".to_string())?;\nlet key = DistkitRedisKey::try_from(\"page_views\".to_string())?;\n",[162,433,434,449,454,493],{"__ignoreMap":180},[184,435,436,440,443,445,447],{"class":186,"line":187},[184,437,439],{"class":438},"sw1J6","use",[184,441,442],{"class":190}," distkit",[184,444,242],{"class":235},[184,446,423],{"class":190},[184,448,273],{"class":254},[184,450,451],{"class":186,"line":276},[184,452,453],{"emptyLinePlaceholder":28},"\n",[184,455,457,459,462,464,467,469,472,474,476,479,481,483,486,489,491],{"class":186,"line":456},3,[184,458,228],{"class":227},[184,460,461],{"class":231}," prefix ",[184,463,236],{"class":235},[184,465,466],{"class":190}," DistkitRedisKey",[184,468,242],{"class":235},[184,470,471],{"class":250},"try_from",[184,473,255],{"class":254},[184,475,259],{"class":258},[184,477,478],{"class":194},"my_app",[184,480,259],{"class":258},[184,482,289],{"class":235},[184,484,485],{"class":250},"to_string",[184,487,488],{"class":254},"())",[184,490,270],{"class":235},[184,492,273],{"class":254},[184,494,496,498,501,503,505,507,509,511,513,516,518,520,522,524,526],{"class":186,"line":495},4,[184,497,228],{"class":227},[184,499,500],{"class":231}," key ",[184,502,236],{"class":235},[184,504,466],{"class":190},[184,506,242],{"class":235},[184,508,471],{"class":250},[184,510,255],{"class":254},[184,512,259],{"class":258},[184,514,515],{"class":194},"page_views",[184,517,259],{"class":258},[184,519,289],{"class":235},[184,521,485],{"class":250},[184,523,488],{"class":254},[184,525,270],{"class":235},[184,527,273],{"class":254},[167,529,531],{"id":530},"next-steps","Next steps",[533,534,535,541],"ul",{},[536,537,538,540],"li",{},[419,539,23],{"href":24}," - put it together.",[536,542,543,545],{},[419,544,36],{"href":37}," - the rules for valid keys.",[547,548,549],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":180,"searchDepth":187,"depth":276,"links":551},[552,553,554,555],{"id":169,"depth":276,"text":170},{"id":214,"depth":276,"text":215},{"id":413,"depth":276,"text":414},{"id":530,"depth":276,"text":531},"Build a Redis connection manager that your distkit primitives can share.","md",{},{"icon":21},{"title":18,"description":556},"h-TS9x52nVJ-X03Wgcr657ZL-acmGe6FqXtW6LmMo1U",[563,565],{"title":13,"path":14,"stem":15,"description":564,"icon":16,"children":-1},"Add distkit and turn on only the primitives you need with feature flags.",{"title":23,"path":24,"stem":25,"description":566,"icon":26,"children":-1},"A distributed counter running end to end in a few lines.",1781569582557]