共计 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
正文完
发表至: 运维
2024-09-11