use-hset-hget+skip-webp
Some checks failed
deploy / deploy (push) Failing after 4m16s

This commit is contained in:
Untone 2024-10-21 23:46:26 +03:00
parent 74e1ab9bc6
commit bfeecd553d

View File

@ -105,20 +105,27 @@ impl AppState {
.expect("Failed to list files from S3"); .expect("Failed to list files from S3");
if let Some(objects) = list_response.contents { if let Some(objects) = list_response.contents {
// Формируем список файлов // Формируем список файлов без дубликатов по имени файла (без расширения)
let file_list: Vec<String> = objects let mut file_list = std::collections::HashMap::new();
.iter() for object in objects.iter() {
.filter_map(|object| object.key.clone()) if let Some(key) = &object.key {
.collect(); let parts: Vec<&str> = key.split('.').collect();
if parts.len() > 1 && !parts.last().unwrap().contains('/') {
let filename = parts[0..parts.len()-1].join(".");
file_list.entry(filename).or_insert(key.clone());
} else {
file_list.entry(key.to_string()).or_insert(key.clone());
}
}
}
// Сохраняем список файлов в Redis в формате JSON // Сохраняем список файлов в Redis, используя HSET для каждого файла
let _: () = redis for (filename, path) in file_list {
.set( let _: () = redis
FILE_LIST_CACHE_KEY, .hset(FILE_LIST_CACHE_KEY, filename, path)
serde_json::to_string(&file_list).unwrap(), .await
) .expect("Failed to cache file in Redis");
.await }
.expect("Failed to cache file list in Redis");
} }
} }
@ -127,14 +134,10 @@ impl AppState {
let mut redis = self.redis.clone(); let mut redis = self.redis.clone();
// Пытаемся получить кэшированный список из Redis // Пытаемся получить кэшированный список из Redis
let cached_list: Option<String> = redis.get(FILE_LIST_CACHE_KEY).await.unwrap_or(None); let cached_list: HashMap<String, String> = redis.hgetall(FILE_LIST_CACHE_KEY).await.unwrap_or_default();
if let Some(cached_list) = cached_list { // Преобразуем HashMap в Vec<String>, используя значения (пути файлов)
// Если список найден, возвращаем его в виде вектора строк cached_list.into_values().collect()
serde_json::from_str(&cached_list).unwrap_or_else(|_| vec![])
} else {
vec![]
}
} }
/// Периодически обновляет кэшированный список файлов из Storj S3. /// Периодически обновляет кэшированный список файлов из Storj S3.