from datetime import datetime import redis from vendor_image_caching import config from vendor_image_caching.cache.base import BaseClient from vendor_image_caching.constants import CacheField from vendor_image_caching.utils import compress, decompress CACHE_KEY_PREFIX = "cache" class Client(BaseClient): def __init__(self): self.redis_client: redis.Redis = self._get_redis_client() @staticmethod def _get_redis_client() -> redis.Redis: """Get redis client. Returns: Redis client. """ return redis.from_url(config.REDIS_URL) def get_document(self, collection_name: str, record_id: str, created_at: datetime) -> dict or None: """Get data from Redis. Args: collection_name: Collection name. record_id: Record ID. created_at: Record created_at timestamp. Returns: Cached data or None. """ raw_value = self.redis_client.get(self.get_full_key(collection_name, record_id)) if not raw_value: return None value = decompress(config.REDIS_COMPRESSION_LIB, raw_value) return value.get(CacheField.DATA) if value else None def save_document(self, collection_name: str, record_id: str, created_at: datetime, data: dict): """Save data to Redis. Args: collection_name: Collection name. record_id: Record ID. created_at: Records created_at datetime. data: Data with new image URLs. """ raw_value = self.redis_client.get(self.get_full_key(collection_name, record_id)) if not raw_value: return value = decompress(config.REDIS_COMPRESSION_LIB, raw_value) value[CacheField.DATA] = data value[CacheField.IMAGES_SAVED] = True self.redis_client.set( self.get_full_key(collection_name, record_id), compress(config.REDIS_COMPRESSION_LIB, value) ) @staticmethod def get_full_key(collection_name, key): """ Creates the full redis key from generic prefix, configured compression type and passed specific params Args: collection_name: Collection name for keys namespacing. key: key of the specific record. """ return f"{CACHE_KEY_PREFIX}:{config.REDIS_COMPRESSION_LIB}:{collection_name}:{key}"