Make backends store bytes instead of strings

This is, for the majority of backends, the native format anyway, and so
we save encoding and decoding when using the PickleCodec or if (in future)
a orjson Coder was to be added.

For the JsonCodec, the only thing that changed is the location where the
JSON data is encoded to bytes and decoded back again to a string.
This commit is contained in:
Martijn Pieters
2023-05-09 18:17:28 +01:00
parent 5f2fcf3581
commit 23d439f83a
8 changed files with 54 additions and 45 deletions

View File

@@ -39,11 +39,11 @@ class DynamoBackend(Backend):
async def close(self) -> None:
self.client = await self.client.__aexit__(None, None, None)
async def get_with_ttl(self, key: str) -> Tuple[int, str]:
async def get_with_ttl(self, key: str) -> Tuple[int, Optional[bytes]]:
response = await self.client.get_item(TableName=self.table_name, Key={"key": {"S": key}})
if "Item" in response:
value = response["Item"].get("value", {}).get("S")
value = response["Item"].get("value", {}).get("B")
ttl = response["Item"].get("ttl", {}).get("N")
if not ttl:
@@ -56,12 +56,12 @@ class DynamoBackend(Backend):
return 0, None
async def get(self, key: str) -> str:
async def get(self, key: str) -> Optional[bytes]:
response = await self.client.get_item(TableName=self.table_name, Key={"key": {"S": key}})
if "Item" in response:
return response["Item"].get("value", {}).get("S")
return response["Item"].get("value", {}).get("B")
async def set(self, key: str, value: str, expire: Optional[int] = None) -> None:
async def set(self, key: str, value: bytes, expire: Optional[int] = None) -> None:
ttl = (
{
"ttl": {
@@ -83,7 +83,7 @@ class DynamoBackend(Backend):
Item={
**{
"key": {"S": key},
"value": {"S": value},
"value": {"B": value},
},
**ttl,
},