本文目录导读:

基础版本 - 定时清理缓存脚本
#!/bin/bash
# Algolia缓存清理脚本
# 支持清理:API响应缓存、搜索结果缓存、索引缓存
# ====== 配置区域 ======
APPLICATION_ID="你的AppID"
ADMIN_API_KEY="你的AdminAPIKey" # 建议使用环境变量存储
INDEX_NAME="your_index_name" # 如不指定则清理所有索引
CACHE_TTL=3600 # 缓存过期时间(秒)
LOG_FILE="/var/log/algolia-cleanup.log"
# ====== 功能函数 ======
# 日志记录函数
log() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] $1" >> "$LOG_FILE"
echo "[$timestamp] $1"
}
# 清理搜索结果缓存
clean_search_cache() {
log "开始清理搜索结果缓存..."
# 使用API强制刷新索引(会重置搜索缓存)
curl -s -X POST \
"https://${APPLICATION_ID}.algolia.net/1/indexes/${INDEX_NAME}/clear" \
-H "X-Algolia-API-Key: ${ADMIN_API_KEY}" \
-H "X-Algolia-Application-Id: ${APPLICATION_ID}" \
-H "Content-Type: application/json"
if [ $? -eq 0 ]; then
log "搜索结果缓存清理成功"
else
log "搜索结果缓存清理失败"
return 1
fi
}
# 清理整个索引(谨慎使用)
clean_index() {
log "开始清理索引(将删除所有数据)..."
read -p "确认清理索引 ${INDEX_NAME}? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
log "用户取消清理索引操作"
return 0
fi
curl -s -X DELETE \
"https://${APPLICATION_ID}.algolia.net/1/indexes/${INDEX_NAME}" \
-H "X-Algolia-API-Key: ${ADMIN_API_KEY}" \
-H "X-Algolia-Application-Id: ${APPLICATION_ID}"
if [ $? -eq 0 ]; then
log "索引清理成功"
else
log "索引清理失败"
return 1
fi
}
# 重新索引(索引重建)
reindex_data() {
log "开始重新索引数据..."
# 这里需要替换为你的数据重新索引逻辑
# 示例:从JSON文件重新导入数据
curl -s -X POST \
"https://${APPLICATION_ID}.algolia.net/1/indexes/${INDEX_NAME}/batch" \
-H "X-Algolia-API-Key: ${ADMIN_API_KEY}" \
-H "X-Algolia-Application-Id: ${APPLICATION_ID}" \
-H "Content-Type: application/json" \
-d @your_data.json
if [ $? -eq 0 ]; then
log "数据重新索引成功"
else
log "数据重新索引失败"
return 1
fi
}
# 检查缓存在指定时间内是否过期
check_cache_ttl() {
local last_cleanup_time=0
local current_time=$(date +%s)
if [ -f /tmp/algolia_last_cleanup ]; then
last_cleanup_time=$(cat /tmp/algolia_last_cleanup)
fi
local elapsed=$((current_time - last_cleanup_time))
if [ $elapsed -lt $CACHE_TTL ]; then
log "缓存未过期(已过 ${elapsed}秒,TTL: ${CACHE_TTL}秒),跳过清理"
return 1
fi
return 0
}
# ====== 主逻辑 ======
main() {
# 检查配置是否完整
if [ -z "$APPLICATION_ID" ] || [ "$APPLICATION_ID" = "你的AppID" ]; then
log "错误:请配置 APPLICATION_ID"
exit 1
fi
if [ -z "$ADMIN_API_KEY" ] || [ "$ADMIN_API_KEY" = "你的AdminAPIKey" ]; then
log "错误:请配置 ADMIN_API_KEY"
exit 1
fi
echo "=============================="
echo "Algolia 缓存清理工具"
echo "选择要执行的操作:"
echo "1. 清理搜索结果缓存"
echo "2. 清理并重建索引(危险)"
echo "3. 强制重新索引数据"
echo "4. 查看缓存状态"
echo "5. 定时清理模式"
echo "0. 退出"
echo "=============================="
read -p "请选择 [0-5]: " choice
case $choice in
1)
clean_search_cache
;;
2)
clean_index
;;
3)
reindex_data
;;
4)
echo "AppID: $APPLICATION_ID"
echo "索引名: $INDEX_NAME"
if [ -f /tmp/algolia_last_cleanup ]; then
echo "上次清理时间: $(date -d @$(cat /tmp/algolia_last_cleanup))"
else
echo "尚未执行过清理"
fi
;;
5)
echo "进入定时清理模式(每 $CACHE_TTL 秒检查一次)"
log "启动定时清理模式"
while true; do
check_cache_ttl
if [ $? -eq 0 ]; then
clean_search_cache
date +%s > /tmp/algolia_last_cleanup
fi
sleep 60 # 每分钟检查一次
done
;;
0)
echo "退出程序"
exit 0
;;
*)
echo "无效选择"
exit 1
;;
esac
}
# 执行主函数
main
更高级的版本 - 带定时任务和监控
#!/bin/bash
# ====== 配置文件 ======
CONFIG_FILE="/etc/algolia-cleanup.conf"
# 默认配置
DEFAULT_APP_ID=""
DEFAULT_API_KEY=""
DEFAULT_INDEX=""
DEFAULT_TTL=3600
DEFAULT_LOG="/var/log/algolia-cleanup.log"
DEFAULT_STATE_FILE="/var/run/algolia-cleanup.state"
# ====== 颜色输出 ======
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# ====== 加载配置 ======
load_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
# 使用环境变量或默认值
APPLICATION_ID="${ALGOLIA_APP_ID:-$DEFAULT_APP_ID}"
ADMIN_API_KEY="${ALGOLIA_API_KEY:-$DEFAULT_API_KEY}"
INDEX_NAME="${ALGOLIA_INDEX:-$DEFAULT_INDEX}"
CACHE_TTL="${ALGOLIA_TTL:-$DEFAULT_TTL}"
LOG_FILE="${ALGOLIA_LOG:-$DEFAULT_LOG}"
STATE_FILE="${ALGOLIA_STATE:-$DEFAULT_STATE_FILE}"
fi
}
# ====== API调用封装 ======
algolia_api() {
local method="$1"
local endpoint="$2"
local data="$3"
curl -s -X "$method" \
"https://${APPLICATION_ID}.algolia.net${endpoint}" \
-H "X-Algolia-API-Key: ${ADMIN_API_KEY}" \
-H "X-Algolia-Application-Id: ${APPLICATION_ID}" \
-H "Content-Type: application/json" \
${data:+-d "$data"}
}
# ====== 缓存清理策略 ======
# 策略1: 清除搜索缓存
clear_search_cache() {
log "执行搜索缓存清理..."
# 方法1: 清除指定索引的缓存
algolia_api "POST" "/1/indexes/${INDEX_NAME}/clear"
# 方法2: 删除所有索引的缓存(需要完全访问权限)
# algolia_api "POST" "/1/indexes/*/clear"
return $?
}
# 策略2: 清除对象缓存
clear_object_cache() {
log "执行对象缓存清理..."
# 获取所有对象ID并清除缓存
local objects=$(algolia_api "GET" "/1/indexes/${INDEX_NAME}/objects")
if [ -n "$objects" ]; then
echo "$objects" | jq -c '.hits[] | {objectID}' | while read obj; do
local object_id=$(echo "$obj" | jq -r '.objectID')
algolia_api "DELETE" "/1/indexes/${INDEX_NAME}/objects/${object_id}" > /dev/null
done
fi
}
# 策略3: 重置整个索引(最彻底)
reset_index() {
log "警告:正在重置索引 ${INDEX_NAME}"
# 备份索引设置
local settings=$(algolia_api "GET" "/1/indexes/${INDEX_NAME}/settings")
echo "$settings" > /tmp/algolia_settings_backup.json
# 删除索引
algolia_api "DELETE" "/1/indexes/${INDEX_NAME}"
# 重新创建索引(使用备份设置)
sleep 2
algolia_api "PUT" "/1/indexes/${INDEX_NAME}" "$settings"
}
# ====== 智能缓存判断 ======
# 检查缓存是否需要清理
should_clean_cache() {
local rules_file="/etc/algolia-cache-rules.json"
# 如果没有规则文件,使用TTL判断
if [ ! -f "$rules_file" ]; then
check_ttl
return $?
fi
# 根据规则文件判断
local rule=$(cat "$rules_file" | jq -r '.cleanup_rules[] | select(.index == "'"${INDEX_NAME}"'")')
if [ -z "$rule" ]; then
check_ttl
return $?
fi
# 检查特定条件
local last_update=$(algolia_api "GET" "/1/indexes/${INDEX_NAME}/task" | jq -r '.updatedAt')
local rule_condition=$(echo "$rule" | jq -r '.condition')
# 这里可以添加更多复杂的判断逻辑
case $rule_condition in
"every_hour")
return 0
;;
"data_change")
# 检查数据是否变化
return 0
;;
*)
check_ttl
return $?
;;
esac
}
# ====== 定时任务管理 ======
# 设置Cron定时任务
setup_cron() {
local cron_schedule="$1"
local script_path="$0"
# 检查现有cron任务
crontab -l 2>/dev/null | grep -q "$script_path"
if [ $? -eq 0 ]; then
echo "Cron任务已存在"
return 1
fi
# 添加cron任务
(crontab -l 2>/dev/null; echo "$cron_schedule $script_path --auto") | crontab -
if [ $? -eq 0 ]; then
echo "已设置定时任务: $cron_schedule"
log "设置定时任务: $cron_schedule"
fi
}
# 移除Cron任务
remove_cron() {
local script_path="$0"
crontab -l 2>/dev/null | grep -v "$script_path" | crontab -
echo "已移除Algolia缓存清理定时任务"
}
# ====== 日志和监控 ======
log() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "${GREEN}[$timestamp]${NC} $1"
echo "[$timestamp] $1" >> "$LOG_FILE"
# 如果日志文件过大,自动轮转
if [ -f "$LOG_FILE" ] && [ "$(stat -c%s "$LOG_FILE")" -gt 1048576 ]; then
mv "$LOG_FILE" "${LOG_FILE}.old"
echo "[$timestamp] 日志文件已轮转" > "$LOG_FILE"
fi
}
# 发送通知
send_notification() {
local message="$1"
local webhook_url="${SLACK_WEBHOOK_URL:-}"
if [ -n "$webhook_url" ]; then
curl -s -X POST "$webhook_url" \
-H "Content-Type: application/json" \
-d "{\"text\": \"Algolia缓存清理: $message\"}"
fi
}
# ====== 主程序 ======
main() {
load_config
# 检查API密钥
if [ -z "$APPLICATION_ID" ] || [ -z "$ADMIN_API_KEY" ]; then
echo -e "${RED}错误: 请设置API密钥${NC}"
echo "使用方法: export ALGOLIA_APP_ID='your_app_id'"
echo " export ALGOLIA_API_KEY='your_api_key'"
exit 1
fi
case "${1:-}" in
--auto)
# 自动模式
log "自动模式:检查缓存状态..."
if should_clean_cache; then
if clear_search_cache; then
log "${GREEN}缓存清理成功${NC}"
date +%s > "$STATE_FILE"
send_notification "✅ 缓存清理成功 - 索引: ${INDEX_NAME}"
else
log "${RED}缓存清理失败${NC}"
send_notification "❌ 缓存清理失败 - 索引: ${INDEX_NAME}"
fi
else
log "缓存未过期,跳过清理"
fi
;;
--force)
# 强制清理
log "强制清理所有缓存..."
reset_index
send_notification "🔄 索引已重置: ${INDEX_NAME}"
;;
--setup-cron)
# 设置定时任务
setup_cron "0 */2 * * *" # 每2小时执行一次
;;
--remove-cron)
# 移除定时任务
remove_cron
;;
--status)
# 查看状态
echo "缓存清理状态:"
echo " 应用ID: $APPLICATION_ID"
echo " 索引名: $INDEX_NAME"
echo " TTL: $CACHE_TTL 秒"
if [ -f "$STATE_FILE" ]; then
echo " 上次清理: $(date -d @$(cat "$STATE_FILE"))"
fi
echo " 定时任务: $(crontab -l 2>/dev/null | grep -c "$0")个"
;;
*)
# 交互模式
echo "Algolia 缓存清理工具 v2.0"
echo "=========================="
echo "1. 清理搜索缓存"
echo "2. 清理对象缓存"
echo "3. 重置索引(危险)"
echo "4. 设置定时任务"
echo "5. 查看状态"
echo "0. 退出"
echo "=========================="
read -p "请选择: " choice
case $choice in
1) clear_search_cache ;;
2) clear_object_cache ;;
3) reset_index ;;
4) setup_cron "0 */2 * * *" ;;
5) $0 --status ;;
0) exit 0 ;;
esac
;;
esac
}
# 执行
main "$@"
配置文件示例
创建 /etc/algolia-cleanup.conf:
# Algolia配置 ALGOLIA_APP_ID="your_application_id" ALGOLIA_API_KEY="your_admin_api_key" ALGOLIA_INDEX="your_index_name" # 缓存配置 ALGOLIA_TTL=7200 # 2小时 # 日志配置 ALGOLIA_LOG="/var/log/algolia-cleanup.log" ALGOLIA_STATE="/var/run/algolia-cleanup.state" # 可选:Slack通知 SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxx"
使用方法
-
基本使用:
chmod +x algolia-cleanup.sh ./algolia-cleanup.sh
-
自动模式(适合Cron):
./algolia-cleanup.sh --auto
-
设置定时任务(每2小时):
./algolia-cleanup.sh --setup-cron
-
强制清理:
./algolia-cleanup.sh --force
安全建议
- 使用环境变量存储API密钥,而非硬编码
- 限制脚本执行权限:
chmod 700 algolia-cleanup.sh - 定期轮转日志文件
- 在生产环境先测试清理功能
这个脚本提供了完整的Algolia缓存管理解决方案,你可以根据实际需求调整缓存清理策略和定时频率。