Redis 备忘
集群按 pattern 批量删 key
危险:生产慎用;先 dry-run 打印再删;SCAN + 限速,避免阻塞。
#!/bin/bash
# usage: ./redis-cluster-del.sh 'prefix:*'
REDIS_CLI=${REDIS_CLI:-redis-cli}
PATTERN=$1
MASTER_HOST=${MASTER_HOST:-127.0.0.1}
MASTER_PORT=${MASTER_PORT:-7000}
PASSWORD=${PASSWORD:-}
if [ -z "$PATTERN" ]; then
echo "usage: $0 <pattern>"
exit 1
fi
AUTH=()
[ -n "$PASSWORD" ] && AUTH=(-a "$PASSWORD")
echo "1. list master nodes"
HOST_PORTS=$("$REDIS_CLI" -c -h "$MASTER_HOST" -p "$MASTER_PORT" "${AUTH[@]}" \
cluster nodes | grep master | awk '{print $2}' | awk -F@ '{print $1}')
echo "2. scan & del pattern=$PATTERN"
for node in $HOST_PORTS; do
ip=${node%%:*}
port=${node##*:}
echo "node $ip:$port"
# 简化:单次 SCAN;量大应循环 cursor 直至 0
keys=$("$REDIS_CLI" -h "$ip" -p "$port" "${AUTH[@]}" \
scan 0 match "$PATTERN" count 6000 | awk 'NR>1')
for key in $keys; do
echo "DEL $key"
"$REDIS_CLI" -c -h "$ip" -p "$port" "${AUTH[@]}" del "$key"
sleep 0.05
done
done
echo "done"
原笔记里的内网地址与密码已去掉,用环境变量注入。
布隆过滤器(Bloom Filter)
解决什么
在可接受误判的前提下,用极少空间判断「元素是否可能存在」。
- 结构:位数组 + 多个哈希
- 判定为不存在 → 一定不存在
- 判定为存在 → 可能误判(假阳性)
- 标准实现通常只增不删(删除会引入假阴性,除非 Counting Bloom 等变体)
常见场景
| 场景 | 作用 |
|---|---|
| 缓存穿透 | 拦截肯定不存在的查询,少打 DB |
| 爬虫 URL 去重 | 省内存地跳过已见链接 |
| 黑名单初筛 | 先滤一层再查精确结构 |
使用注意
- 容量与误判率在初始化时定好,避免频繁扩容
- 元素远超设计容量时,应重建并重放历史元素
- 需要删除或强一致时,不要单靠布隆,配合真实存储