88from typing_extensions import override
99
1010from crawlee ._utils .file import infer_mime_type
11- from crawlee .errors import StorageWriteError
11+ from crawlee ._utils . retry import retry_on_error
1212from crawlee .storage_clients ._base import KeyValueStoreClient
1313from crawlee .storage_clients .models import KeyValueStoreMetadata , KeyValueStoreRecord , KeyValueStoreRecordMetadata
1414
@@ -102,21 +102,25 @@ async def open(
102102 instance_kwargs = {},
103103 )
104104
105+ @retry_on_error (RedisError )
105106 @override
106107 async def get_metadata (self ) -> KeyValueStoreMetadata :
107108 return await self ._get_metadata (KeyValueStoreMetadata )
108109
110+ @retry_on_error (RedisError )
109111 @override
110112 async def drop (self ) -> None :
111113 await self ._drop (extra_keys = [self ._items_key , self ._metadata_items_key ])
112114
115+ @retry_on_error (RedisError )
113116 @override
114117 async def purge (self ) -> None :
115118 await self ._purge (
116119 extra_keys = [self ._items_key , self ._metadata_items_key ],
117120 metadata_kwargs = MetadataUpdateParams (update_accessed_at = True , update_modified_at = True ),
118121 )
119122
123+ @retry_on_error (RedisError )
120124 @override
121125 async def set_value (self , * , key : str , value : Any , content_type : str | None = None ) -> None :
122126 # Special handling for None values
@@ -143,25 +147,20 @@ async def set_value(self, *, key: str, value: Any, content_type: str | None = No
143147 content_type = content_type ,
144148 size = size ,
145149 )
146- try :
147- async with self ._get_pipeline () as pipe :
148- # redis-py typing issue
149- await await_redis_response (pipe .hset (self ._items_key , key , value_bytes )) # ty: ignore[invalid-argument-type]
150-
151- await await_redis_response (
152- pipe .hset (
153- self ._metadata_items_key ,
154- key ,
155- item_metadata .model_dump_json (),
156- )
157- )
158- await self ._update_metadata (
159- pipe , ** MetadataUpdateParams (update_accessed_at = True , update_modified_at = True )
150+ async with self ._get_pipeline () as pipe :
151+ # redis-py typing issue
152+ await await_redis_response (pipe .hset (self ._items_key , key , value_bytes )) # ty: ignore[invalid-argument-type]
153+
154+ await await_redis_response (
155+ pipe .hset (
156+ self ._metadata_items_key ,
157+ key ,
158+ item_metadata .model_dump_json (),
160159 )
160+ )
161+ await self ._update_metadata (pipe , ** MetadataUpdateParams (update_accessed_at = True , update_modified_at = True ))
161162
162- except RedisError as e :
163- raise StorageWriteError (e ) from e
164-
163+ @retry_on_error (RedisError )
165164 @override
166165 async def get_value (self , * , key : str ) -> KeyValueStoreRecord | None :
167166 serialized_metadata_item = await await_redis_response (self ._redis .hget (self ._metadata_items_key , key ))
@@ -207,6 +206,7 @@ async def get_value(self, *, key: str) -> KeyValueStoreRecord | None:
207206
208207 return KeyValueStoreRecord (value = value , ** metadata_item .model_dump ())
209208
209+ @retry_on_error (RedisError )
210210 @override
211211 async def delete_value (self , * , key : str ) -> None :
212212 async with self ._get_pipeline () as pipe :
@@ -258,6 +258,7 @@ async def iterate_keys(
258258 async def get_public_url (self , * , key : str ) -> str :
259259 raise NotImplementedError ('Public URLs are not supported for memory key-value stores.' )
260260
261+ @retry_on_error (RedisError )
261262 @override
262263 async def record_exists (self , * , key : str ) -> bool :
263264 async with self ._get_pipeline (with_execute = False ) as pipe :
0 commit comments