← Cloudflare Workers KV / kv / api
Чтение пар «ключ-значение»
Чтобы получить значение для указанного ключа, вызовите get() метод объекта Привязка KV для любого Пространство имён KV привязанных к коду вашего Worker:
// Read individual key
env.NAMESPACE.get(key);
// Read multiple keys
env.NAMESPACE.get(keys);# Read individual key
self.env.NAMESPACE.get(key)
# Read multiple keys
self.env.NAMESPACE.get(keys) get() метод возвращает промис, который можно await для получения значения.
Если вы запрашиваете один ключ в виде строки, promise возвращает единственный ответ. Если ключ не найден, promise разрешается со значением null.
Вы также можете запросить массив ключей. Возвращаемое значение будет представлять собой Map найденных пар ключ-значение,
причём для не найденных ключей null значения.
export default {
async fetch(request, env, ctx) {
try {
// Read single key, returns value or null
const value = await env.NAMESPACE.get("first-key");
// Read multiple keys, returns Map of values
const values = await env.NAMESPACE.get(["first-key", "second-key"]);
// Read single key with metadata, returns value or null
const valueWithMetadata = await env.NAMESPACE.getWithMetadata("first-key");
// Read multiple keys with metadata, returns Map of values
const valuesWithMetadata = await env.NAMESPACE.getWithMetadata(["first-key", "second-key"]);
return new Response({
value: value,
values: Object.fromEntries(values),
valueWithMetadata: valueWithMetadata,
valuesWithMetadata: Object.fromEntries(valuesWithMetadata)
});
} catch (e) {
return new Response(e.message, { status: 500 });
}
},
};from workers import WorkerEntrypoint, Response
class Default(WorkerEntrypoint):
async def fetch(self, request):
try:
# Read single key, returns value or None
value = await self.env.NAMESPACE.get("first-key")
# Read multiple keys, returns dict of values
values = await self.env.NAMESPACE.get(["first-key", "second-key"])
# Read single key with metadata
value_with_metadata = await self.env.NAMESPACE.getWithMetadata("first-key")
# Read multiple keys with metadata
values_with_metadata = await self.env.NAMESPACE.getWithMetadata(["first-key", "second-key"])
return Response.json({
"value": value,
"values": values,
"valueWithMetadata": value_with_metadata,
"valuesWithMetadata": values_with_metadata,
})
except Exception as e:
return Response(str(e), status=500)Справочник
Ниже приведены методы для чтения из KV:
get() метод
Используйте get() метод для получения одного значения или нескольких значений, если указано несколько ключей:
- Чтение отдельных ключей с помощью get(key: string)
- Чтение нескольких ключей с помощью get(keys: string[])
Request a single key with get(key: string)
Чтобы получить значение для одного ключа, вызовите get() метод для любого пространства имен KV, привязанного к коду вашего Worker, с помощью:
env.NAMESPACE.get(key, type?);
// OR
env.NAMESPACE.get(key, options?);self.env.NAMESPACE.get(key, type)
# OR
self.env.NAMESPACE.get(key, options)Параметры
key:string- Ключ пары KV.
type:"text" | "json" | "arrayBuffer" | "stream"- Необязательно. Тип возвращаемого значения.
textиспользуется по умолчанию.
- Необязательно. Тип возвращаемого значения.
options:{ cacheTtl?: number, type?: "text" | "json" | "arrayBuffer" | "stream" }- Необязательно. Объект, содержащий необязательные
cacheTtlиtypeсвойства.cacheTtlсвойство определяет время в секундах, в течение которого результат KV кешируется в той точке глобальной сети, из которой к нему обращаются (минимум: 30).typeсвойство определяет тип возвращаемого значения.
- Необязательно. Объект, содержащий необязательные
Ответ
response:Promise<string | Object | ArrayBuffer | ReadableStream | null>- Значение для запрошенной пары KV. Тип ответа зависит от
typeпараметр, указанный дляget()команду следующим образом: text:string(по умолчанию).json: объект, декодированный из строки JSON.arrayBuffer:ArrayBuffer↗ инстанс.stream:ReadableStream↗.
- Значение для запрошенной пары KV. Тип ответа зависит от
Запрос нескольких ключей с помощью get(keys: string[])
Чтобы получить значения для нескольких ключей, вызовите get() метод для любого пространства имен KV, привязанного к коду вашего Worker, с помощью:
env.NAMESPACE.get(keys, type?);
// OR
env.NAMESPACE.get(keys, options?);self.env.NAMESPACE.get(keys, type)
# OR
self.env.NAMESPACE.get(keys, options)Параметры
keys:string[]- Ключи пар KV. Максимум: 100 ключей
type:"text" | "json"- Необязательно. Тип возвращаемого значения.
textиспользуется по умолчанию.
- Необязательно. Тип возвращаемого значения.
options:{ cacheTtl?: number, type?: "text" | "json" }- Необязательно. Объект, содержащий необязательные
cacheTtlиtypeсвойства.cacheTtlсвойство определяет время в секундах, в течение которого результат KV кешируется в той точке глобальной сети, из которой к нему обращаются (минимум: 30).typeсвойство определяет тип возвращаемого значения.
- Необязательно. Объект, содержащий необязательные
Ответ
response:Promise<Map<string, string | Object | null>>- Значение для запрошенной пары KV. Если ключ не найден,
nullвозвращается для ключа. Тип ответа будет зависеть отtypeпараметр, указанный дляget()команду следующим образом:text:string(по умолчанию).json: объект, декодированный из строки JSON.
- Значение для запрошенной пары KV. Если ключ не найден,
Максимальный размер ответа составляет 25 MB. Ответы, которые превышают этот размер, будут завершаться ошибкой 413 Error сообщение об ошибке.
getWithMetadata() метод
Используйте getWithMetadata() метод для получения одного значения вместе с его метаданными или нескольких значений с их метаданными:
- Чтение отдельных ключей с помощью getWithMetadata(key: string)
- Чтение нескольких ключей с помощью getWithMetadata(keys: string[])
Request a single key with getWithMetadata(key: string)
Чтобы получить значение для указанного ключа вместе с его метаданными, вызовите getWithMetadata() метод для любого пространства имен KV, привязанного к коду вашего Worker:
env.NAMESPACE.getWithMetadata(key, type?);
// OR
env.NAMESPACE.getWithMetadata(key, options?);self.env.NAMESPACE.getWithMetadata(key, type)
# OR
self.env.NAMESPACE.getWithMetadata(key, options)Метаданные представляют собой сериализуемое значение, которое добавляется к каждой записи KV.
Параметры
key:string- Ключ пары KV.
type:"text" | "json" | "arrayBuffer" | "stream"- Необязательно. Тип возвращаемого значения.
textиспользуется по умолчанию.
- Необязательно. Тип возвращаемого значения.
options:{ cacheTtl?: number, type?: "text" | "json" | "arrayBuffer" | "stream" }- Необязательно. Объект, содержащий необязательные
cacheTtlиtypeсвойства.cacheTtlсвойство определяет время в секундах, в течение которого результат KV кешируется в той точке глобальной сети, из которой к нему обращаются (минимум: 30).typeсвойство определяет тип возвращаемого значения.
- Необязательно. Объект, содержащий необязательные
Ответ
-
response:Promise<{ value: string | Object | ArrayBuffer | ReadableStream | null, metadata: string | null }>- Объект, содержащий значение и метаданные запрошенной пары KV. Тип атрибута value зависит от
typeпараметр, указанный дляgetWithMetadata()команду следующим образом:text:string(по умолчанию).json: объект, декодированный из строки JSON.arrayBuffer:ArrayBuffer↗ инстанс.stream:ReadableStream↗.
- Объект, содержащий значение и метаданные запрошенной пары KV. Тип атрибута value зависит от
Если с запрошенной парой «ключ-значение» не связаны метаданные, null будет возвращено для metadata.
Запрос нескольких ключей с помощью getWithMetadata(keys: string[])
Чтобы получить значения для заданного набора ключей вместе с их метаданными, вызовите getWithMetadata() метод для любого пространства имен KV, привязанного к коду вашего Worker, с помощью:
env.NAMESPACE.getWithMetadata(keys, type?);
// OR
env.NAMESPACE.getWithMetadata(keys, options?);self.env.NAMESPACE.getWithMetadata(keys, type)
# OR
self.env.NAMESPACE.getWithMetadata(keys, options)Параметры
keys:string[]- Ключи пар KV. Максимум: 100 ключей
type:"text" | "json"- Необязательно. Тип возвращаемого значения.
textиспользуется по умолчанию.
- Необязательно. Тип возвращаемого значения.
options:{ cacheTtl?: number, type?: "text" | "json" }- Необязательно. Объект, содержащий необязательные
cacheTtlиtypeсвойства.cacheTtlсвойство определяет время в секундах, в течение которого результат KV кешируется в той точке глобальной сети, из которой к нему обращаются (минимум: 30).typeсвойство определяет тип возвращаемого значения.
- Необязательно. Объект, содержащий необязательные
Ответ
-
response:Promise<Map<string, { value: string | Object | null, metadata: string | Object | null }>- Объект, содержащий значение и метаданные запрошенной пары KV. Тип атрибута value зависит от
typeпараметр, указанный дляgetWithMetadata()команду следующим образом:text:string(по умолчанию).json: объект, декодированный из строки JSON.
- Тип метаданных зависит от того, что хранится: это может быть строка или объект.
- Объект, содержащий значение и метаданные запрошенной пары KV. Тип атрибута value зависит от
Если с запрошенной парой «ключ-значение» не связаны метаданные, null будет возвращено для metadata.
Максимальный размер ответа составляет 25 MB. Ответы, которые превышают этот размер, будут завершаться ошибкой 413 Error сообщение об ошибке.
Рекомендации
Параметр типа
Для простых значений используйте значение по умолчанию text тип, который предоставляет значение в виде string. Для удобства json также можно указать тип, который преобразует значение JSON в объект, прежде чем вернуть его вам. Для больших значений используйте stream чтобы запросить ReadableStream. Для двоичных значений используйте arrayBuffer чтобы запросить ArrayBuffer.
Для больших значений выбор type может заметно влиять на задержку и использование CPU. Для сравнения, type можно упорядочить от самого быстрого к самому медленному в следующем порядке: stream, arrayBuffer, text, а также json.
Параметр CacheTtl
cacheTtl это параметр, определяющий время в секундах, в течение которого результат KV кэшируется в той точке глобальной сети, из которой к нему обращаются.
Указание времени в секундах помогает снизить задержку холодного чтения для ключей, которые читаются относительно редко. cacheTtl полезен, если ваши данные записываются один раз или изменяются редко.
cacheTtl не рекомендуется, если ваши данные часто обновляются и вам нужно видеть изменения вскоре после записи, поскольку записи, сделанные из других точек глобальной сети, не будут видны, пока не истечёт срок действия кешированного значения.
cacheTtl параметр должен быть целым числом, большим или равным 30. 60 используется по умолчанию. Максимальное значение для cacheTtl это Number.MAX_SAFE_INTEGER ↗.
После того как ключ был прочитан с заданным cacheTtl в регионе, он останется закэшированным в этом регионе до конца cacheTtl или вытеснения из кеша. Это затрагивает региональный и центральный уровни встроенного кеширования KV. При записи в Workers KV регионы регионального и центрального уровней кеширования внутри KV повторно проверяются с учётом только что записанного результата.
Получение большего количества ключей за один вызов Worker с помощью массовых запросов
За один вызов Worker может выполнить не более 1,000 операций к внешним сервисам. Это ограничение распространяется на Workers KV, как описано в Лимиты Workers KV.
Чтобы прочитать более 1000 ключей за одну операцию, можно использовать массовые операции чтения для чтения нескольких ключей за один раз. Такая операция считается одной операцией в рамках лимита в 1000 операций.
Снижение кардинальности за счёт объединения ключей
Если у вас есть набор связанных пар «ключ-значение» со смешанным характером использования (часть ключей «горячие», часть «холодные»), рассмотрите возможность их объединения. Объединяя «холодные» ключи с «горячими», вы добиваетесь того, что «холодные» ключи кешируются вместе с «горячими», а это обеспечивает более быстрое чтение, чем если бы они оставались некешированными по отдельности.
Объединение в «супер» запись KV
Один из способов объединения заключается в том, чтобы сделать все ключи и значения частью единого супер-объекта «ключ-значение». Пример приведён ниже.
key1: value1
key2: value2
key3: value3становится
coalesced: {
key1: value1,
key2: value2,
key3: value3,
}Объединение значений позволяет холодным ключам оставаться в кэше благодаря паттернам доступа к более часто запрашиваемым (горячим) ключам.
Это лучше всего подходит, если вы не планируете обновлять значения независимо друг от друга, поскольку это может привести к состоянию гонки.
- Преимущество: редко запрашиваемые ключи остаются в кэше.
- Недостаток: размер итогового значения может привести к превышению лимита памяти Worker. Для безопасного обновления значения требуется механизм блокировки того или иного рода.
Другие способы доступа к KV
Вы можете чтение пар «ключ-значение» в командной строке с помощью Wrangler и из REST API.