[{"data":1,"prerenderedAt":871},["ShallowReactive",2],{"navigation":3,"\u002Fcounters\u002Fconditional-and-batch":151,"\u002Fcounters\u002Fconditional-and-batch-surround":866},[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":75,"badge":153,"body":154,"date":153,"description":860,"extension":861,"links":153,"meta":862,"navigation":863,"path":76,"seo":864,"stem":77,"__hash__":865},"docs\u002F3.counters\u002F4.conditional-and-batch.md",null,{"type":155,"value":156,"toc":855},"minimark",[157,161,166,192,482,486,494,636,640,652,833,851],[158,159,160],"p",{},"Both counters support conditional writes and batches. All of them are atomic on the Redis side, so there is no read-modify-write window for another instance to slip through.",[162,163,165],"h2",{"id":164},"conditional-writes","Conditional writes",[158,167,168,172,173,176,177,183,184,187,188,191],{},[169,170,171],"code",{},"inc_if"," and ",[169,174,175],{},"set_if"," apply the change only when the current value satisfies a ",[178,179,180],"a",{"href":47},[169,181,182],{},"CounterComparator",". They return ",[169,185,186],{},"(new, old)","; when the condition fails, ",[169,189,190],{},"new == old"," and nothing was written.",[193,194,199],"pre",{"className":195,"code":196,"language":197,"meta":198,"style":198},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use distkit::CounterComparator;\n\ncounter.set(&key, 10).await?;\n\n\u002F\u002F 10 == 10 -> applies. Returns (15, 10).\nassert_eq!(counter.inc_if(&key, CounterComparator::Eq(10), 5).await?, (15, 10));\n\n\u002F\u002F 15 is not \u003C 10 -> no-op. Returns (15, 15).\nassert_eq!(counter.inc_if(&key, CounterComparator::Lt(10), 5).await?, (15, 15));\n\n\u002F\u002F Nil always matches. Returns (20, 15).\nassert_eq!(counter.inc_if(&key, CounterComparator::Nil, 5).await?, (20, 15));\n","rust","",[169,200,201,224,230,274,279,286,350,355,361,418,423,429],{"__ignoreMap":198},[202,203,206,210,214,218,220],"span",{"class":204,"line":205},"line",1,[202,207,209],{"class":208},"sw1J6","use",[202,211,213],{"class":212},"sbgvK"," distkit",[202,215,217],{"class":216},"smGrS","::",[202,219,182],{"class":212},[202,221,223],{"class":222},"sP7_E",";\n",[202,225,227],{"class":204,"line":226},2,[202,228,229],{"emptyLinePlaceholder":28},"\n",[202,231,233,237,240,244,247,250,253,256,260,263,265,269,272],{"class":204,"line":232},3,[202,234,236],{"class":235},"su5hD","counter",[202,238,239],{"class":216},".",[202,241,243],{"class":242},"sGLFI","set",[202,245,246],{"class":222},"(",[202,248,249],{"class":216},"&",[202,251,252],{"class":235},"key",[202,254,255],{"class":222},",",[202,257,259],{"class":258},"srdBf"," 10",[202,261,262],{"class":222},")",[202,264,239],{"class":216},[202,266,268],{"class":267},"sVHd0","await",[202,270,271],{"class":216},"?",[202,273,223],{"class":222},[202,275,277],{"class":204,"line":276},4,[202,278,229],{"emptyLinePlaceholder":28},[202,280,282],{"class":204,"line":281},5,[202,283,285],{"class":284},"sutJx","\u002F\u002F 10 == 10 -> applies. Returns (15, 10).\n",[202,287,289,292,294,296,298,300,302,304,306,308,311,313,316,318,321,324,327,329,331,333,335,337,340,343,345,347],{"class":204,"line":288},6,[202,290,291],{"class":242},"assert_eq!",[202,293,246],{"class":222},[202,295,236],{"class":235},[202,297,239],{"class":216},[202,299,171],{"class":242},[202,301,246],{"class":222},[202,303,249],{"class":216},[202,305,252],{"class":235},[202,307,255],{"class":222},[202,309,310],{"class":212}," CounterComparator",[202,312,217],{"class":216},[202,314,315],{"class":242},"Eq",[202,317,246],{"class":222},[202,319,320],{"class":258},"10",[202,322,323],{"class":222},"),",[202,325,326],{"class":258}," 5",[202,328,262],{"class":222},[202,330,239],{"class":216},[202,332,268],{"class":267},[202,334,271],{"class":216},[202,336,255],{"class":222},[202,338,339],{"class":222}," (",[202,341,342],{"class":258},"15",[202,344,255],{"class":222},[202,346,259],{"class":258},[202,348,349],{"class":222},"));\n",[202,351,353],{"class":204,"line":352},7,[202,354,229],{"emptyLinePlaceholder":28},[202,356,358],{"class":204,"line":357},8,[202,359,360],{"class":284},"\u002F\u002F 15 is not \u003C 10 -> no-op. Returns (15, 15).\n",[202,362,364,366,368,370,372,374,376,378,380,382,384,386,389,391,393,395,397,399,401,403,405,407,409,411,413,416],{"class":204,"line":363},9,[202,365,291],{"class":242},[202,367,246],{"class":222},[202,369,236],{"class":235},[202,371,239],{"class":216},[202,373,171],{"class":242},[202,375,246],{"class":222},[202,377,249],{"class":216},[202,379,252],{"class":235},[202,381,255],{"class":222},[202,383,310],{"class":212},[202,385,217],{"class":216},[202,387,388],{"class":242},"Lt",[202,390,246],{"class":222},[202,392,320],{"class":258},[202,394,323],{"class":222},[202,396,326],{"class":258},[202,398,262],{"class":222},[202,400,239],{"class":216},[202,402,268],{"class":267},[202,404,271],{"class":216},[202,406,255],{"class":222},[202,408,339],{"class":222},[202,410,342],{"class":258},[202,412,255],{"class":222},[202,414,415],{"class":258}," 15",[202,417,349],{"class":222},[202,419,421],{"class":204,"line":420},10,[202,422,229],{"emptyLinePlaceholder":28},[202,424,426],{"class":204,"line":425},11,[202,427,428],{"class":284},"\u002F\u002F Nil always matches. Returns (20, 15).\n",[202,430,432,434,436,438,440,442,444,446,448,450,452,454,457,459,461,463,465,467,469,471,473,476,478,480],{"class":204,"line":431},12,[202,433,291],{"class":242},[202,435,246],{"class":222},[202,437,236],{"class":235},[202,439,239],{"class":216},[202,441,171],{"class":242},[202,443,246],{"class":222},[202,445,249],{"class":216},[202,447,252],{"class":235},[202,449,255],{"class":222},[202,451,310],{"class":212},[202,453,217],{"class":216},[202,455,456],{"class":212},"Nil",[202,458,255],{"class":222},[202,460,326],{"class":258},[202,462,262],{"class":222},[202,464,239],{"class":216},[202,466,268],{"class":267},[202,468,271],{"class":216},[202,470,255],{"class":222},[202,472,339],{"class":222},[202,474,475],{"class":258},"20",[202,477,255],{"class":222},[202,479,415],{"class":258},[202,481,349],{"class":222},[162,483,485],{"id":484},"batch-operations","Batch operations",[158,487,488,489,493],{},"Batches act on many keys in a single call and ",[490,491,492],"strong",{},"preserve input order"," in the result.",[193,495,497],{"className":195,"code":496,"language":197,"meta":198,"style":198},"\u002F\u002F Read several keys at once.\nlet snapshot = counter.get_all(&[&k1, &k2, &k3]).await?;\n\u002F\u002F -> Vec\u003C(&DistkitRedisKey, i64)>\n\n\u002F\u002F Increment several at once.\nlet updated = counter.inc_all(&[(&k1, 1), (&k2, 5)]).await?;\n\u002F\u002F -> Vec\u003C(&DistkitRedisKey, i64)>  (key, new)\n",[169,498,499,504,562,567,571,576,631],{"__ignoreMap":198},[202,500,501],{"class":204,"line":205},[202,502,503],{"class":284},"\u002F\u002F Read several keys at once.\n",[202,505,506,510,513,516,519,521,524,526,528,531,533,536,538,541,544,546,548,551,554,556,558,560],{"class":204,"line":226},[202,507,509],{"class":508},"sbsja","let",[202,511,512],{"class":235}," snapshot ",[202,514,515],{"class":216},"=",[202,517,518],{"class":235}," counter",[202,520,239],{"class":216},[202,522,523],{"class":242},"get_all",[202,525,246],{"class":222},[202,527,249],{"class":216},[202,529,530],{"class":222},"[",[202,532,249],{"class":216},[202,534,535],{"class":235},"k1",[202,537,255],{"class":222},[202,539,540],{"class":216}," &",[202,542,543],{"class":235},"k2",[202,545,255],{"class":222},[202,547,540],{"class":216},[202,549,550],{"class":235},"k3",[202,552,553],{"class":222},"])",[202,555,239],{"class":216},[202,557,268],{"class":267},[202,559,271],{"class":216},[202,561,223],{"class":222},[202,563,564],{"class":204,"line":232},[202,565,566],{"class":284},"\u002F\u002F -> Vec\u003C(&DistkitRedisKey, i64)>\n",[202,568,569],{"class":204,"line":276},[202,570,229],{"emptyLinePlaceholder":28},[202,572,573],{"class":204,"line":281},[202,574,575],{"class":284},"\u002F\u002F Increment several at once.\n",[202,577,578,580,583,585,587,589,592,594,596,599,601,603,605,608,610,612,614,616,618,620,623,625,627,629],{"class":204,"line":288},[202,579,509],{"class":508},[202,581,582],{"class":235}," updated ",[202,584,515],{"class":216},[202,586,518],{"class":235},[202,588,239],{"class":216},[202,590,591],{"class":242},"inc_all",[202,593,246],{"class":222},[202,595,249],{"class":216},[202,597,598],{"class":222},"[(",[202,600,249],{"class":216},[202,602,535],{"class":235},[202,604,255],{"class":222},[202,606,607],{"class":258}," 1",[202,609,323],{"class":222},[202,611,339],{"class":222},[202,613,249],{"class":216},[202,615,543],{"class":235},[202,617,255],{"class":222},[202,619,326],{"class":258},[202,621,622],{"class":222},")])",[202,624,239],{"class":216},[202,626,268],{"class":267},[202,628,271],{"class":216},[202,630,223],{"class":222},[202,632,633],{"class":204,"line":352},[202,634,635],{"class":284},"\u002F\u002F -> Vec\u003C(&DistkitRedisKey, i64)>  (key, new)\n",[162,637,639],{"id":638},"conditional-batches","Conditional batches",[158,641,642,172,645,648,649,239],{},[169,643,644],{},"inc_all_if",[169,646,647],{},"set_all_if"," combine the two: each entry carries its own comparator, and each result is ",[169,650,651],{},"(key, new, old)",[193,653,655],{"className":195,"code":654,"language":197,"meta":198,"style":198},"counter.set(&k1, 10).await?;\n\nlet results = counter\n    .inc_all_if(&[\n        (&k1, CounterComparator::Eq(10), 5),\n        (&k2, CounterComparator::Nil, 2),\n    ])\n    .await?;\n\nassert_eq!(results, vec![(&k1, 15, 10), (&k2, 2, 0)]);\n",[169,656,657,685,689,701,715,743,766,771,781,785],{"__ignoreMap":198},[202,658,659,661,663,665,667,669,671,673,675,677,679,681,683],{"class":204,"line":205},[202,660,236],{"class":235},[202,662,239],{"class":216},[202,664,243],{"class":242},[202,666,246],{"class":222},[202,668,249],{"class":216},[202,670,535],{"class":235},[202,672,255],{"class":222},[202,674,259],{"class":258},[202,676,262],{"class":222},[202,678,239],{"class":216},[202,680,268],{"class":267},[202,682,271],{"class":216},[202,684,223],{"class":222},[202,686,687],{"class":204,"line":226},[202,688,229],{"emptyLinePlaceholder":28},[202,690,691,693,696,698],{"class":204,"line":232},[202,692,509],{"class":508},[202,694,695],{"class":235}," results ",[202,697,515],{"class":216},[202,699,700],{"class":235}," counter\n",[202,702,703,706,708,710,712],{"class":204,"line":276},[202,704,705],{"class":216},"    .",[202,707,644],{"class":242},[202,709,246],{"class":222},[202,711,249],{"class":216},[202,713,714],{"class":222},"[\n",[202,716,717,720,722,724,726,728,730,732,734,736,738,740],{"class":204,"line":281},[202,718,719],{"class":222},"        (",[202,721,249],{"class":216},[202,723,535],{"class":235},[202,725,255],{"class":222},[202,727,310],{"class":212},[202,729,217],{"class":216},[202,731,315],{"class":242},[202,733,246],{"class":222},[202,735,320],{"class":258},[202,737,323],{"class":222},[202,739,326],{"class":258},[202,741,742],{"class":222},"),\n",[202,744,745,747,749,751,753,755,757,759,761,764],{"class":204,"line":288},[202,746,719],{"class":222},[202,748,249],{"class":216},[202,750,543],{"class":235},[202,752,255],{"class":222},[202,754,310],{"class":212},[202,756,217],{"class":216},[202,758,456],{"class":212},[202,760,255],{"class":222},[202,762,763],{"class":258}," 2",[202,765,742],{"class":222},[202,767,768],{"class":204,"line":352},[202,769,770],{"class":222},"    ])\n",[202,772,773,775,777,779],{"class":204,"line":357},[202,774,705],{"class":216},[202,776,268],{"class":267},[202,778,271],{"class":216},[202,780,223],{"class":222},[202,782,783],{"class":204,"line":363},[202,784,229],{"emptyLinePlaceholder":28},[202,786,787,789,791,794,796,799,801,803,805,807,809,811,813,815,817,819,821,823,825,827,830],{"class":204,"line":420},[202,788,291],{"class":242},[202,790,246],{"class":222},[202,792,793],{"class":235},"results",[202,795,255],{"class":222},[202,797,798],{"class":242}," vec!",[202,800,598],{"class":222},[202,802,249],{"class":216},[202,804,535],{"class":235},[202,806,255],{"class":222},[202,808,415],{"class":258},[202,810,255],{"class":222},[202,812,259],{"class":258},[202,814,323],{"class":222},[202,816,339],{"class":222},[202,818,249],{"class":216},[202,820,543],{"class":235},[202,822,255],{"class":222},[202,824,763],{"class":258},[202,826,255],{"class":222},[202,828,829],{"class":258}," 0",[202,831,832],{"class":222},")]);\n",[158,834,835,836,838,839,842,843,845,846,848,849,239],{},"Here ",[169,837,535],{}," matched (",[169,840,841],{},"10 == 10",") and became 15; ",[169,844,543],{}," started at 0 and ",[169,847,456],{}," always applies, so it became 2. As with single conditional writes, an entry whose comparison fails comes back with ",[169,850,190],{},[852,853,854],"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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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}",{"title":198,"searchDepth":205,"depth":226,"links":856},[857,858,859],{"id":164,"depth":226,"text":165},{"id":484,"depth":226,"text":485},{"id":638,"depth":226,"text":639},"Atomic compare-and-write and ordered batch operations on counters.","md",{},{"icon":78},{"title":75,"description":860},"yxzllXGlXiPRymqAZ0UluQF34725sPZxZEDYyQo2LVc",[867,869],{"title":70,"path":71,"stem":72,"description":868,"icon":73,"children":-1},"Buffered, eventually consistent counting for high-throughput paths.",{"title":62,"path":81,"stem":82,"description":870,"icon":85,"children":-1},"Counters where each instance owns a slice of the total, with automatic cleanup of dead instances.",1781569582557]