[{"data":1,"prerenderedAt":657},["ShallowReactive",2],{"navigation":3,"\u002Fcounters\u002Flax-counter":151,"\u002Fcounters\u002Flax-counter-surround":652},[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":70,"badge":153,"body":154,"date":153,"description":646,"extension":647,"links":153,"meta":648,"navigation":649,"path":71,"seo":650,"stem":72,"__hash__":651},"docs\u002F3.counters\u002F3.lax-counter.md",null,{"type":155,"value":156,"toc":639},"minimark",[157,172,175,180,334,344,348,468,477,481,489,595,599,610,614,635],[158,159,160,163,164,167,168,171],"p",{},[161,162,70],"code",{}," trades immediate consistency for speed. Increments accumulate in a local ",[161,165,166],{},"DashMap"," and are flushed to Redis in batched pipelines every ",[161,169,170],{},"allowed_lag"," (default ~20 ms). The hot path never blocks on the network, so writes are effectively free.",[158,173,174],{},"Use it for analytics, telemetry, and high-frequency metrics where a few milliseconds of cross-process lag is acceptable.",[176,177,179],"h2",{"id":178},"construct","Construct",[181,182,187],"pre",{"className":183,"code":184,"language":185,"meta":186,"style":186},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use distkit::{DistkitRedisKey, counter::{CounterOptions, LaxCounter, CounterTrait}};\n\nlet prefix = DistkitRedisKey::try_from(\"my_app\".to_string())?;\nlet counter = LaxCounter::new(CounterOptions::new(prefix, conn));\n","rust","",[161,188,189,239,245,296],{"__ignoreMap":186},[190,191,194,198,202,206,210,213,216,219,221,223,226,228,231,233,236],"span",{"class":192,"line":193},"line",1,[190,195,197],{"class":196},"sw1J6","use",[190,199,201],{"class":200},"sbgvK"," distkit",[190,203,205],{"class":204},"smGrS","::",[190,207,209],{"class":208},"sP7_E","{",[190,211,212],{"class":200},"DistkitRedisKey",[190,214,215],{"class":208},",",[190,217,218],{"class":200}," counter",[190,220,205],{"class":204},[190,222,209],{"class":208},[190,224,225],{"class":200},"CounterOptions",[190,227,215],{"class":208},[190,229,230],{"class":200}," LaxCounter",[190,232,215],{"class":208},[190,234,235],{"class":200}," CounterTrait",[190,237,238],{"class":208},"}};\n",[190,240,242],{"class":192,"line":241},2,[190,243,244],{"emptyLinePlaceholder":28},"\n",[190,246,248,252,256,259,262,264,268,271,275,279,281,284,287,290,293],{"class":192,"line":247},3,[190,249,251],{"class":250},"sbsja","let",[190,253,255],{"class":254},"su5hD"," prefix ",[190,257,258],{"class":204},"=",[190,260,261],{"class":200}," DistkitRedisKey",[190,263,205],{"class":204},[190,265,267],{"class":266},"sGLFI","try_from",[190,269,270],{"class":208},"(",[190,272,274],{"class":273},"sjJ54","\"",[190,276,278],{"class":277},"s_sjI","my_app",[190,280,274],{"class":273},[190,282,283],{"class":204},".",[190,285,286],{"class":266},"to_string",[190,288,289],{"class":208},"())",[190,291,292],{"class":204},"?",[190,294,295],{"class":208},";\n",[190,297,299,301,304,306,308,310,313,315,317,319,321,323,326,328,331],{"class":192,"line":298},4,[190,300,251],{"class":250},[190,302,303],{"class":254}," counter ",[190,305,258],{"class":204},[190,307,230],{"class":200},[190,309,205],{"class":204},[190,311,312],{"class":266},"new",[190,314,270],{"class":208},[190,316,225],{"class":200},[190,318,205],{"class":204},[190,320,312],{"class":266},[190,322,270],{"class":208},[190,324,325],{"class":254},"prefix",[190,327,215],{"class":208},[190,329,330],{"class":254}," conn",[190,332,333],{"class":208},"));\n",[158,335,336,337,339,340,343],{},"Like the strict counter, ",[161,338,312],{}," returns an ",[161,341,342],{},"Arc",". Constructing it spawns a background flush task.",[176,345,347],{"id":346},"reads-see-your-own-writes","Reads see your own writes",[181,349,351],{"className":183,"code":350,"language":185,"meta":186,"style":186},"let key = DistkitRedisKey::try_from(\"impressions\".to_string())?;\n\ncounter.inc(&key, 1).await?;        \u002F\u002F local atomic add - sub-microsecond\nlet val = counter.get(&key).await?; \u002F\u002F local view: remote_total + pending_delta\n",[161,352,353,387,391,433],{"__ignoreMap":186},[190,354,355,357,360,362,364,366,368,370,372,375,377,379,381,383,385],{"class":192,"line":193},[190,356,251],{"class":250},[190,358,359],{"class":254}," key ",[190,361,258],{"class":204},[190,363,261],{"class":200},[190,365,205],{"class":204},[190,367,267],{"class":266},[190,369,270],{"class":208},[190,371,274],{"class":273},[190,373,374],{"class":277},"impressions",[190,376,274],{"class":273},[190,378,283],{"class":204},[190,380,286],{"class":266},[190,382,289],{"class":208},[190,384,292],{"class":204},[190,386,295],{"class":208},[190,388,389],{"class":192,"line":241},[190,390,244],{"emptyLinePlaceholder":28},[190,392,393,396,398,401,403,406,409,411,415,418,420,424,426,429],{"class":192,"line":247},[190,394,395],{"class":254},"counter",[190,397,283],{"class":204},[190,399,400],{"class":266},"inc",[190,402,270],{"class":208},[190,404,405],{"class":204},"&",[190,407,408],{"class":254},"key",[190,410,215],{"class":208},[190,412,414],{"class":413},"srdBf"," 1",[190,416,417],{"class":208},")",[190,419,283],{"class":204},[190,421,423],{"class":422},"sVHd0","await",[190,425,292],{"class":204},[190,427,428],{"class":208},";",[190,430,432],{"class":431},"sutJx","        \u002F\u002F local atomic add - sub-microsecond\n",[190,434,435,437,440,442,444,446,449,451,453,455,457,459,461,463,465],{"class":192,"line":298},[190,436,251],{"class":250},[190,438,439],{"class":254}," val ",[190,441,258],{"class":204},[190,443,218],{"class":254},[190,445,283],{"class":204},[190,447,448],{"class":266},"get",[190,450,270],{"class":208},[190,452,405],{"class":204},[190,454,408],{"class":254},[190,456,417],{"class":208},[190,458,283],{"class":204},[190,460,423],{"class":422},[190,462,292],{"class":204},[190,464,428],{"class":208},[190,466,467],{"class":431}," \u002F\u002F local view: remote_total + pending_delta\n",[158,469,470,472,473,476],{},[161,471,448],{}," returns ",[161,474,475],{},"remote_total + pending_delta",", so within the same process a read always includes increments you haven't flushed yet. Across processes, another instance won't see your increment until the next flush lands.",[176,478,480],{"id":479},"tuning-the-lag","Tuning the lag",[158,482,483,485,486,488],{},[161,484,170],{}," on ",[161,487,225],{}," controls the flush interval. Lower it for tighter consistency, raise it to batch more aggressively:",[181,490,492],{"className":183,"code":491,"language":185,"meta":186,"style":186},"use std::time::Duration;\n\nlet mut options = CounterOptions::new(prefix, conn);\noptions.allowed_lag = Duration::from_millis(50);\nlet counter = LaxCounter::new(options);\n",[161,493,494,513,517,547,574],{"__ignoreMap":186},[190,495,496,498,501,503,506,508,511],{"class":192,"line":193},[190,497,197],{"class":196},[190,499,500],{"class":200}," std",[190,502,205],{"class":204},[190,504,505],{"class":200},"time",[190,507,205],{"class":204},[190,509,510],{"class":200},"Duration",[190,512,295],{"class":208},[190,514,515],{"class":192,"line":241},[190,516,244],{"emptyLinePlaceholder":28},[190,518,519,521,524,527,529,532,534,536,538,540,542,544],{"class":192,"line":247},[190,520,251],{"class":250},[190,522,523],{"class":250}," mut",[190,525,526],{"class":254}," options ",[190,528,258],{"class":204},[190,530,531],{"class":200}," CounterOptions",[190,533,205],{"class":204},[190,535,312],{"class":266},[190,537,270],{"class":208},[190,539,325],{"class":254},[190,541,215],{"class":208},[190,543,330],{"class":254},[190,545,546],{"class":208},");\n",[190,548,549,552,554,557,559,562,564,567,569,572],{"class":192,"line":298},[190,550,551],{"class":254},"options",[190,553,283],{"class":204},[190,555,556],{"class":254},"allowed_lag ",[190,558,258],{"class":204},[190,560,561],{"class":200}," Duration",[190,563,205],{"class":204},[190,565,566],{"class":266},"from_millis",[190,568,270],{"class":208},[190,570,571],{"class":413},"50",[190,573,546],{"class":208},[190,575,577,579,581,583,585,587,589,591,593],{"class":192,"line":576},5,[190,578,251],{"class":250},[190,580,303],{"class":254},[190,582,258],{"class":204},[190,584,230],{"class":200},[190,586,205],{"class":204},[190,588,312],{"class":266},[190,590,270],{"class":208},[190,592,551],{"class":254},[190,594,546],{"class":208},[176,596,598],{"id":597},"the-background-task-cleans-up-after-itself","The background task cleans up after itself",[158,600,601,602,605,606,609],{},"The flush task holds a ",[161,603,604],{},"Weak"," reference to the counter. When the last ",[161,607,608],{},"Arc\u003CLaxCounter>"," is dropped, the task notices and stops - there is nothing to shut down manually.",[176,611,613],{"id":612},"set-del-clear-stay-immediate","set, del, clear stay immediate",[158,615,616,619,620,623,624,627,628,630,631,634],{},[161,617,618],{},"set",", ",[161,621,622],{},"del",", and ",[161,625,626],{},"clear"," are not buffered; they apply right away (after the pending delta is accounted for). Only ",[161,629,400],{},"\u002F",[161,632,633],{},"dec"," ride the buffer.",[636,637,638],"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 .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 .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}",{"title":186,"searchDepth":193,"depth":241,"links":640},[641,642,643,644,645],{"id":178,"depth":241,"text":179},{"id":346,"depth":241,"text":347},{"id":479,"depth":241,"text":480},{"id":597,"depth":241,"text":598},{"id":612,"depth":241,"text":613},"Buffered, eventually consistent counting for high-throughput paths.","md",{},{"icon":73},{"title":70,"description":646},"E5pc8FiufGUMx9xdnVyd_TKm2CqKTYWviw_shT2pDyE",[653,655],{"title":65,"path":66,"stem":67,"description":654,"icon":68,"children":-1},"Atomic, immediately consistent distributed counting.",{"title":75,"path":76,"stem":77,"description":656,"icon":78,"children":-1},"Atomic compare-and-write and ordered batch operations on counters.",1781569582557]