[{"data":1,"prerenderedAt":651},["ShallowReactive",2],{"navigation":3,"\u002Fcounters\u002Fstrict-counter":151,"\u002Fcounters\u002Fstrict-counter-surround":646},[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":65,"badge":153,"body":154,"date":153,"description":640,"extension":641,"links":153,"meta":642,"navigation":643,"path":66,"seo":644,"stem":67,"__hash__":645},"docs\u002F3.counters\u002F2.strict-counter.md",null,{"type":155,"value":156,"toc":634},"minimark",[157,172,175,180,334,343,347,578,588,592,618,622,630],[158,159,160,163,164,167,168,171],"p",{},[161,162,65],"code",{}," executes every operation as an atomic Lua script on Redis. One call is one round-trip, and the stored value is always authoritative - a ",[161,165,166],{},"get"," reflects every ",[161,169,170],{},"inc"," from every instance.",[158,173,174],{},"Use it when accuracy is non-negotiable: billing, inventory, quotas.",[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, StrictCounter, CounterTrait}};\n\nlet prefix = DistkitRedisKey::try_from(\"my_app\".to_string())?;\nlet counter = StrictCounter::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}," StrictCounter",[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,338,339,342],{},[161,337,312],{}," returns ",[161,340,341],{},"Arc\u003CStrictCounter>",", so you can clone it across tasks freely.",[176,344,346],{"id":345},"the-basics","The basics",[181,348,350],{"className":183,"code":349,"language":185,"meta":186,"style":186},"let key = DistkitRedisKey::try_from(\"orders\".to_string())?;\n\ncounter.inc(&key, 1).await?;    \u002F\u002F HINCRBY via Lua; returns the new value\ncounter.dec(&key, 1).await?;    \u002F\u002F decrement; returns the new value\ncounter.get(&key).await?;       \u002F\u002F current value\ncounter.set(&key, 100).await?;  \u002F\u002F overwrite; returns the new value\ncounter.del(&key).await?;       \u002F\u002F remove the entry; returns the old value\ncounter.clear().await?;         \u002F\u002F remove every key under this counter's prefix\n",[161,351,352,386,390,431,463,491,525,554],{"__ignoreMap":186},[190,353,354,356,359,361,363,365,367,369,371,374,376,378,380,382,384],{"class":192,"line":193},[190,355,251],{"class":250},[190,357,358],{"class":254}," key ",[190,360,258],{"class":204},[190,362,261],{"class":200},[190,364,205],{"class":204},[190,366,267],{"class":266},[190,368,270],{"class":208},[190,370,274],{"class":273},[190,372,373],{"class":277},"orders",[190,375,274],{"class":273},[190,377,283],{"class":204},[190,379,286],{"class":266},[190,381,289],{"class":208},[190,383,292],{"class":204},[190,385,295],{"class":208},[190,387,388],{"class":192,"line":241},[190,389,244],{"emptyLinePlaceholder":28},[190,391,392,395,397,399,401,404,407,409,413,416,418,422,424,427],{"class":192,"line":247},[190,393,394],{"class":254},"counter",[190,396,283],{"class":204},[190,398,170],{"class":266},[190,400,270],{"class":208},[190,402,403],{"class":204},"&",[190,405,406],{"class":254},"key",[190,408,215],{"class":208},[190,410,412],{"class":411},"srdBf"," 1",[190,414,415],{"class":208},")",[190,417,283],{"class":204},[190,419,421],{"class":420},"sVHd0","await",[190,423,292],{"class":204},[190,425,426],{"class":208},";",[190,428,430],{"class":429},"sutJx","    \u002F\u002F HINCRBY via Lua; returns the new value\n",[190,432,433,435,437,440,442,444,446,448,450,452,454,456,458,460],{"class":192,"line":298},[190,434,394],{"class":254},[190,436,283],{"class":204},[190,438,439],{"class":266},"dec",[190,441,270],{"class":208},[190,443,403],{"class":204},[190,445,406],{"class":254},[190,447,215],{"class":208},[190,449,412],{"class":411},[190,451,415],{"class":208},[190,453,283],{"class":204},[190,455,421],{"class":420},[190,457,292],{"class":204},[190,459,426],{"class":208},[190,461,462],{"class":429},"    \u002F\u002F decrement; returns the new value\n",[190,464,466,468,470,472,474,476,478,480,482,484,486,488],{"class":192,"line":465},5,[190,467,394],{"class":254},[190,469,283],{"class":204},[190,471,166],{"class":266},[190,473,270],{"class":208},[190,475,403],{"class":204},[190,477,406],{"class":254},[190,479,415],{"class":208},[190,481,283],{"class":204},[190,483,421],{"class":420},[190,485,292],{"class":204},[190,487,426],{"class":208},[190,489,490],{"class":429},"       \u002F\u002F current value\n",[190,492,494,496,498,501,503,505,507,509,512,514,516,518,520,522],{"class":192,"line":493},6,[190,495,394],{"class":254},[190,497,283],{"class":204},[190,499,500],{"class":266},"set",[190,502,270],{"class":208},[190,504,403],{"class":204},[190,506,406],{"class":254},[190,508,215],{"class":208},[190,510,511],{"class":411}," 100",[190,513,415],{"class":208},[190,515,283],{"class":204},[190,517,421],{"class":420},[190,519,292],{"class":204},[190,521,426],{"class":208},[190,523,524],{"class":429},"  \u002F\u002F overwrite; returns the new value\n",[190,526,528,530,532,535,537,539,541,543,545,547,549,551],{"class":192,"line":527},7,[190,529,394],{"class":254},[190,531,283],{"class":204},[190,533,534],{"class":266},"del",[190,536,270],{"class":208},[190,538,403],{"class":204},[190,540,406],{"class":254},[190,542,415],{"class":208},[190,544,283],{"class":204},[190,546,421],{"class":420},[190,548,292],{"class":204},[190,550,426],{"class":208},[190,552,553],{"class":429},"       \u002F\u002F remove the entry; returns the old value\n",[190,555,557,559,561,564,567,569,571,573,575],{"class":192,"line":556},8,[190,558,394],{"class":254},[190,560,283],{"class":204},[190,562,563],{"class":266},"clear",[190,565,566],{"class":208},"()",[190,568,283],{"class":204},[190,570,421],{"class":420},[190,572,292],{"class":204},[190,574,426],{"class":208},[190,576,577],{"class":429},"         \u002F\u002F remove every key under this counter's prefix\n",[158,579,580,581,587],{},"Every method comes from ",[582,583,584],"a",{"href":58},[161,585,586],{},"CounterTrait",", so keep the trait in scope.",[176,589,591],{"id":590},"conditional-and-batch","Conditional and batch",[158,593,594,596,597,600,601,604,605,600,608,611,612,615,616,283],{},[161,595,65],{}," supports conditional writes (",[161,598,599],{},"inc_if",", ",[161,602,603],{},"set_if",") and batch operations (",[161,606,607],{},"inc_all",[161,609,610],{},"get_all",", and the ",[161,613,614],{},"*_if"," forms), all atomic. They are covered in ",[582,617,75],{"href":76},[176,619,621],{"id":620},"cost","Cost",[158,623,624,625,629],{},"The trade-off is one Redis round-trip per call. If you are incrementing thousands of times a second per key and can tolerate a small lag, ",[582,626,627],{"href":71},[161,628,70],{}," does the same work with batched I\u002FO.",[631,632,633],"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":635},[636,637,638,639],{"id":178,"depth":241,"text":179},{"id":345,"depth":241,"text":346},{"id":590,"depth":241,"text":591},{"id":620,"depth":241,"text":621},"Atomic, immediately consistent distributed counting.","md",{},{"icon":68},{"title":65,"description":640},"mwF4E5SUTT75kwgQzawFA5EmqZP3vTkOKPTVaieSXic",[647,649],{"title":62,"path":58,"stem":59,"description":648,"icon":63,"children":-1},"Distributed integer counters in strict and lax flavors, both behind one trait.",{"title":70,"path":71,"stem":72,"description":650,"icon":73,"children":-1},"Buffered, eventually consistent counting for high-throughput paths.",1781569582557]