[{"data":1,"prerenderedAt":838},["ShallowReactive",2],{"navigation":3,"\u002Flocks":151,"\u002Flocks-surround":833},[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":62,"badge":153,"body":154,"date":153,"description":827,"extension":828,"links":153,"meta":829,"navigation":830,"path":96,"seo":831,"stem":97,"__hash__":832},"docs\u002F5.locks\u002F1.index.md",null,{"type":155,"value":156,"toc":821},"minimark",[157,170,177,254,259,308,312,706,710,713,795,799,817],[158,159,160,161,165,166,169],"p",{},"distkit's locks give multiple processes a way to coordinate exclusive (or shared) access to a resource through Redis. The API deliberately mirrors ",[162,163,164],"code",{},"tokio::sync::Mutex"," and ",[162,167,168],{},"tokio::sync::RwLock",", so it should feel familiar.",[158,171,172,173,176],{},"Enable the ",[162,174,175],{},"lock"," feature:",[178,179,184],"pre",{"className":180,"code":181,"language":182,"meta":183,"style":183},"language-toml shiki shiki-themes material-theme-lighter github-light github-dark","[dependencies]\ndistkit = { version = \"0.5\", features = [\"lock\"] }\n","toml","",[162,185,186,202],{"__ignoreMap":183},[187,188,191,195,199],"span",{"class":189,"line":190},"line",1,[187,192,194],{"class":193},"sP7_E","[",[187,196,198],{"class":197},"sbgvK","dependencies",[187,200,201],{"class":193},"]\n",[187,203,205,209,212,215,218,220,224,228,231,234,237,239,242,244,246,248,251],{"class":189,"line":204},2,[187,206,208],{"class":207},"su5hD","distkit ",[187,210,211],{"class":193},"=",[187,213,214],{"class":193}," {",[187,216,217],{"class":207}," version ",[187,219,211],{"class":193},[187,221,223],{"class":222},"sjJ54"," \"",[187,225,227],{"class":226},"s_sjI","0.5",[187,229,230],{"class":222},"\"",[187,232,233],{"class":193},",",[187,235,236],{"class":207}," features ",[187,238,211],{"class":193},[187,240,241],{"class":193}," [",[187,243,230],{"class":222},[187,245,175],{"class":226},[187,247,230],{"class":222},[187,249,250],{"class":193},"]",[187,252,253],{"class":193}," }\n",[255,256,258],"h2",{"id":257},"how-they-behave","How they behave",[260,261,262,275,285,300],"ul",{},[263,264,265,269,270,274],"li",{},[266,267,268],"strong",{},"RAII guards."," Acquiring returns a guard. The guard holds ",[271,272,273],"em",{},"no inner data"," - it is a pure access token. Dropping it releases the lock.",[263,276,277,280,281,284],{},[266,278,279],{},"Background lease renewal."," A held lock renews its lease automatically (every ",[162,282,283],{},"ttl\u002F3",") so it survives long critical sections without you touching it. If the holder dies, the lease expires and the lock frees itself.",[263,286,287,290,291,294,295,299],{},[266,288,289],{},"Awaitable release."," Besides dropping, you can call ",[162,292,293],{},"release()"," to release explicitly and observe the final ",[296,297,298],"a",{"href":118},"guard state",".",[263,301,302,307],{},[266,303,304,305,299],{},"Writer-preferring ",[162,306,107],{}," A waiting writer blocks new readers, so writers can't be starved by a stream of readers.",[255,309,311],{"id":310},"a-quick-look","A quick look",[178,313,317],{"className":314,"code":315,"language":316,"meta":183,"style":183},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use distkit::{DistkitRedisKey, lock::{Mutex, RwLock, LockOptions}};\n\n\u002F\u002F Mutex - mutual exclusion.\nlet key = DistkitRedisKey::try_from(\"invoice_42\".to_string())?;\nlet mutex = Mutex::new(LockOptions::new(key, conn.clone()));\nlet guard = mutex.lock().await?;   \u002F\u002F waits until acquired\n\u002F\u002F ... critical section ...\nguard.release().await?;\n\n\u002F\u002F RwLock - many readers OR one writer.\nlet key = DistkitRedisKey::try_from(\"config_blob\".to_string())?;\nlet rw = RwLock::new(LockOptions::new(key, conn));\nlet r = rw.read().await?;           \u002F\u002F shared\nr.release().await?;\nlet w = rw.write().await?;          \u002F\u002F exclusive\nw.release().await?;\n","rust",[162,318,319,362,367,374,419,464,498,504,525,530,536,570,605,636,656,686],{"__ignoreMap":183},[187,320,321,325,328,332,335,338,340,343,345,347,349,351,354,356,359],{"class":189,"line":190},[187,322,324],{"class":323},"sw1J6","use",[187,326,327],{"class":197}," distkit",[187,329,331],{"class":330},"smGrS","::",[187,333,334],{"class":193},"{",[187,336,337],{"class":197},"DistkitRedisKey",[187,339,233],{"class":193},[187,341,342],{"class":197}," lock",[187,344,331],{"class":330},[187,346,334],{"class":193},[187,348,102],{"class":197},[187,350,233],{"class":193},[187,352,353],{"class":197}," RwLock",[187,355,233],{"class":193},[187,357,358],{"class":197}," LockOptions",[187,360,361],{"class":193},"}};\n",[187,363,364],{"class":189,"line":204},[187,365,366],{"emptyLinePlaceholder":28},"\n",[187,368,370],{"class":189,"line":369},3,[187,371,373],{"class":372},"sutJx","\u002F\u002F Mutex - mutual exclusion.\n",[187,375,377,381,384,386,389,391,395,398,400,403,405,407,410,413,416],{"class":189,"line":376},4,[187,378,380],{"class":379},"sbsja","let",[187,382,383],{"class":207}," key ",[187,385,211],{"class":330},[187,387,388],{"class":197}," DistkitRedisKey",[187,390,331],{"class":330},[187,392,394],{"class":393},"sGLFI","try_from",[187,396,397],{"class":193},"(",[187,399,230],{"class":222},[187,401,402],{"class":226},"invoice_42",[187,404,230],{"class":222},[187,406,299],{"class":330},[187,408,409],{"class":393},"to_string",[187,411,412],{"class":193},"())",[187,414,415],{"class":330},"?",[187,417,418],{"class":193},";\n",[187,420,422,424,427,429,432,434,437,439,442,444,446,448,451,453,456,458,461],{"class":189,"line":421},5,[187,423,380],{"class":379},[187,425,426],{"class":207}," mutex ",[187,428,211],{"class":330},[187,430,431],{"class":197}," Mutex",[187,433,331],{"class":330},[187,435,436],{"class":393},"new",[187,438,397],{"class":193},[187,440,441],{"class":197},"LockOptions",[187,443,331],{"class":330},[187,445,436],{"class":393},[187,447,397],{"class":193},[187,449,450],{"class":207},"key",[187,452,233],{"class":193},[187,454,455],{"class":207}," conn",[187,457,299],{"class":330},[187,459,460],{"class":393},"clone",[187,462,463],{"class":193},"()));\n",[187,465,467,469,472,474,477,479,481,484,486,490,492,495],{"class":189,"line":466},6,[187,468,380],{"class":379},[187,470,471],{"class":207}," guard ",[187,473,211],{"class":330},[187,475,476],{"class":207}," mutex",[187,478,299],{"class":330},[187,480,175],{"class":393},[187,482,483],{"class":193},"()",[187,485,299],{"class":330},[187,487,489],{"class":488},"sVHd0","await",[187,491,415],{"class":330},[187,493,494],{"class":193},";",[187,496,497],{"class":372},"   \u002F\u002F waits until acquired\n",[187,499,501],{"class":189,"line":500},7,[187,502,503],{"class":372},"\u002F\u002F ... critical section ...\n",[187,505,507,510,512,515,517,519,521,523],{"class":189,"line":506},8,[187,508,509],{"class":207},"guard",[187,511,299],{"class":330},[187,513,514],{"class":393},"release",[187,516,483],{"class":193},[187,518,299],{"class":330},[187,520,489],{"class":488},[187,522,415],{"class":330},[187,524,418],{"class":193},[187,526,528],{"class":189,"line":527},9,[187,529,366],{"emptyLinePlaceholder":28},[187,531,533],{"class":189,"line":532},10,[187,534,535],{"class":372},"\u002F\u002F RwLock - many readers OR one writer.\n",[187,537,539,541,543,545,547,549,551,553,555,558,560,562,564,566,568],{"class":189,"line":538},11,[187,540,380],{"class":379},[187,542,383],{"class":207},[187,544,211],{"class":330},[187,546,388],{"class":197},[187,548,331],{"class":330},[187,550,394],{"class":393},[187,552,397],{"class":193},[187,554,230],{"class":222},[187,556,557],{"class":226},"config_blob",[187,559,230],{"class":222},[187,561,299],{"class":330},[187,563,409],{"class":393},[187,565,412],{"class":193},[187,567,415],{"class":330},[187,569,418],{"class":193},[187,571,573,575,578,580,582,584,586,588,590,592,594,596,598,600,602],{"class":189,"line":572},12,[187,574,380],{"class":379},[187,576,577],{"class":207}," rw ",[187,579,211],{"class":330},[187,581,353],{"class":197},[187,583,331],{"class":330},[187,585,436],{"class":393},[187,587,397],{"class":193},[187,589,441],{"class":197},[187,591,331],{"class":330},[187,593,436],{"class":393},[187,595,397],{"class":193},[187,597,450],{"class":207},[187,599,233],{"class":193},[187,601,455],{"class":207},[187,603,604],{"class":193},"));\n",[187,606,608,610,613,615,618,620,623,625,627,629,631,633],{"class":189,"line":607},13,[187,609,380],{"class":379},[187,611,612],{"class":207}," r ",[187,614,211],{"class":330},[187,616,617],{"class":207}," rw",[187,619,299],{"class":330},[187,621,622],{"class":393},"read",[187,624,483],{"class":193},[187,626,299],{"class":330},[187,628,489],{"class":488},[187,630,415],{"class":330},[187,632,494],{"class":193},[187,634,635],{"class":372},"           \u002F\u002F shared\n",[187,637,639,642,644,646,648,650,652,654],{"class":189,"line":638},14,[187,640,641],{"class":207},"r",[187,643,299],{"class":330},[187,645,514],{"class":393},[187,647,483],{"class":193},[187,649,299],{"class":330},[187,651,489],{"class":488},[187,653,415],{"class":330},[187,655,418],{"class":193},[187,657,659,661,664,666,668,670,673,675,677,679,681,683],{"class":189,"line":658},15,[187,660,380],{"class":379},[187,662,663],{"class":207}," w ",[187,665,211],{"class":330},[187,667,617],{"class":207},[187,669,299],{"class":330},[187,671,672],{"class":393},"write",[187,674,483],{"class":193},[187,676,299],{"class":330},[187,678,489],{"class":488},[187,680,415],{"class":330},[187,682,494],{"class":193},[187,684,685],{"class":372},"          \u002F\u002F exclusive\n",[187,687,689,692,694,696,698,700,702,704],{"class":189,"line":688},16,[187,690,691],{"class":207},"w",[187,693,299],{"class":330},[187,695,514],{"class":393},[187,697,483],{"class":193},[187,699,299],{"class":330},[187,701,489],{"class":488},[187,703,415],{"class":330},[187,705,418],{"class":193},[255,707,709],{"id":708},"three-ways-to-acquire","Three ways to acquire",[158,711,712],{},"Each lock offers the same three acquisition styles:",[714,715,716,734],"table",{},[717,718,719],"thead",{},[720,721,722,726,728,731],"tr",{},[723,724,725],"th",{},"Style",[723,727,102],{},[723,729,730],{},"RwLock (read)",[723,732,733],{},"RwLock (write)",[735,736,737,755,775],"tbody",{},[720,738,739,743,747,751],{},[740,741,742],"td",{},"Waiting",[740,744,745],{},[162,746,175],{},[740,748,749],{},[162,750,622],{},[740,752,753],{},[162,754,672],{},[720,756,757,760,765,770],{},[740,758,759],{},"Non-blocking",[740,761,762],{},[162,763,764],{},"try_lock",[740,766,767],{},[162,768,769],{},"try_read",[740,771,772],{},[162,773,774],{},"try_write",[720,776,777,780,785,790],{},[740,778,779],{},"Bounded",[740,781,782],{},[162,783,784],{},"try_lock_for",[740,786,787],{},[162,788,789],{},"try_read_for",[740,791,792],{},[162,793,794],{},"try_write_for",[255,796,798],{"id":797},"read-on","Read on",[260,800,801,805,809,813],{},[263,802,803],{},[296,804,102],{"href":103},[263,806,807],{},[296,808,107],{"href":108},[263,810,811],{},[296,812,112],{"href":113},[263,814,815],{},[296,816,117],{"href":118},[818,819,820],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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":183,"searchDepth":190,"depth":204,"links":822},[823,824,825,826],{"id":257,"depth":204,"text":258},{"id":310,"depth":204,"text":311},{"id":708,"depth":204,"text":709},{"id":797,"depth":204,"text":798},"Redis-backed Mutex and RwLock that mirror tokio::sync, with RAII guards and background lease renewal.","md",{},{"icon":100},{"title":62,"description":827},"CT5_a5ojT70YaCgMQ2kJjgN_hjwOSaMUkvH9ToEBC80",[834,836],{"title":91,"path":92,"stem":93,"description":835,"icon":73,"children":-1},"Buffered per-instance counting for high-frequency updates.",{"title":102,"path":103,"stem":104,"description":837,"icon":105,"children":-1},"A distributed mutual-exclusion lock backed by Redis.",1781569581680]