自动清理algolia缓存的脚本

wen 实用脚本 13

本文目录导读:

自动清理algolia缓存的脚本

  1. 基础版本 - 定时清理缓存脚本
  2. 更高级的版本 - 带定时任务和监控
  3. 配置文件示例
  4. 使用方法
  5. 安全建议

基础版本 - 定时清理缓存脚本

#!/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"

使用方法

  1. 基本使用:

    chmod +x algolia-cleanup.sh
    ./algolia-cleanup.sh
  2. 自动模式(适合Cron):

    ./algolia-cleanup.sh --auto
  3. 设置定时任务(每2小时):

    ./algolia-cleanup.sh --setup-cron
  4. 强制清理:

    ./algolia-cleanup.sh --force

安全建议

  1. 使用环境变量存储API密钥,而非硬编码
  2. 限制脚本执行权限:chmod 700 algolia-cleanup.sh
  3. 定期轮转日志文件
  4. 在生产环境先测试清理功能

这个脚本提供了完整的Algolia缓存管理解决方案,你可以根据实际需求调整缓存清理策略和定时频率。

抱歉,评论功能暂时关闭!