redis批量删除大量key脚本

305次阅读
没有评论

共计 903 个字符,预计需要花费 3 分钟才能阅读完成。

redis 批量删除大量 key 脚本

因为 redis 没有设置过期时间导致 redis 内存满了,key 的数量超过几千万,

如果使用 shell 脚本 xargs -I {} 传递删除的话会导致

高并发连接 :每个键会建立一个新的 Redis 连接,多个连接会同时存在,可能造成连接数爆炸式增长。

系统开销 :不断创建新的进程和连接会给系统带来大量的开销,增加 Redis 和系统的负担。

使用这个方式直接导致系统链接数达到几十万,是非常危险的操作。

解决办法是使用 lua 脚本批量删除,因为 Lua 脚本可以一次性获取匹配的键并删除,减少多个客户端连接带来的开销。

下面是删除脚本,当然你有更好的办法也可以使用其他方法,我是在停业务的情况下操作的。

脚本屏蔽了当输入为空时删除所有 key 的操作,还有是否包含 * 的字符因为这些都会导致删除所有 key((建议操作前备份))

#!/bin/bash

# 检查是否传递了模式参数
if [ $# -ne 1 ]; then
    echo "Usage: $0 <pattern>"
    exit 1
fi

PATTERN=$1

# 检查模式是否为空
if [ -z "$PATTERN" ]; then
    echo "Error: No pattern provided."
    exit 1
fi

# 检查模式是否包含 *
if [[ $PATTERN == *\** ]]; then
    echo "Error: Pattern should not contain'*'"
    exit 1
fi

# 执行 Redis Lua 脚本以删除匹配的键
redis-cli -h 127.0.0.1 EVAL "local cursor ='0'
repeat
    local result = redis.call('SCAN', cursor, 'MATCH', '$PATTERN*', 'COUNT', 1000)
    cursor = result[1]
    local keys = result[2]
    if #keys > 0 then
        redis.call('DEL', unpack(keys))
    end
until cursor == '0'
return true
" 0

然后执行

chmod +x del-redis-key.sh
bash del-redis-key.sh abcdefd

这样就会删除 abcdefd* 匹配到的所有 key

正文完
 0
yx
版权声明:本站原创文章,由 yx 于2024-09-11发表,共计903字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码