[{"data":1,"prerenderedAt":896},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Fquickstart":151,"\u002Fgetting-started\u002Fquickstart-surround":891},[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":23,"badge":153,"body":154,"date":153,"description":885,"extension":886,"links":153,"meta":887,"navigation":888,"path":24,"seo":889,"stem":25,"__hash__":890},"docs\u002F1.getting-started\u002F4.quickstart.md",null,{"type":155,"value":156,"toc":880},"minimark",[157,166,171,775,779,838,851,855,876],[158,159,160,161,165],"p",{},"This walks through a complete program: connect to Redis, create a counter, and read it back. It uses only the default features, so a plain ",[162,163,164],"code",{},"distkit = \"0.5\""," is enough.",[167,168,170],"h2",{"id":169},"the-whole-thing","The whole thing",[172,173,178],"pre",{"className":174,"code":175,"language":176,"meta":177,"style":177},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use distkit::{DistkitRedisKey, counter::{StrictCounter, LaxCounter, CounterOptions, CounterTrait}};\n\n#[tokio::main]\nasync fn main() -> Result\u003C(), Box\u003Cdyn std::error::Error>> {\n    let client = redis::Client::open(\"redis:\u002F\u002F127.0.0.1\u002F\")?;\n    let conn = client.get_connection_manager().await?;\n\n    let prefix = DistkitRedisKey::try_from(\"my_app\".to_string())?;\n    let options = CounterOptions::new(prefix, conn);\n\n    let key = DistkitRedisKey::try_from(\"page_views\".to_string())?;\n\n    \u002F\u002F Strict: every call is atomic and immediately consistent.\n    let strict = StrictCounter::new(options.clone());\n    strict.inc(&key, 1).await?;\n    let total = strict.get(&key).await?;\n    println!(\"strict: {total}\");\n\n    \u002F\u002F Lax: buffered locally, flushed on an interval - much faster on the hot path.\n    let lax = LaxCounter::new(options);\n    lax.inc(&key, 1).await?;\n    let approx = lax.get(&key).await?;\n    println!(\"lax: {approx}\");\n\n    Ok(())\n}\n","rust","",[162,179,180,234,240,258,311,359,390,395,434,464,469,504,509,516,546,581,615,638,643,649,671,701,734,755,760,769],{"__ignoreMap":177},[181,182,185,189,193,197,201,204,207,210,212,214,216,218,221,223,226,228,231],"span",{"class":183,"line":184},"line",1,[181,186,188],{"class":187},"sw1J6","use",[181,190,192],{"class":191},"sbgvK"," distkit",[181,194,196],{"class":195},"smGrS","::",[181,198,200],{"class":199},"sP7_E","{",[181,202,203],{"class":191},"DistkitRedisKey",[181,205,206],{"class":199},",",[181,208,209],{"class":191}," counter",[181,211,196],{"class":195},[181,213,200],{"class":199},[181,215,65],{"class":191},[181,217,206],{"class":199},[181,219,220],{"class":191}," LaxCounter",[181,222,206],{"class":199},[181,224,225],{"class":191}," CounterOptions",[181,227,206],{"class":199},[181,229,230],{"class":191}," CounterTrait",[181,232,233],{"class":199},"}};\n",[181,235,237],{"class":183,"line":236},2,[181,238,239],{"emptyLinePlaceholder":28},"\n",[181,241,243,246,250,252,255],{"class":183,"line":242},3,[181,244,245],{"class":199},"#[",[181,247,249],{"class":248},"su5hD","tokio",[181,251,196],{"class":195},[181,253,254],{"class":248},"main",[181,256,257],{"class":199},"]\n",[181,259,261,264,267,271,274,277,280,283,286,289,292,295,297,300,302,305,308],{"class":183,"line":260},4,[181,262,263],{"class":187},"async",[181,265,266],{"class":187}," fn",[181,268,270],{"class":269},"sGLFI"," main",[181,272,273],{"class":199},"()",[181,275,276],{"class":195}," ->",[181,278,279],{"class":191}," Result",[181,281,282],{"class":199},"\u003C(),",[181,284,285],{"class":191}," Box",[181,287,288],{"class":199},"\u003C",[181,290,291],{"class":187},"dyn",[181,293,294],{"class":248}," std",[181,296,196],{"class":195},[181,298,299],{"class":248},"error",[181,301,196],{"class":195},[181,303,304],{"class":191},"Error",[181,306,307],{"class":199},">>",[181,309,310],{"class":199}," {\n",[181,312,314,318,321,324,327,329,332,334,337,340,344,348,350,353,356],{"class":183,"line":313},5,[181,315,317],{"class":316},"sbsja","    let",[181,319,320],{"class":248}," client ",[181,322,323],{"class":195},"=",[181,325,326],{"class":191}," redis",[181,328,196],{"class":195},[181,330,331],{"class":191},"Client",[181,333,196],{"class":195},[181,335,336],{"class":269},"open",[181,338,339],{"class":199},"(",[181,341,343],{"class":342},"sjJ54","\"",[181,345,347],{"class":346},"s_sjI","redis:\u002F\u002F127.0.0.1\u002F",[181,349,343],{"class":342},[181,351,352],{"class":199},")",[181,354,355],{"class":195},"?",[181,357,358],{"class":199},";\n",[181,360,362,364,367,369,372,375,378,380,382,386,388],{"class":183,"line":361},6,[181,363,317],{"class":316},[181,365,366],{"class":248}," conn ",[181,368,323],{"class":195},[181,370,371],{"class":248}," client",[181,373,374],{"class":195},".",[181,376,377],{"class":269},"get_connection_manager",[181,379,273],{"class":199},[181,381,374],{"class":195},[181,383,385],{"class":384},"sVHd0","await",[181,387,355],{"class":195},[181,389,358],{"class":199},[181,391,393],{"class":183,"line":392},7,[181,394,239],{"emptyLinePlaceholder":28},[181,396,398,400,403,405,408,410,413,415,417,420,422,424,427,430,432],{"class":183,"line":397},8,[181,399,317],{"class":316},[181,401,402],{"class":248}," prefix ",[181,404,323],{"class":195},[181,406,407],{"class":191}," DistkitRedisKey",[181,409,196],{"class":195},[181,411,412],{"class":269},"try_from",[181,414,339],{"class":199},[181,416,343],{"class":342},[181,418,419],{"class":346},"my_app",[181,421,343],{"class":342},[181,423,374],{"class":195},[181,425,426],{"class":269},"to_string",[181,428,429],{"class":199},"())",[181,431,355],{"class":195},[181,433,358],{"class":199},[181,435,437,439,442,444,446,448,451,453,456,458,461],{"class":183,"line":436},9,[181,438,317],{"class":316},[181,440,441],{"class":248}," options ",[181,443,323],{"class":195},[181,445,225],{"class":191},[181,447,196],{"class":195},[181,449,450],{"class":269},"new",[181,452,339],{"class":199},[181,454,455],{"class":248},"prefix",[181,457,206],{"class":199},[181,459,460],{"class":248}," conn",[181,462,463],{"class":199},");\n",[181,465,467],{"class":183,"line":466},10,[181,468,239],{"emptyLinePlaceholder":28},[181,470,472,474,477,479,481,483,485,487,489,492,494,496,498,500,502],{"class":183,"line":471},11,[181,473,317],{"class":316},[181,475,476],{"class":248}," key ",[181,478,323],{"class":195},[181,480,407],{"class":191},[181,482,196],{"class":195},[181,484,412],{"class":269},[181,486,339],{"class":199},[181,488,343],{"class":342},[181,490,491],{"class":346},"page_views",[181,493,343],{"class":342},[181,495,374],{"class":195},[181,497,426],{"class":269},[181,499,429],{"class":199},[181,501,355],{"class":195},[181,503,358],{"class":199},[181,505,507],{"class":183,"line":506},12,[181,508,239],{"emptyLinePlaceholder":28},[181,510,512],{"class":183,"line":511},13,[181,513,515],{"class":514},"sutJx","    \u002F\u002F Strict: every call is atomic and immediately consistent.\n",[181,517,519,521,524,526,529,531,533,535,538,540,543],{"class":183,"line":518},14,[181,520,317],{"class":316},[181,522,523],{"class":248}," strict ",[181,525,323],{"class":195},[181,527,528],{"class":191}," StrictCounter",[181,530,196],{"class":195},[181,532,450],{"class":269},[181,534,339],{"class":199},[181,536,537],{"class":248},"options",[181,539,374],{"class":195},[181,541,542],{"class":269},"clone",[181,544,545],{"class":199},"());\n",[181,547,549,552,554,557,559,562,565,567,571,573,575,577,579],{"class":183,"line":548},15,[181,550,551],{"class":248},"    strict",[181,553,374],{"class":195},[181,555,556],{"class":269},"inc",[181,558,339],{"class":199},[181,560,561],{"class":195},"&",[181,563,564],{"class":248},"key",[181,566,206],{"class":199},[181,568,570],{"class":569},"srdBf"," 1",[181,572,352],{"class":199},[181,574,374],{"class":195},[181,576,385],{"class":384},[181,578,355],{"class":195},[181,580,358],{"class":199},[181,582,584,586,589,591,594,596,599,601,603,605,607,609,611,613],{"class":183,"line":583},16,[181,585,317],{"class":316},[181,587,588],{"class":248}," total ",[181,590,323],{"class":195},[181,592,593],{"class":248}," strict",[181,595,374],{"class":195},[181,597,598],{"class":269},"get",[181,600,339],{"class":199},[181,602,561],{"class":195},[181,604,564],{"class":248},[181,606,352],{"class":199},[181,608,374],{"class":195},[181,610,385],{"class":384},[181,612,355],{"class":195},[181,614,358],{"class":199},[181,616,618,621,623,625,628,630,633,636],{"class":183,"line":617},17,[181,619,620],{"class":269},"    println!",[181,622,339],{"class":199},[181,624,343],{"class":342},[181,626,627],{"class":346},"strict: ",[181,629,200],{"class":342},[181,631,632],{"class":346},"total",[181,634,635],{"class":342},"}\"",[181,637,463],{"class":199},[181,639,641],{"class":183,"line":640},18,[181,642,239],{"emptyLinePlaceholder":28},[181,644,646],{"class":183,"line":645},19,[181,647,648],{"class":514},"    \u002F\u002F Lax: buffered locally, flushed on an interval - much faster on the hot path.\n",[181,650,652,654,657,659,661,663,665,667,669],{"class":183,"line":651},20,[181,653,317],{"class":316},[181,655,656],{"class":248}," lax ",[181,658,323],{"class":195},[181,660,220],{"class":191},[181,662,196],{"class":195},[181,664,450],{"class":269},[181,666,339],{"class":199},[181,668,537],{"class":248},[181,670,463],{"class":199},[181,672,674,677,679,681,683,685,687,689,691,693,695,697,699],{"class":183,"line":673},21,[181,675,676],{"class":248},"    lax",[181,678,374],{"class":195},[181,680,556],{"class":269},[181,682,339],{"class":199},[181,684,561],{"class":195},[181,686,564],{"class":248},[181,688,206],{"class":199},[181,690,570],{"class":569},[181,692,352],{"class":199},[181,694,374],{"class":195},[181,696,385],{"class":384},[181,698,355],{"class":195},[181,700,358],{"class":199},[181,702,704,706,709,711,714,716,718,720,722,724,726,728,730,732],{"class":183,"line":703},22,[181,705,317],{"class":316},[181,707,708],{"class":248}," approx ",[181,710,323],{"class":195},[181,712,713],{"class":248}," lax",[181,715,374],{"class":195},[181,717,598],{"class":269},[181,719,339],{"class":199},[181,721,561],{"class":195},[181,723,564],{"class":248},[181,725,352],{"class":199},[181,727,374],{"class":195},[181,729,385],{"class":384},[181,731,355],{"class":195},[181,733,358],{"class":199},[181,735,737,739,741,743,746,748,751,753],{"class":183,"line":736},23,[181,738,620],{"class":269},[181,740,339],{"class":199},[181,742,343],{"class":342},[181,744,745],{"class":346},"lax: ",[181,747,200],{"class":342},[181,749,750],{"class":346},"approx",[181,752,635],{"class":342},[181,754,463],{"class":199},[181,756,758],{"class":183,"line":757},24,[181,759,239],{"emptyLinePlaceholder":28},[181,761,763,766],{"class":183,"line":762},25,[181,764,765],{"class":191},"    Ok",[181,767,768],{"class":199},"(())\n",[181,770,772],{"class":183,"line":771},26,[181,773,774],{"class":199},"}\n",[167,776,778],{"id":777},"what-happened","What happened",[780,781,782,802,820],"ol",{},[783,784,785,789,790,793,794,797,798,801],"li",{},[786,787,788],"strong",{},"Connect."," A ",[162,791,792],{},"ConnectionManager"," is built once and moved into ",[162,795,796],{},"CounterOptions",". It is clonable, so ",[162,799,800],{},"options.clone()"," lets the strict and lax counters share it.",[783,803,804,807,808,811,812,815,816,819],{},[786,805,806],{},"Construct."," ",[162,809,810],{},"StrictCounter::new"," and ",[162,813,814],{},"LaxCounter::new"," both return ",[162,817,818],{},"Arc\u003CSelf>",", ready to share across tasks.",[783,821,822,807,825,827,828,830,831,837],{},[786,823,824],{},"Use.",[162,826,556],{},", ",[162,829,598],{},", and the rest come from the ",[832,833,834],"a",{"href":58},[162,835,836],{},"CounterTrait",", which both counters implement.",[158,839,840,841,845,846,811,848,850],{},"Notice the ",[832,842,843],{"href":58},[162,844,836],{}," import - methods like ",[162,847,556],{},[162,849,598],{}," live on the trait, so it has to be in scope.",[167,852,854],{"id":853},"where-to-go-next","Where to go next",[856,857,858,863,868],"ul",{},[783,859,860,862],{},[832,861,41],{"href":42}," - the consistency trade-off you just chose between.",[783,864,865,867],{},[832,866,57],{"href":58}," - the full counter API.",[783,869,870,811,872,875],{},[832,871,95],{"href":96},[832,873,874],{"href":81},"instance-aware counters"," - the other primitives.",[877,878,879],"style",{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--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 .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--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);}",{"title":177,"searchDepth":184,"depth":236,"links":881},[882,883,884],{"id":169,"depth":236,"text":170},{"id":777,"depth":236,"text":778},{"id":853,"depth":236,"text":854},"A distributed counter running end to end in a few lines.","md",{},{"icon":26},{"title":23,"description":885},"isptQ9YJBU9yXGgQSIKBghTyu8iMlRI9sgX8Vl5548c",[892,894],{"title":18,"path":19,"stem":20,"description":893,"icon":21,"children":-1},"Build a Redis connection manager that your distkit primitives can share.",{"title":36,"path":37,"stem":38,"description":895,"icon":39,"children":-1},"DistkitRedisKey wraps and validates every key distkit writes to Redis.",1781569582557]