生产Redis批量删除数据

生产Redis不能直接删除大量的Key,避免占用主线程阻塞正常业务,因此需要批量多次删除。一下代码经过生成磨炼,可以直接测试使用。

bash 复制代码
#!/bin/bash

# Redis服务器地址
REDIS_HOST="127.0.0.1"
# Redis端口
REDIS_PORT=6379
# 匹配的键模式
KEY_PATTERN="ACCOUNT_OVER*"
# 每批次处理的键数量
BATCH_SIZE=1000

# 使用redis-cli连接到Redis服务
redis_cli="redis-cli -h $REDIS_HOST -p $REDIS_PORT -a redis -c"

# 初始化游标
cursor=0

while true; do
    # 执行SCAN命令获取一批键
    keys=$($redis_cli --raw SCAN $cursor MATCH "$KEY_PATTERN" COUNT $BATCH_SIZE)
    
    # 检查是否成功执行了SCAN命令
    if [ $? -ne 0 ]; then
        echo "Failed to execute SCAN command, exiting..."
        exit 1
    fi
    
    # 分割输出以获得新游标值和其他键
    readarray -t parts <<< "$keys"
    cursor=${parts[0]}
    unset parts[0]
    
    # 如果没有更多键,则退出循环
    if [ ${#parts[@]} -eq 0 ]; then
        break
    fi
    
    # 将键列表转换为适合UNLINK命令使用的格式
    # key_list=$(printf ' "%s"' "${parts[@]}")
    # key_list="${key_list:1}"  # 去掉第一个多余的空格
    
    # 删除这批键
    # if ! $redis_cli UNLINK $key_list; then
    #    echo "Failed to delete keys, exiting..."
    #    exit 1
    # fi

    # 逐个删除键
    for key in "${parts[@]}"; do
        if ! $redis_cli UNLINK "$key"; then
            echo "Failed to delete key: $key, exiting..."
            exit 1
        fi
    done

    echo "Deleted a batch of keys, new cursor is $cursor"
    
    # 可选:这里可以添加延迟,以便控制删除速度
    sleep 1
done

echo "All matching keys have been deleted."

有用点赞,收藏,谢谢!

相关推荐
知其然亦知其所以然19 小时前
面试官笑了:我用这套方案搞定了“2000w vs 20w”的Redis难题!
redis·后端·面试
The Sheep 202319 小时前
MicroService(Redis)
数据库·redis·c#
无心水21 小时前
【中间件:Redis】1、Redis面试核心:线程模型深度解析(6.0前后变化+工作流程)
数据库·redis·面试·redis面试·redis原理·redis线程模型·后端技术
像风一样自由20201 天前
Redis与MinIO:两大存储利器的区别与联系
数据库·redis·缓存·minio
无心水1 天前
【中间件:Redis】2、单线程Redis高并发原理:I/O多路复用+3大优化点(附多线程对比)
redis·中间件·php·后端面试·i/o多路复用·redis原理·redis高并发
无心水1 天前
【中间件:Redis】4、Redis缓存实战:穿透/击穿/雪崩的5种解决方案(附代码实现)
redis·缓存·中间件·缓存穿透·缓存雪崩·分布式缓存·redis缓存问题
爱吃烤鸡翅的酸菜鱼1 天前
【Java】基于策略模式 + 工厂模式多设计模式下:重构租房系统核心之城市房源列表缓存与高性能筛选
java·redis·后端·缓存·设计模式·重构·策略模式
pipip.1 天前
Redis vs MongoDB:内存字典与文档库对决
数据库·redis·缓存
2401_837088502 天前
解释 StringRedisTemplate 类和对象的作用与关系
redis
陈果然DeepVersion2 天前
Java大厂面试真题:从Spring Boot到AI微服务的三轮技术拷问(一)
java·spring boot·redis·微服务·kafka·面试题·oauth2