[{"data":1,"prerenderedAt":1130},["ShallowReactive",2],{"navigation":3,"\u002Frate-limiting":151,"\u002Frate-limiting-surround":1125},[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":122,"badge":153,"body":154,"date":153,"description":1119,"extension":1120,"links":153,"meta":1121,"navigation":1122,"path":123,"seo":1123,"stem":124,"__hash__":1124},"docs\u002F6.rate-limiting\u002F1.index.md",null,{"type":155,"value":156,"toc":1114},"minimark",[157,177,254,260,273,278,327,331,833,837,848,1099,1110],[158,159,160,161,168,169,173,174,176],"p",{},"distkit's rate limiting is the ",[162,163,167],"a",{"href":164,"rel":165},"https:\u002F\u002Fdocs.rs\u002Ftrypema",[166],"nofollow","trypema"," crate, re-exported in full under ",[170,171,172],"code",{},"distkit::trypema",". Enable the ",[170,175,167],{}," feature to pull it in:",[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 = [\"trypema\"] }\n","toml","",[170,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,167],{"class":226},[187,247,230],{"class":222},[187,249,250],{"class":193},"]",[187,252,253],{"class":193}," }\n",[158,255,256,257,259],{},"If you're only doing rate limiting, you can also depend on ",[170,258,167],{}," directly - the distkit re-export is for projects that want it alongside the other primitives.",[261,262,265],"callout",{"icon":263,"to":264},"i-lucide-external-link","https:\u002F\u002Ftrypema.davidoyinbo.com",[158,266,267,268,272],{},"Full provider, strategy, and tuning documentation lives on the ",[269,270,271],"strong",{},"trypema docs site",". This page is a quick on-ramp.",[274,275,277],"h2",{"id":276},"what-it-offers","What it offers",[279,280,281,296,314],"ul",{},[282,283,284,287,288,291,292,295],"li",{},[269,285,286],{},"Sliding-window limiting"," with configurable window size and rate (rates are ",[170,289,290],{},"f64",", so ",[170,293,294],{},"0.5 req\u002Fs"," is valid).",[282,297,298,301,302,305,306,309,310,313],{},[269,299,300],{},"Three providers"," - ",[170,303,304],{},"local"," (in-process), ",[170,307,308],{},"redis"," (distributed, one round-trip per call), and ",[170,311,312],{},"hybrid"," (local fast-path with periodic Redis sync).",[282,315,316,301,319,322,323,326],{},[269,317,318],{},"Two strategies",[170,320,321],{},"absolute"," (deterministic allow\u002Freject) and ",[170,324,325],{},"suppressed"," (probabilistic shedding as you approach capacity).",[274,328,330],{"id":329},"local-rate-limiting","Local rate limiting",[178,332,336],{"className":333,"code":334,"language":335,"meta":183,"style":183},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","use std::sync::Arc;\nuse distkit::trypema::{\n    HardLimitFactor, RateGroupSizeMs, RateLimit, RateLimitDecision,\n    RateLimiter, RateLimiterOptions, SuppressionFactorCacheMs, WindowSizeSeconds,\n    local::LocalRateLimiterOptions,\n};\n\nlet rl = Arc::new(RateLimiter::new(RateLimiterOptions {\n    local: LocalRateLimiterOptions {\n        window_size_seconds: WindowSizeSeconds::try_from(60).unwrap(),\n        rate_group_size_ms: RateGroupSizeMs::try_from(100).unwrap(),\n        hard_limit_factor: HardLimitFactor::default(),\n        suppression_factor_cache_ms: SuppressionFactorCacheMs::default(),\n    },\n}));\n\nrl.run_cleanup_loop();\n\nlet rate = RateLimit::try_from(10.0).unwrap(); \u002F\u002F 10 requests per second\n\nmatch rl.local().absolute().inc(\"user_123\", &rate, 1) {\n    RateLimitDecision::Allowed => { \u002F* process the request *\u002F }\n    RateLimitDecision::Rejected { retry_after_ms, .. } => {\n        eprintln!(\"rate limited, retry in {retry_after_ms} ms\");\n    }\n    _ => {}\n}\n","rust",[170,337,338,362,378,402,425,438,444,450,489,502,535,562,580,596,602,608,613,627,632,672,677,731,752,779,809,815,827],{"__ignoreMap":183},[187,339,340,344,347,351,354,356,359],{"class":189,"line":190},[187,341,343],{"class":342},"sw1J6","use",[187,345,346],{"class":197}," std",[187,348,350],{"class":349},"smGrS","::",[187,352,353],{"class":197},"sync",[187,355,350],{"class":349},[187,357,358],{"class":197},"Arc",[187,360,361],{"class":193},";\n",[187,363,364,366,369,371,373,375],{"class":189,"line":204},[187,365,343],{"class":342},[187,367,368],{"class":197}," distkit",[187,370,350],{"class":349},[187,372,167],{"class":197},[187,374,350],{"class":349},[187,376,377],{"class":193},"{\n",[187,379,381,384,386,389,391,394,396,399],{"class":189,"line":380},3,[187,382,383],{"class":197},"    HardLimitFactor",[187,385,233],{"class":193},[187,387,388],{"class":197}," RateGroupSizeMs",[187,390,233],{"class":193},[187,392,393],{"class":197}," RateLimit",[187,395,233],{"class":193},[187,397,398],{"class":197}," RateLimitDecision",[187,400,401],{"class":193},",\n",[187,403,405,408,410,413,415,418,420,423],{"class":189,"line":404},4,[187,406,407],{"class":197},"    RateLimiter",[187,409,233],{"class":193},[187,411,412],{"class":197}," RateLimiterOptions",[187,414,233],{"class":193},[187,416,417],{"class":197}," SuppressionFactorCacheMs",[187,419,233],{"class":193},[187,421,422],{"class":197}," WindowSizeSeconds",[187,424,401],{"class":193},[187,426,428,431,433,436],{"class":189,"line":427},5,[187,429,430],{"class":197},"    local",[187,432,350],{"class":349},[187,434,435],{"class":197},"LocalRateLimiterOptions",[187,437,401],{"class":193},[187,439,441],{"class":189,"line":440},6,[187,442,443],{"class":193},"};\n",[187,445,447],{"class":189,"line":446},7,[187,448,449],{"emptyLinePlaceholder":28},"\n",[187,451,453,457,460,462,465,467,471,474,477,479,481,483,486],{"class":189,"line":452},8,[187,454,456],{"class":455},"sbsja","let",[187,458,459],{"class":207}," rl ",[187,461,211],{"class":349},[187,463,464],{"class":197}," Arc",[187,466,350],{"class":349},[187,468,470],{"class":469},"sGLFI","new",[187,472,473],{"class":193},"(",[187,475,476],{"class":197},"RateLimiter",[187,478,350],{"class":349},[187,480,470],{"class":469},[187,482,473],{"class":193},[187,484,485],{"class":197},"RateLimiterOptions",[187,487,488],{"class":193}," {\n",[187,490,492,494,497,500],{"class":189,"line":491},9,[187,493,430],{"class":207},[187,495,496],{"class":349},":",[187,498,499],{"class":197}," LocalRateLimiterOptions",[187,501,488],{"class":193},[187,503,505,508,510,512,514,517,519,523,526,529,532],{"class":189,"line":504},10,[187,506,507],{"class":207},"        window_size_seconds",[187,509,496],{"class":349},[187,511,422],{"class":197},[187,513,350],{"class":349},[187,515,516],{"class":469},"try_from",[187,518,473],{"class":193},[187,520,522],{"class":521},"srdBf","60",[187,524,525],{"class":193},")",[187,527,528],{"class":349},".",[187,530,531],{"class":469},"unwrap",[187,533,534],{"class":193},"(),\n",[187,536,538,541,543,545,547,549,551,554,556,558,560],{"class":189,"line":537},11,[187,539,540],{"class":207},"        rate_group_size_ms",[187,542,496],{"class":349},[187,544,388],{"class":197},[187,546,350],{"class":349},[187,548,516],{"class":469},[187,550,473],{"class":193},[187,552,553],{"class":521},"100",[187,555,525],{"class":193},[187,557,528],{"class":349},[187,559,531],{"class":469},[187,561,534],{"class":193},[187,563,565,568,570,573,575,578],{"class":189,"line":564},12,[187,566,567],{"class":207},"        hard_limit_factor",[187,569,496],{"class":349},[187,571,572],{"class":197}," HardLimitFactor",[187,574,350],{"class":349},[187,576,577],{"class":469},"default",[187,579,534],{"class":193},[187,581,583,586,588,590,592,594],{"class":189,"line":582},13,[187,584,585],{"class":207},"        suppression_factor_cache_ms",[187,587,496],{"class":349},[187,589,417],{"class":197},[187,591,350],{"class":349},[187,593,577],{"class":469},[187,595,534],{"class":193},[187,597,599],{"class":189,"line":598},14,[187,600,601],{"class":193},"    },\n",[187,603,605],{"class":189,"line":604},15,[187,606,607],{"class":193},"}));\n",[187,609,611],{"class":189,"line":610},16,[187,612,449],{"emptyLinePlaceholder":28},[187,614,616,619,621,624],{"class":189,"line":615},17,[187,617,618],{"class":207},"rl",[187,620,528],{"class":349},[187,622,623],{"class":469},"run_cleanup_loop",[187,625,626],{"class":193},"();\n",[187,628,630],{"class":189,"line":629},18,[187,631,449],{"emptyLinePlaceholder":28},[187,633,635,637,640,642,644,646,648,650,653,656,659,661,663,665,668],{"class":189,"line":634},19,[187,636,456],{"class":455},[187,638,639],{"class":207}," rate ",[187,641,211],{"class":349},[187,643,393],{"class":197},[187,645,350],{"class":349},[187,647,516],{"class":469},[187,649,473],{"class":193},[187,651,652],{"class":521},"10",[187,654,528],{"class":655},"s39Yj",[187,657,658],{"class":521},"0",[187,660,525],{"class":193},[187,662,528],{"class":349},[187,664,531],{"class":469},[187,666,667],{"class":193},"();",[187,669,671],{"class":670},"sutJx"," \u002F\u002F 10 requests per second\n",[187,673,675],{"class":189,"line":674},20,[187,676,449],{"emptyLinePlaceholder":28},[187,678,680,684,687,689,691,694,696,698,700,702,705,707,709,712,714,716,719,722,724,727,729],{"class":189,"line":679},21,[187,681,683],{"class":682},"sVHd0","match",[187,685,686],{"class":207}," rl",[187,688,528],{"class":349},[187,690,304],{"class":469},[187,692,693],{"class":193},"()",[187,695,528],{"class":349},[187,697,321],{"class":469},[187,699,693],{"class":193},[187,701,528],{"class":349},[187,703,704],{"class":469},"inc",[187,706,473],{"class":193},[187,708,230],{"class":222},[187,710,711],{"class":226},"user_123",[187,713,230],{"class":222},[187,715,233],{"class":193},[187,717,718],{"class":349}," &",[187,720,721],{"class":207},"rate",[187,723,233],{"class":193},[187,725,726],{"class":521}," 1",[187,728,525],{"class":193},[187,730,488],{"class":193},[187,732,734,737,739,742,745,747,750],{"class":189,"line":733},22,[187,735,736],{"class":197},"    RateLimitDecision",[187,738,350],{"class":349},[187,740,741],{"class":197},"Allowed",[187,743,744],{"class":349}," =>",[187,746,214],{"class":193},[187,748,749],{"class":670}," \u002F* process the request *\u002F",[187,751,253],{"class":193},[187,753,755,757,759,762,764,767,769,772,775,777],{"class":189,"line":754},23,[187,756,736],{"class":197},[187,758,350],{"class":349},[187,760,761],{"class":197},"Rejected",[187,763,214],{"class":193},[187,765,766],{"class":207}," retry_after_ms",[187,768,233],{"class":193},[187,770,771],{"class":349}," ..",[187,773,774],{"class":193}," }",[187,776,744],{"class":349},[187,778,488],{"class":193},[187,780,782,785,787,789,792,795,798,801,804,806],{"class":189,"line":781},24,[187,783,784],{"class":469},"        eprintln!",[187,786,473],{"class":193},[187,788,230],{"class":222},[187,790,791],{"class":226},"rate limited, retry in ",[187,793,794],{"class":222},"{",[187,796,797],{"class":226},"retry_after_ms",[187,799,800],{"class":222},"}",[187,802,803],{"class":226}," ms",[187,805,230],{"class":222},[187,807,808],{"class":193},");\n",[187,810,812],{"class":189,"line":811},25,[187,813,814],{"class":193},"    }\n",[187,816,818,821,824],{"class":189,"line":817},26,[187,819,820],{"class":207},"    _ ",[187,822,823],{"class":349},"=>",[187,825,826],{"class":193}," {}\n",[187,828,830],{"class":189,"line":829},27,[187,831,832],{"class":193},"}\n",[274,834,836],{"id":835},"distributed-rate-limiting","Distributed rate limiting",[158,838,839,840,843,844,847],{},"For enforcement shared across processes, add the Redis provider options and call ",[170,841,842],{},"redis()"," (one round-trip per call) or ",[170,845,846],{},"hybrid()"," (local fast-path, periodic sync):",[178,849,851],{"className":333,"code":850,"language":335,"meta":183,"style":183},"use distkit::trypema::{\n    redis::{RedisKey, RedisRateLimiterOptions},\n    hybrid::SyncIntervalMs,\n};\n\n\u002F\u002F ... build RateLimiterOptions with both `local` and `redis` set ...\n\nlet key = RedisKey::try_from(\"user_123\".to_string())?;\nlet rate = RateLimit::try_from(50.0)?;\n\nlet decision = rl.redis().absolute().inc(&key, &rate, 1).await?;\n\u002F\u002F or, for the highest-throughput distributed option:\nlet decision = rl.hybrid().absolute().inc(&key, &rate, 1).await?;\n",[170,852,853,867,887,899,903,907,912,916,953,982,986,1042,1047],{"__ignoreMap":183},[187,854,855,857,859,861,863,865],{"class":189,"line":190},[187,856,343],{"class":342},[187,858,368],{"class":197},[187,860,350],{"class":349},[187,862,167],{"class":197},[187,864,350],{"class":349},[187,866,377],{"class":193},[187,868,869,872,874,876,879,881,884],{"class":189,"line":204},[187,870,871],{"class":197},"    redis",[187,873,350],{"class":349},[187,875,794],{"class":193},[187,877,878],{"class":197},"RedisKey",[187,880,233],{"class":193},[187,882,883],{"class":197}," RedisRateLimiterOptions",[187,885,886],{"class":193},"},\n",[187,888,889,892,894,897],{"class":189,"line":380},[187,890,891],{"class":197},"    hybrid",[187,893,350],{"class":349},[187,895,896],{"class":197},"SyncIntervalMs",[187,898,401],{"class":193},[187,900,901],{"class":189,"line":404},[187,902,443],{"class":193},[187,904,905],{"class":189,"line":427},[187,906,449],{"emptyLinePlaceholder":28},[187,908,909],{"class":189,"line":440},[187,910,911],{"class":670},"\u002F\u002F ... build RateLimiterOptions with both `local` and `redis` set ...\n",[187,913,914],{"class":189,"line":446},[187,915,449],{"emptyLinePlaceholder":28},[187,917,918,920,923,925,928,930,932,934,936,938,940,942,945,948,951],{"class":189,"line":452},[187,919,456],{"class":455},[187,921,922],{"class":207}," key ",[187,924,211],{"class":349},[187,926,927],{"class":197}," RedisKey",[187,929,350],{"class":349},[187,931,516],{"class":469},[187,933,473],{"class":193},[187,935,230],{"class":222},[187,937,711],{"class":226},[187,939,230],{"class":222},[187,941,528],{"class":349},[187,943,944],{"class":469},"to_string",[187,946,947],{"class":193},"())",[187,949,950],{"class":349},"?",[187,952,361],{"class":193},[187,954,955,957,959,961,963,965,967,969,972,974,976,978,980],{"class":189,"line":491},[187,956,456],{"class":455},[187,958,639],{"class":207},[187,960,211],{"class":349},[187,962,393],{"class":197},[187,964,350],{"class":349},[187,966,516],{"class":469},[187,968,473],{"class":193},[187,970,971],{"class":521},"50",[187,973,528],{"class":655},[187,975,658],{"class":521},[187,977,525],{"class":193},[187,979,950],{"class":349},[187,981,361],{"class":193},[187,983,984],{"class":189,"line":504},[187,985,449],{"emptyLinePlaceholder":28},[187,987,988,990,993,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1018,1021,1023,1025,1027,1029,1031,1033,1035,1038,1040],{"class":189,"line":537},[187,989,456],{"class":455},[187,991,992],{"class":207}," decision ",[187,994,211],{"class":349},[187,996,686],{"class":207},[187,998,528],{"class":349},[187,1000,308],{"class":469},[187,1002,693],{"class":193},[187,1004,528],{"class":349},[187,1006,321],{"class":469},[187,1008,693],{"class":193},[187,1010,528],{"class":349},[187,1012,704],{"class":469},[187,1014,473],{"class":193},[187,1016,1017],{"class":349},"&",[187,1019,1020],{"class":207},"key",[187,1022,233],{"class":193},[187,1024,718],{"class":349},[187,1026,721],{"class":207},[187,1028,233],{"class":193},[187,1030,726],{"class":521},[187,1032,525],{"class":193},[187,1034,528],{"class":349},[187,1036,1037],{"class":682},"await",[187,1039,950],{"class":349},[187,1041,361],{"class":193},[187,1043,1044],{"class":189,"line":564},[187,1045,1046],{"class":670},"\u002F\u002F or, for the highest-throughput distributed option:\n",[187,1048,1049,1051,1053,1055,1057,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097],{"class":189,"line":582},[187,1050,456],{"class":455},[187,1052,992],{"class":207},[187,1054,211],{"class":349},[187,1056,686],{"class":207},[187,1058,528],{"class":349},[187,1060,312],{"class":469},[187,1062,693],{"class":193},[187,1064,528],{"class":349},[187,1066,321],{"class":469},[187,1068,693],{"class":193},[187,1070,528],{"class":349},[187,1072,704],{"class":469},[187,1074,473],{"class":193},[187,1076,1017],{"class":349},[187,1078,1020],{"class":207},[187,1080,233],{"class":193},[187,1082,718],{"class":349},[187,1084,721],{"class":207},[187,1086,233],{"class":193},[187,1088,726],{"class":521},[187,1090,525],{"class":193},[187,1092,528],{"class":349},[187,1094,1037],{"class":682},[187,1096,950],{"class":349},[187,1098,361],{"class":193},[158,1100,1101,1102,1105,1106,528],{},"Redis-backed providers require Redis ",[170,1103,1104],{},"7.2+",". For the complete configuration surface - suppression tuning, hybrid sync intervals, and the strategy internals - see the ",[162,1107,1109],{"href":164,"rel":1108},[166],"trypema documentation",[1111,1112,1113],"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 .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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":183,"searchDepth":190,"depth":204,"links":1115},[1116,1117,1118],{"id":276,"depth":204,"text":277},{"id":329,"depth":204,"text":330},{"id":835,"depth":204,"text":836},"Sliding-window rate limiting via the trypema crate, re-exported under distkit::trypema.","md",{},{"icon":127},{"title":122,"description":1119},"rDvMsJ-HVNfh570L_JfFIjTY4iacb-6KzXmQ3pvwit8",[1126,1128],{"title":117,"path":118,"stem":119,"description":1127,"icon":120,"children":-1},"Reading a guard's lease state and handling acquisition failures.",{"title":135,"path":136,"stem":137,"description":1129,"icon":138,"children":-1},"Every distkit feature flag and what it pulls in.",1781569581681]