← Cloudflare Durable Objects / durable-objects / api
Úložiště Durable Object podporované KV (starší verze)
Durable Object Storage API umožňuje Durable Objects k přístupu k transakčnímu a silně konzistentnímu úložišti. Úložiště připojené k Durable Object je soukromé pro danou jedinečnou instanci a jiné objekty k němu nemají přístup.
Durable Object Storage API nabízí několik metod, včetně SQL, obnovy k určitému bodu v čase (PITR), klíč-hodnota (KV) a alarmů. Dostupné metody API závisí na úložišti, které třída Durable Objects používá, buď SQLite nebo KV.
| Metody 1 | Třída Durable Object podporovaná SQLite | Třída Durable Object podporovaná KV |
|---|---|---|
| SQL API | ✅ | ❌ |
| PITR API | ✅ | ❌ |
| Synchronní KV API | ✅ 2, 3 | ❌ |
| Asynchronní KV API | ✅ 3 | ✅ |
| Alarms API | ✅ | ✅ |
Poznámky pod čarou
1 Každá metoda je implicitně obalena transakcí, takže jsou její výsledky atomické a izolované od všech ostatních operací s úložištěm, a to i při přístupu k více párům klíč-hodnota.
2 Metody KV API jako get(), put(), delete(), nebo list() ukládají
data do skryté tabulky SQLite __cf_kv. Mějte na paměti, že tuto tabulku uvidíte při výpisu všech tabulek, ale k jejímu obsahu se přes SQL API nedostanete.
3 Durable Objects s podporou SQLite také používají synchronní metody KV API pomocí ctx.storage.kv, zatímco Durable Objects s úložištěm KV poskytují pouze asynchronní metody KV API.
Přístup k úložišti
Durable Objects získávají přístup ke Storage API prostřednictvím DurableObjectStorage rozhraní a je přístupné přes DurableObjectState::storage vlastnost. K té se často přistupuje přes this.ctx.storage hodnotou ctx parametr předaný konstruktoru Durable Object.
Následující ukázka kódu ukazuje, jak pomocí Durable Object Storage API ukládat a načítat data.
export class Counter extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
}
async increment() {
let value = (await this.ctx.storage.get("value")) || 0;
value += 1;
await this.ctx.storage.put("value", value);
return value;
}
}export class Counter extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async increment(): Promise<number> {
let value: number = (await this.ctx.storage.get("value")) || 0;
value += 1;
await this.ctx.storage.put("value", value);
return value;
}
}from workers import DurableObject
class Counter(DurableObject):
def __init__(self, ctx, env):
super().__init__(ctx, env)
async def increment(self):
value = (await self.ctx.storage.get("value")) or 0
value += 1
await self.ctx.storage.put("value", value)
return valueJavaScript je jednovláknový a událostmi řízený programovací jazyk. To znamená, že běhová prostředí JavaScriptu standardně umožňují prokládání jednotlivých požadavků, což může vést k chybám souběžnosti. Běhové prostředí Durable Objects k jejich řešení používá kombinaci vstupní brány a výstupní brány, které zabraňují tomuto typu chyby souběžnosti při operacích s úložištěm. Více informací najdete v našem blogový příspěvek ↗.
Asynchronní KV API
Durable Objects podporované KV poskytují metody rozhraní KV API, které jsou asynchronní.
získat
-
ctx.storage.get(key:string, optionsObjectoptional)Promise<any>- Načte hodnotu přiřazenou danému klíči. Typ vrácené hodnoty odpovídá tomu, co bylo pro daný klíč dříve zapsáno, nebo je undefined, pokud klíč neexistuje.
-
ctx.storage.get(keys:Array<string>, optionsObjectoptional)Promise<Map<string, any>>- Načte hodnoty přiřazené každému ze zadaných klíčů. Typ každé vrácené hodnoty v
Map↗ bude odpovídat tomu, co bylo dříve zapsáno pro odpovídající klíč. Výsledkem jeMapse seřadí vzestupně podle svého kódování UTF-8, přičemž požadované klíče, které neexistují, se vynechají. Podporuje najednou až 128 klíčů.
- Načte hodnoty přiřazené každému ze zadaných klíčů. Typ každé vrácené hodnoty v
Podporované možnosti
-
allowConcurrency:boolean- Ve výchozím nastavení systém pozastaví doručování I/O událostí objektu po dobu probíhající operace s úložištěm, aby se předešlo neočekávaným souběhům (race conditions). Předejte
allowConcurrency: trueabyste toto chování vypnuli a povolili doručování souběžných událostí.
- Ve výchozím nastavení systém pozastaví doručování I/O událostí objektu po dobu probíhající operace s úložištěm, aby se předešlo neočekávaným souběhům (race conditions). Předejte
-
noCache:boolean- Pokud je hodnota true, klíč/hodnota se nevloží do paměťové cache. Pokud je klíč již v cache, vrátí se hodnota z cache, ale její čas posledního použití se neaktualizuje. Použijte to v případě, že očekáváte, že tento klíč nebude v blízké budoucnosti znovu potřeba. Tento příznak je pouze doporučením. Nikdy nezmění chování vašeho kódu, ale může ovlivnit výkon.
put
-
put(key:string, valueany, optionsObjectoptional)Promise-
Uloží hodnotu a přiřadí ji k danému klíči. Hodnota může být libovolného typu podporovaného algoritmus strukturovaného klonování ↗, což platí pro většinu typů.
Velikost klíčů a hodnot má různé limity podle toho, jaké úložiště Durable Object používáte. Přečtěte si jednu z těchto stránek:
U Durable Object podporovaného KV platí, že pokud serializovaná hodnota překročí limit velikosti 128 KiB (131072 bajtů),
put()vyvoláRangeError(napříkladValues cannot be larger than 131072 bytes.) před provedením zápisu.
-
-
put(entries:Object, optionsObjectoptional)Promise- Přijme objekt a uloží každý jeho klíč a hodnotu do úložiště.
- Každá hodnota může být libovolného typu podporovaného algoritmus strukturovaného klonování ↗, což platí pro většinu typů.
- Podporuje najednou až 128 párů klíč-hodnota. Velikost klíčů a hodnot má různé limity v závislosti na typu Durable Object, který používáte. Podívejte se na jednu z těchto možností:
smazat
-
delete(key:string, optionsObjectoptional)Promise<boolean>- Odstraní klíč a přiřazenou hodnotu. Vrací
truepokud klíč existoval, nebofalsepokud tomu tak nebylo.
- Odstraní klíč a přiřazenou hodnotu. Vrací
-
delete(keys:Array<string>, optionsObjectoptional)Promise<number>- Odstraní zadané klíče a jejich přiřazené hodnoty. Podporuje najednou až 128 klíčů. Vrací počet odstraněných dvojic klíč-hodnota.
Podporované možnosti
-
put(),delete()adeleteAll()podporují následující možnosti: -
allowUnconfirmedboolean-
Ve výchozím nastavení systém pozastaví odchozí síťové zprávy z Durable Object, dokud nebude potvrzeno, že všechny předchozí zápisy byly uloženy na disk. Pokud zápis selže, systém objekt resetuje, zahodí všechny odchozí zprávy a klientům místo toho odpoví chybou.
-
Díky tomu mohou Durable Objects pokračovat ve vykonávání souběžně se zápisovou operací, aniž by bylo potřeba řešit předčasné potvrzení zápisu, protože žádná externí strana nemůže pozorovat činnost objektu, dokud zápis skutečně neproběhne.
-
Po každém zápisu mohou být následující síťové zprávy mírně zpožděny. Některé aplikace mohou považovat komunikaci na základě nepotvrzených zápisů za přijatelnou. Jiné programy naopak mohou upřednostnit okamžité povolení síťového provozu. V takovém případě nastavte
allowUnconfirmednatrueabyste vypnuli výchozí chování. -
Pokud chcete, aby některé odchozí síťové zprávy prošly okamžitě a jiné ne, můžete použít volbu allowUnconfirmed, abyste zprávy, které mají projít, neblokovali, a poté zvlášť zavolat
sync()metoda, která vrací promise a splní se až ve chvíli, kdy jsou všechny předchozí zápisy úspěšně uloženy na disk.
-
-
noCacheboolean-
Pokud je hodnota true, klíč/hodnota se z paměti odstraní hned po dokončení zápisu na disk.
-
Použijte
noCachepokud se klíč v blízké budoucnosti znovu nepoužije.noCachenikdy nezmění sémantiku vašeho kódu, ale může ovlivnit výkon. -
Pokud používáte
get()pro načtení klíče před dokončením zápisu se vrátí kopie ze zápisové vyrovnávací paměti, čímž se zajistí konzistence s posledním volánímput().
-
seznam
list(options:Objectoptional)Promise<Map<string, any>>-
Vrátí všechny klíče a hodnoty přiřazené aktuálnímu Durable Object seřazené vzestupně podle UTF-8 kódování klíčů.
-
Typ každé vrácené hodnoty v
Map↗ bude odpovídat tomu, co bylo dříve zapsáno pro odpovídající klíč. -
Než zavoláte tuto verzi
listbez možností, protože všechna data se načtou do paměti Durable Object, což může narazit na jeho limit. Pokud je to problém, předejte parametr options dolistjak je popsáno níže.
-
Podporované možnosti
-
startstring- Klíč, od kterého mají výsledky výpisu začínat, včetně tohoto klíče.
-
startAfterstring- Klíč, za kterým začínají výsledky výpisu, tento klíč není zahrnut. Nelze použít současně s
start.
- Klíč, za kterým začínají výsledky výpisu, tento klíč není zahrnut. Nelze použít současně s
-
endstring- Klíč, u kterého mají výsledky výpisu končit, tento klíč není zahrnut.
-
prefixstring- Omezí výsledky pouze na dvojice klíč-hodnota, jejichž klíče začínají daným prefixem.
-
reverseboolean- Pokud je hodnota true, výsledky se vrátí v sestupném pořadí místo výchozího vzestupného.
- Povolení
reversenemění významstart,startKey, neboendKey.startstále definuje nejmenší klíč v lexikografickém pořadí, který lze vrátit (inkluzivně), a fakticky tak slouží jako koncový bod výpisu v obráceném pořadí.endstále definuje největší klíč v lexikografickém pořadí, který má výpis zohlednit (exkluzivně), a fakticky tak slouží jako počáteční bod výpisu v obráceném pořadí.
-
limitnumber- Maximální počet párů klíč-hodnota, které se mají vrátit.
-
allowConcurrencyboolean- Stejné jako možnost
get(), výše.
- Stejné jako možnost
-
noCacheboolean- Stejné jako možnost
get(), výše.
- Stejné jako možnost
Alarmy
getAlarm
getAlarm(options:Objectoptional)Promise<Number | null>- Načte aktuální čas alarmu (pokud je nastaven) jako celé číslo milisekund od epochy. Alarm se považuje za nastavený, pokud ještě nezačal, nebo pokud selhal a žádný opakovaný pokus ještě nezačal. Pokud není nastaven žádný alarm,
getAlarm()vracínull.
- Načte aktuální čas alarmu (pokud je nastaven) jako celé číslo milisekund od epochy. Alarm se považuje za nastavený, pokud ještě nezačal, nebo pokud selhal a žádný opakovaný pokus ještě nezačal. Pokud není nastaven žádný alarm,
Podporované možnosti
- Stejné možnosti jako
get(), ale beznoCache.
setAlarm
-
setAlarm(scheduledTime:Date | number, optionsObjectoptional)Promise- Nastaví aktuální čas alarmu, přičemž přijímá buď JavaScript
Date, nebo celé číslo milisekund od epochy.
Pokud
setAlarm()je volán s časem rovným nebo dřívějším nežDate.now(), alarm se naplánuje k asynchronnímu spuštění v nejbližší době. Pokud v tomto případě obslužná rutina alarmu už běží, nezruší se. Alarmy lze nastavit s přesností na milisekundy a obvykle se spustí během několika milisekund po nastaveném čase, ale kvůli údržbě nebo selhání během failoveru se mohou zpozdit až o minutu. - Nastaví aktuální čas alarmu, přičemž přijímá buď JavaScript
deleteAlarm
deleteAlarm(options:Objectoptional)Promise- Odstraní alarm, pokud existuje. Pokud handler alarmu právě běží, jeho spuštění tím nezruší.
Podporované možnosti
setAlarm()adeleteAlarm()podporují stejné možnosti jakoput(), ale beznoCache.
Ostatní
deleteAll
deleteAll(options:Objectoptional)Promise- Odstraní všechna uložená data a fakticky uvolní veškeré úložiště použité Durable Object. U Durable Objects s úložištěm typu klíč-hodnota
deleteAll()odstraní všechny klíče a jejich hodnoty pro jednotlivý Durable Object. U Durable Objects s Backend úložiště SQLite,deleteAll()odstraní veškerý obsah privátní SQLite databáze Durable Objectu, včetně SQL dat i dat klíč-hodnota. - U Durable Objects s úložištěm typu klíč-hodnota probíhající
deleteAll()operace může selhat, což může vést k tomu, že se smaže jen část dat. Durable Objects s úložištěm SQLite nemají problém s částečnýmdeleteAll()problém, protožedeleteAll()operace jsou atomické (buď proběhnou celé, nebo vůbec). - U Workerů s datem kompatibility
2026-02-24nebo novější,deleteAll()zároveň odstraní všechny aktivní alarm. U starších dat kompatibilitydeleteAll()nemaže alarmy. PoužijtedeleteAlarm()samostatně, nebo povoltedelete_all_deletes_alarmpříznak kompatibility.
- Odstraní všechna uložená data a fakticky uvolní veškeré úložiště použité Durable Object. U Durable Objects s úložištěm typu klíč-hodnota
transactionSync
transactionSync(callback):any-
K dispozici pouze při použití Durable Objects podporovaných SQLite.
-
Vyvolá
callback()zabalené v transakci a vrátí její výsledek. -
Pokud
callback()vyvolá výjimku, transakce se vrátí zpět (rollback). -
Callback musí doběhnout synchronně, to znamená, že by neměl být deklarován
asyncani jinak nevracet Promise. Součástí transakce mohou být pouze synchronní operace s úložištěm. Je to určené pro použití s SQL dotazy pomocíctx.storage.sql.exec(), které se dokončují synchronně.
-
transaction
-
transaction(closureFunction(txn)):Promise-
Spustí sekvenci operací úložiště volaných na
txnv rámci jedné transakce, která se buď úspěšně potvrdí, nebo přeruší. -
Explicitní transakce už nejsou potřeba. Jakákoli série zápisových operací bez mezilehlého
awaitse automaticky odešlou atomicky a systém zabrání souběžnému spuštění událostí, dokudawaitoperaci čtení (pokud nepoužijeteallowConcurrency: true). Řada čtení následovaná řadou zápisů (bez jakéhokoli dalšího vstupně-výstupního zásahu mezi nimi) je proto automaticky atomická a chová se jako transakce.
-
-
txn-
Poskytuje přístup k
put(),get(),delete(), alist()metody zdokumentované výše, které poběží v kontextu aktuální transakce. Abyste uvnitř transakčního uzávěru (closure) dosáhli transakčního chování, musíte tyto metody volat natxnObject místo na nejvyšší úrovnictx.storageObject.
Podporuje takérollback()funkce, která zajistí, že veškeré změny provedené během transakce se vrátí zpět místo potvrzení. Porollback()je zavolán, jakékoli další operace natxnObject selže s výjimkou.rollback()nepřijímá žádné parametry a volajícímu nic nevrací. -
Při použití úložný stroj založený na SQLite,
txnobjekt je zastaralý. Jakékoli operace s úložištěm provedené přímo nactx.storageobjekt, včetně SQL dotazů pomocíctx.storage.sql.exec(), budou považovány za součást transakce.
-
sync
sync():Promise-
Synchronizuje všechny čekající zápisy na disk.
-
Je to podobné běžnému chování při automatickém slučování zápisů (write coalescing). Pokud je ve vyrovnávací paměti zápisů čekající zápis (včetně těch odeslaných pomocí
allowUnconfirmedmožnost), vrácený promise se splní, jakmile se dokončí. Pokud nejsou žádné čekající zápisy, vrácený promise je už splněný.
-