[{"data":1,"prerenderedAt":735},["ShallowReactive",2],{"navigation":3,"\u002Finstance-aware-counters\u002Flax":151,"\u002Finstance-aware-counters\u002Flax-surround":730},[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":91,"badge":153,"body":154,"date":153,"description":724,"extension":725,"links":153,"meta":726,"navigation":727,"path":92,"seo":728,"stem":93,"__hash__":729},"docs\u002F4.instance-aware-counters\u002F3.lax.md",null,{"type":155,"value":156,"toc":718},"minimark",[157,193,202,207,475,481,485,678,688,692,703,707,714],[158,159,160,163,164,169,170,173,174,177,178,181,182,185,186,185,189,192],"p",{},[161,162,91],"code",{}," is a buffered wrapper around ",[165,166,167],"a",{"href":88},[161,168,87],{},". ",[161,171,172],{},"inc"," and ",[161,175,176],{},"dec"," accumulate locally and flush to the strict counter in bulk every ",[161,179,180],{},"flush_interval"," (default ~20 ms). Global operations (",[161,183,184],{},"set",", ",[161,187,188],{},"del",[161,190,191],{},"clear",") flush any pending delta first, then delegate immediately.",[158,194,195,196,198,199,201],{},"Reach for it when you have many ",[161,197,172],{},"\u002F",[161,200,176],{}," calls per second per node and can tolerate a small consistency lag.",[203,204,206],"h2",{"id":205},"construct","Construct",[208,209,214],"pre",{"className":210,"code":211,"language":212,"meta":213,"style":213},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use std::time::Duration;\nuse distkit::DistkitRedisKey;\nuse distkit::icounter::{\n    InstanceAwareCounterTrait,\n    LaxInstanceAwareCounter, LaxInstanceAwareCounterOptions,\n};\n\nlet prefix = DistkitRedisKey::try_from(\"my_app\".to_string())?;\nlet counter = LaxInstanceAwareCounter::new(LaxInstanceAwareCounterOptions {\n    prefix,\n    connection_manager: conn,\n    dead_instance_threshold_ms: 30_000,\n    flush_interval: Duration::from_millis(20),\n    allowed_lag:    Duration::from_millis(20),\n});\n","rust","",[161,215,216,245,260,277,286,300,306,312,362,388,396,410,424,448,469],{"__ignoreMap":213},[217,218,221,225,229,233,236,238,241],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"sw1J6","use",[217,226,228],{"class":227},"sbgvK"," std",[217,230,232],{"class":231},"smGrS","::",[217,234,235],{"class":227},"time",[217,237,232],{"class":231},[217,239,240],{"class":227},"Duration",[217,242,244],{"class":243},"sP7_E",";\n",[217,246,248,250,253,255,258],{"class":219,"line":247},2,[217,249,224],{"class":223},[217,251,252],{"class":227}," distkit",[217,254,232],{"class":231},[217,256,257],{"class":227},"DistkitRedisKey",[217,259,244],{"class":243},[217,261,263,265,267,269,272,274],{"class":219,"line":262},3,[217,264,224],{"class":223},[217,266,252],{"class":227},[217,268,232],{"class":231},[217,270,271],{"class":227},"icounter",[217,273,232],{"class":231},[217,275,276],{"class":243},"{\n",[217,278,280,283],{"class":219,"line":279},4,[217,281,282],{"class":227},"    InstanceAwareCounterTrait",[217,284,285],{"class":243},",\n",[217,287,289,292,295,298],{"class":219,"line":288},5,[217,290,291],{"class":227},"    LaxInstanceAwareCounter",[217,293,294],{"class":243},",",[217,296,297],{"class":227}," LaxInstanceAwareCounterOptions",[217,299,285],{"class":243},[217,301,303],{"class":219,"line":302},6,[217,304,305],{"class":243},"};\n",[217,307,309],{"class":219,"line":308},7,[217,310,311],{"emptyLinePlaceholder":28},"\n",[217,313,315,319,323,326,329,331,335,338,342,346,348,351,354,357,360],{"class":219,"line":314},8,[217,316,318],{"class":317},"sbsja","let",[217,320,322],{"class":321},"su5hD"," prefix ",[217,324,325],{"class":231},"=",[217,327,328],{"class":227}," DistkitRedisKey",[217,330,232],{"class":231},[217,332,334],{"class":333},"sGLFI","try_from",[217,336,337],{"class":243},"(",[217,339,341],{"class":340},"sjJ54","\"",[217,343,345],{"class":344},"s_sjI","my_app",[217,347,341],{"class":340},[217,349,350],{"class":231},".",[217,352,353],{"class":333},"to_string",[217,355,356],{"class":243},"())",[217,358,359],{"class":231},"?",[217,361,244],{"class":243},[217,363,365,367,370,372,375,377,380,382,385],{"class":219,"line":364},9,[217,366,318],{"class":317},[217,368,369],{"class":321}," counter ",[217,371,325],{"class":231},[217,373,374],{"class":227}," LaxInstanceAwareCounter",[217,376,232],{"class":231},[217,378,379],{"class":333},"new",[217,381,337],{"class":243},[217,383,384],{"class":227},"LaxInstanceAwareCounterOptions",[217,386,387],{"class":243}," {\n",[217,389,391,394],{"class":219,"line":390},10,[217,392,393],{"class":321},"    prefix",[217,395,285],{"class":243},[217,397,399,402,405,408],{"class":219,"line":398},11,[217,400,401],{"class":321},"    connection_manager",[217,403,404],{"class":231},":",[217,406,407],{"class":321}," conn",[217,409,285],{"class":243},[217,411,413,416,418,422],{"class":219,"line":412},12,[217,414,415],{"class":321},"    dead_instance_threshold_ms",[217,417,404],{"class":231},[217,419,421],{"class":420},"srdBf"," 30_000",[217,423,285],{"class":243},[217,425,427,430,432,435,437,440,442,445],{"class":219,"line":426},13,[217,428,429],{"class":321},"    flush_interval",[217,431,404],{"class":231},[217,433,434],{"class":227}," Duration",[217,436,232],{"class":231},[217,438,439],{"class":333},"from_millis",[217,441,337],{"class":243},[217,443,444],{"class":420},"20",[217,446,447],{"class":243},"),\n",[217,449,451,454,456,459,461,463,465,467],{"class":219,"line":450},14,[217,452,453],{"class":321},"    allowed_lag",[217,455,404],{"class":231},[217,457,458],{"class":227},"    Duration",[217,460,232],{"class":231},[217,462,439],{"class":333},[217,464,337],{"class":243},[217,466,444],{"class":420},[217,468,447],{"class":243},[217,470,472],{"class":219,"line":471},15,[217,473,474],{"class":243},"});\n",[158,476,477,480],{},[161,478,479],{},"LaxInstanceAwareCounterOptions::new(prefix, conn)"," fills these with defaults if you don't need to tune them.",[203,482,484],{"id":483},"operations-return-the-local-estimate","Operations return the local estimate",[208,486,488],{"className":210,"code":487,"language":212,"meta":213,"style":213},"let key = DistkitRedisKey::try_from(\"connections\".to_string())?;\n\n\u002F\u002F Returns immediately - no Redis round-trip on the warm path.\nlet (local_total, mine) = counter.inc(&key, 1).await?;\nlet (local_total, mine) = counter.dec(&key, 1).await?;\n\n\u002F\u002F get() also returns the local estimate: cumulative + pending delta.\nlet (total, mine) = counter.get(&key).await?;\n",[161,489,490,524,528,534,587,629,633,638],{"__ignoreMap":213},[217,491,492,494,497,499,501,503,505,507,509,512,514,516,518,520,522],{"class":219,"line":220},[217,493,318],{"class":317},[217,495,496],{"class":321}," key ",[217,498,325],{"class":231},[217,500,328],{"class":227},[217,502,232],{"class":231},[217,504,334],{"class":333},[217,506,337],{"class":243},[217,508,341],{"class":340},[217,510,511],{"class":344},"connections",[217,513,341],{"class":340},[217,515,350],{"class":231},[217,517,353],{"class":333},[217,519,356],{"class":243},[217,521,359],{"class":231},[217,523,244],{"class":243},[217,525,526],{"class":219,"line":247},[217,527,311],{"emptyLinePlaceholder":28},[217,529,530],{"class":219,"line":262},[217,531,533],{"class":532},"sutJx","\u002F\u002F Returns immediately - no Redis round-trip on the warm path.\n",[217,535,536,538,541,544,546,549,552,555,558,560,562,564,567,570,572,575,577,579,583,585],{"class":219,"line":279},[217,537,318],{"class":317},[217,539,540],{"class":243}," (",[217,542,543],{"class":321},"local_total",[217,545,294],{"class":243},[217,547,548],{"class":321}," mine",[217,550,551],{"class":243},")",[217,553,554],{"class":231}," =",[217,556,557],{"class":321}," counter",[217,559,350],{"class":231},[217,561,172],{"class":333},[217,563,337],{"class":243},[217,565,566],{"class":231},"&",[217,568,569],{"class":321},"key",[217,571,294],{"class":243},[217,573,574],{"class":420}," 1",[217,576,551],{"class":243},[217,578,350],{"class":231},[217,580,582],{"class":581},"sVHd0","await",[217,584,359],{"class":231},[217,586,244],{"class":243},[217,588,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627],{"class":219,"line":288},[217,590,318],{"class":317},[217,592,540],{"class":243},[217,594,543],{"class":321},[217,596,294],{"class":243},[217,598,548],{"class":321},[217,600,551],{"class":243},[217,602,554],{"class":231},[217,604,557],{"class":321},[217,606,350],{"class":231},[217,608,176],{"class":333},[217,610,337],{"class":243},[217,612,566],{"class":231},[217,614,569],{"class":321},[217,616,294],{"class":243},[217,618,574],{"class":420},[217,620,551],{"class":243},[217,622,350],{"class":231},[217,624,582],{"class":581},[217,626,359],{"class":231},[217,628,244],{"class":243},[217,630,631],{"class":219,"line":302},[217,632,311],{"emptyLinePlaceholder":28},[217,634,635],{"class":219,"line":308},[217,636,637],{"class":532},"\u002F\u002F get() also returns the local estimate: cumulative + pending delta.\n",[217,639,640,642,644,647,649,651,653,655,657,659,662,664,666,668,670,672,674,676],{"class":219,"line":314},[217,641,318],{"class":317},[217,643,540],{"class":243},[217,645,646],{"class":321},"total",[217,648,294],{"class":243},[217,650,548],{"class":321},[217,652,551],{"class":243},[217,654,554],{"class":231},[217,656,557],{"class":321},[217,658,350],{"class":231},[217,660,661],{"class":333},"get",[217,663,337],{"class":243},[217,665,566],{"class":231},[217,667,569],{"class":321},[217,669,551],{"class":243},[217,671,350],{"class":231},[217,673,582],{"class":581},[217,675,359],{"class":231},[217,677,244],{"class":243},[158,679,680,185,682,684,685,687],{},[161,681,172],{},[161,683,176],{},", and ",[161,686,661],{}," reflect your own unflushed deltas immediately. Other instances see them only after the next flush.",[203,689,691],{"id":690},"background-flushing","Background flushing",[158,693,694,695,698,699,702],{},"Like the lax plain counter, the flush task holds a ",[161,696,697],{},"Weak"," reference and stops automatically when the last ",[161,700,701],{},"Arc"," is dropped.",[203,704,706],{"id":705},"same-cleanup-semantics","Same cleanup semantics",[158,708,709,710,713],{},"Because it delegates to the strict counter, dead-instance cleanup works exactly as in ",[165,711,712],{"href":88},"the strict variant"," - a node's slice is reclaimed once it stops heartbeating past the threshold.",[715,716,717],"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 .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 .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .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);}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 .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}",{"title":213,"searchDepth":220,"depth":247,"links":719},[720,721,722,723],{"id":205,"depth":247,"text":206},{"id":483,"depth":247,"text":484},{"id":690,"depth":247,"text":691},{"id":705,"depth":247,"text":706},"Buffered per-instance counting for high-frequency updates.","md",{},{"icon":73},{"title":91,"description":724},"0SBBMsBXXPr3QskkfsgJDFWJVd7wEE5BliTJvZ8mWMo",[731,733],{"title":87,"path":88,"stem":89,"description":732,"icon":68,"children":-1},"Immediately consistent per-instance counting with epoch-based correctness.",{"title":62,"path":96,"stem":97,"description":734,"icon":100,"children":-1},"Redis-backed Mutex and RwLock that mirror tokio::sync, with RAII guards and background lease renewal.",1781569582584]