[{"data":1,"prerenderedAt":810},["ShallowReactive",2],{"navigation":3,"\u002Flocks\u002Frwlock":151,"\u002Flocks\u002Frwlock-surround":805},[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":107,"badge":153,"body":154,"date":153,"description":799,"extension":800,"links":153,"meta":801,"navigation":802,"path":108,"seo":803,"stem":109,"__hash__":804},"docs\u002F5.locks\u002F3.rwlock.md",null,{"type":155,"value":156,"toc":793},"minimark",[157,173,180,185,335,339,523,526,622,626,760,763,767,789],[158,159,160,163,164,168,169,172],"p",{},[161,162,107],"code",{}," allows ",[165,166,167],"strong",{},"many concurrent readers or a single writer",", across processes. It is ",[165,170,171],{},"writer-preferring",": once a writer is waiting, new readers queue behind it, so a steady stream of readers can't starve a writer.",[158,174,175,176,179],{},"It mirrors ",[161,177,178],{},"tokio::sync::RwLock",". Read guards and write guards are distinct types, both pure access tokens.",[181,182,184],"h2",{"id":183},"construct","Construct",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use distkit::{DistkitRedisKey, lock::{RwLock, LockOptions}};\n\nlet key = DistkitRedisKey::try_from(\"config_blob\".to_string())?;\nlet rw = RwLock::new(LockOptions::new(key, conn));\n","rust","",[161,193,194,238,244,295],{"__ignoreMap":191},[195,196,199,203,207,211,215,218,221,224,226,228,230,232,235],"span",{"class":197,"line":198},"line",1,[195,200,202],{"class":201},"sw1J6","use",[195,204,206],{"class":205},"sbgvK"," distkit",[195,208,210],{"class":209},"smGrS","::",[195,212,214],{"class":213},"sP7_E","{",[195,216,217],{"class":205},"DistkitRedisKey",[195,219,220],{"class":213},",",[195,222,223],{"class":205}," lock",[195,225,210],{"class":209},[195,227,214],{"class":213},[195,229,107],{"class":205},[195,231,220],{"class":213},[195,233,234],{"class":205}," LockOptions",[195,236,237],{"class":213},"}};\n",[195,239,241],{"class":197,"line":240},2,[195,242,243],{"emptyLinePlaceholder":28},"\n",[195,245,247,251,255,258,261,263,267,270,274,278,280,283,286,289,292],{"class":197,"line":246},3,[195,248,250],{"class":249},"sbsja","let",[195,252,254],{"class":253},"su5hD"," key ",[195,256,257],{"class":209},"=",[195,259,260],{"class":205}," DistkitRedisKey",[195,262,210],{"class":209},[195,264,266],{"class":265},"sGLFI","try_from",[195,268,269],{"class":213},"(",[195,271,273],{"class":272},"sjJ54","\"",[195,275,277],{"class":276},"s_sjI","config_blob",[195,279,273],{"class":272},[195,281,282],{"class":209},".",[195,284,285],{"class":265},"to_string",[195,287,288],{"class":213},"())",[195,290,291],{"class":209},"?",[195,293,294],{"class":213},";\n",[195,296,298,300,303,305,308,310,313,315,318,320,322,324,327,329,332],{"class":197,"line":297},4,[195,299,250],{"class":249},[195,301,302],{"class":253}," rw ",[195,304,257],{"class":209},[195,306,307],{"class":205}," RwLock",[195,309,210],{"class":209},[195,311,312],{"class":265},"new",[195,314,269],{"class":213},[195,316,317],{"class":205},"LockOptions",[195,319,210],{"class":209},[195,321,312],{"class":265},[195,323,269],{"class":213},[195,325,326],{"class":253},"key",[195,328,220],{"class":213},[195,330,331],{"class":253}," conn",[195,333,334],{"class":213},"));\n",[181,336,338],{"id":337},"read-side","Read side",[186,340,342],{"className":188,"code":341,"language":190,"meta":191,"style":191},"use std::time::Duration;\n\nlet r = rw.read().await?;                                  \u002F\u002F wait for shared access\nlet r = rw.try_read().await?;                              \u002F\u002F one non-blocking attempt\nlet r = rw.try_read_for(Duration::from_secs(2),\n                        Duration::from_millis(50)).await?; \u002F\u002F bounded wait\n\nr.release().await?; \u002F\u002F or drop it\n",[161,343,344,363,367,402,430,464,494,499],{"__ignoreMap":191},[195,345,346,348,351,353,356,358,361],{"class":197,"line":198},[195,347,202],{"class":201},[195,349,350],{"class":205}," std",[195,352,210],{"class":209},[195,354,355],{"class":205},"time",[195,357,210],{"class":209},[195,359,360],{"class":205},"Duration",[195,362,294],{"class":213},[195,364,365],{"class":197,"line":240},[195,366,243],{"emptyLinePlaceholder":28},[195,368,369,371,374,376,379,381,384,387,389,393,395,398],{"class":197,"line":246},[195,370,250],{"class":249},[195,372,373],{"class":253}," r ",[195,375,257],{"class":209},[195,377,378],{"class":253}," rw",[195,380,282],{"class":209},[195,382,383],{"class":265},"read",[195,385,386],{"class":213},"()",[195,388,282],{"class":209},[195,390,392],{"class":391},"sVHd0","await",[195,394,291],{"class":209},[195,396,397],{"class":213},";",[195,399,401],{"class":400},"sutJx","                                  \u002F\u002F wait for shared access\n",[195,403,404,406,408,410,412,414,417,419,421,423,425,427],{"class":197,"line":297},[195,405,250],{"class":249},[195,407,373],{"class":253},[195,409,257],{"class":209},[195,411,378],{"class":253},[195,413,282],{"class":209},[195,415,416],{"class":265},"try_read",[195,418,386],{"class":213},[195,420,282],{"class":209},[195,422,392],{"class":391},[195,424,291],{"class":209},[195,426,397],{"class":213},[195,428,429],{"class":400},"                              \u002F\u002F one non-blocking attempt\n",[195,431,433,435,437,439,441,443,446,448,450,452,455,457,461],{"class":197,"line":432},5,[195,434,250],{"class":249},[195,436,373],{"class":253},[195,438,257],{"class":209},[195,440,378],{"class":253},[195,442,282],{"class":209},[195,444,445],{"class":265},"try_read_for",[195,447,269],{"class":213},[195,449,360],{"class":205},[195,451,210],{"class":209},[195,453,454],{"class":265},"from_secs",[195,456,269],{"class":213},[195,458,460],{"class":459},"srdBf","2",[195,462,463],{"class":213},"),\n",[195,465,467,470,472,475,477,480,483,485,487,489,491],{"class":197,"line":466},6,[195,468,469],{"class":205},"                        Duration",[195,471,210],{"class":209},[195,473,474],{"class":265},"from_millis",[195,476,269],{"class":213},[195,478,479],{"class":459},"50",[195,481,482],{"class":213},"))",[195,484,282],{"class":209},[195,486,392],{"class":391},[195,488,291],{"class":209},[195,490,397],{"class":213},[195,492,493],{"class":400}," \u002F\u002F bounded wait\n",[195,495,497],{"class":197,"line":496},7,[195,498,243],{"emptyLinePlaceholder":28},[195,500,502,505,507,510,512,514,516,518,520],{"class":197,"line":501},8,[195,503,504],{"class":253},"r",[195,506,282],{"class":209},[195,508,509],{"class":265},"release",[195,511,386],{"class":213},[195,513,282],{"class":209},[195,515,392],{"class":391},[195,517,291],{"class":209},[195,519,397],{"class":213},[195,521,522],{"class":400}," \u002F\u002F or drop it\n",[158,524,525],{},"Multiple readers can hold the lock at the same time:",[186,527,529],{"className":188,"code":528,"language":190,"meta":191,"style":191},"let r1 = rw.try_read().await?;\nlet r2 = rw.try_read().await?; \u002F\u002F both succeed\nr1.release().await?;\nr2.release().await?;\n",[161,530,531,556,584,603],{"__ignoreMap":191},[195,532,533,535,538,540,542,544,546,548,550,552,554],{"class":197,"line":198},[195,534,250],{"class":249},[195,536,537],{"class":253}," r1 ",[195,539,257],{"class":209},[195,541,378],{"class":253},[195,543,282],{"class":209},[195,545,416],{"class":265},[195,547,386],{"class":213},[195,549,282],{"class":209},[195,551,392],{"class":391},[195,553,291],{"class":209},[195,555,294],{"class":213},[195,557,558,560,563,565,567,569,571,573,575,577,579,581],{"class":197,"line":240},[195,559,250],{"class":249},[195,561,562],{"class":253}," r2 ",[195,564,257],{"class":209},[195,566,378],{"class":253},[195,568,282],{"class":209},[195,570,416],{"class":265},[195,572,386],{"class":213},[195,574,282],{"class":209},[195,576,392],{"class":391},[195,578,291],{"class":209},[195,580,397],{"class":213},[195,582,583],{"class":400}," \u002F\u002F both succeed\n",[195,585,586,589,591,593,595,597,599,601],{"class":197,"line":246},[195,587,588],{"class":253},"r1",[195,590,282],{"class":209},[195,592,509],{"class":265},[195,594,386],{"class":213},[195,596,282],{"class":209},[195,598,392],{"class":391},[195,600,291],{"class":209},[195,602,294],{"class":213},[195,604,605,608,610,612,614,616,618,620],{"class":197,"line":297},[195,606,607],{"class":253},"r2",[195,609,282],{"class":209},[195,611,509],{"class":265},[195,613,386],{"class":213},[195,615,282],{"class":209},[195,617,392],{"class":391},[195,619,291],{"class":209},[195,621,294],{"class":213},[181,623,625],{"id":624},"write-side","Write side",[186,627,629],{"className":188,"code":628,"language":190,"meta":191,"style":191},"let w = rw.write().await?;                                  \u002F\u002F exclusive\nlet w = rw.try_write().await?;\nlet w = rw.try_write_for(Duration::from_secs(2),\n                         Duration::from_millis(50)).await?;\n\nw.release().await?;\n",[161,630,631,660,685,714,737,741],{"__ignoreMap":191},[195,632,633,635,638,640,642,644,647,649,651,653,655,657],{"class":197,"line":198},[195,634,250],{"class":249},[195,636,637],{"class":253}," w ",[195,639,257],{"class":209},[195,641,378],{"class":253},[195,643,282],{"class":209},[195,645,646],{"class":265},"write",[195,648,386],{"class":213},[195,650,282],{"class":209},[195,652,392],{"class":391},[195,654,291],{"class":209},[195,656,397],{"class":213},[195,658,659],{"class":400},"                                  \u002F\u002F exclusive\n",[195,661,662,664,666,668,670,672,675,677,679,681,683],{"class":197,"line":240},[195,663,250],{"class":249},[195,665,637],{"class":253},[195,667,257],{"class":209},[195,669,378],{"class":253},[195,671,282],{"class":209},[195,673,674],{"class":265},"try_write",[195,676,386],{"class":213},[195,678,282],{"class":209},[195,680,392],{"class":391},[195,682,291],{"class":209},[195,684,294],{"class":213},[195,686,687,689,691,693,695,697,700,702,704,706,708,710,712],{"class":197,"line":246},[195,688,250],{"class":249},[195,690,637],{"class":253},[195,692,257],{"class":209},[195,694,378],{"class":253},[195,696,282],{"class":209},[195,698,699],{"class":265},"try_write_for",[195,701,269],{"class":213},[195,703,360],{"class":205},[195,705,210],{"class":209},[195,707,454],{"class":265},[195,709,269],{"class":213},[195,711,460],{"class":459},[195,713,463],{"class":213},[195,715,716,719,721,723,725,727,729,731,733,735],{"class":197,"line":297},[195,717,718],{"class":205},"                         Duration",[195,720,210],{"class":209},[195,722,474],{"class":265},[195,724,269],{"class":213},[195,726,479],{"class":459},[195,728,482],{"class":213},[195,730,282],{"class":209},[195,732,392],{"class":391},[195,734,291],{"class":209},[195,736,294],{"class":213},[195,738,739],{"class":197,"line":432},[195,740,243],{"emptyLinePlaceholder":28},[195,742,743,746,748,750,752,754,756,758],{"class":197,"line":466},[195,744,745],{"class":253},"w",[195,747,282],{"class":209},[195,749,509],{"class":265},[195,751,386],{"class":213},[195,753,282],{"class":209},[195,755,392],{"class":391},[195,757,291],{"class":209},[195,759,294],{"class":213},[158,761,762],{},"A writer waits for all current readers to clear, and while it waits, no new reader is admitted.",[181,764,766],{"id":765},"guards","Guards",[158,768,769,770,773,774,777,778,781,782,785,786,282],{},"Both ",[161,771,772],{},"RwLockReadGuard"," and ",[161,775,776],{},"RwLockWriteGuard"," expose the same lifecycle methods as the mutex guard - ",[161,779,780],{},"get_state()"," to inspect the lease and ",[161,783,784],{},"release()"," to release explicitly. See ",[787,788,117],"a",{"href":118},[790,791,792],"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 .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 pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":191,"searchDepth":198,"depth":240,"links":794},[795,796,797,798],{"id":183,"depth":240,"text":184},{"id":337,"depth":240,"text":338},{"id":624,"depth":240,"text":625},{"id":765,"depth":240,"text":766},"A writer-preferring distributed reader-writer lock.","md",{},{"icon":110},{"title":107,"description":799},"nfKR0XToFXVUNqKF4-tZHTvREz_NOftcYQW2_qIiAmU",[806,808],{"title":102,"path":103,"stem":104,"description":807,"icon":105,"children":-1},"A distributed mutual-exclusion lock backed by Redis.",{"title":112,"path":113,"stem":114,"description":809,"icon":115,"children":-1},"Tune TTL, owner, wait bounds, and namespace via LockOptions and its builder.",1781569583314]