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");
if let Some(objects) = list_response.contents {
// Формируем список файлов
let file_list: Vec<String> = objects
.iter()
.filter_map(|object| object.key.clone())
.collect();
// Формируем список файлов без дубликатов по имени файла (без расширения)
let mut file_list = std::collections::HashMap::new();
for object in objects.iter() {
if let Some(key) = &object.key {
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 для каждого файла
for (filename, path) in file_list {
let _: () = redis
.set(
FILE_LIST_CACHE_KEY,
serde_json::to_string(&file_list).unwrap(),
)
.hset(FILE_LIST_CACHE_KEY, filename, path)
.await
.expect("Failed to cache file list in Redis");
.expect("Failed to cache file in Redis");
}
}
}
@ -127,14 +134,10 @@ impl AppState {
let mut redis = self.redis.clone();
// Пытаемся получить кэшированный список из 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 {
// Если список найден, возвращаем его в виде вектора строк
serde_json::from_str(&cached_list).unwrap_or_else(|_| vec![])
} else {
vec![]
}
// Преобразуем HashMap в Vec<String>, используя значения (пути файлов)
cached_list.into_values().collect()
}
/// Периодически обновляет кэшированный список файлов из Storj S3.