本文目录导读:

基础版本 - 定时清理缓存脚本
#!/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缓存管理解决方案,你可以根据实际需求调整缓存清理策略和定时频率。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播