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 去重省内存地跳过已见链接
黑名单初筛先滤一层再查精确结构

使用注意

  1. 容量与误判率在初始化时定好,避免频繁扩容
  2. 元素远超设计容量时,应重建并重放历史元素
  3. 需要删除或强一致时,不要单靠布隆,配合真实存储