一聚教程网:一个值得你收藏的教程网站

热门教程

如何在Spring Boot中批量删除Redis缓存_采用RedisTemplate的delete(Collection)方法

时间:2026-07-12 09:37:58 编辑:袖梨 来源:一聚教程网

RedisTemplate.delete(Collection)仅批量删除显式传入的key,不支持通配符;keys()返回空多因keySerializer未设为StringRedisSerializer,需统一序列化方式并慎用KEYS,生产环境推荐SCAN分批处理。

redisTemplate.delete(Collection) 能批量删 key,但不是万能的——它只删你明确传进去的 key 列表,不支持通配符、不触发 FLUSHALL、也不自动查键。用错场景或配置不当,会删不掉、删得慢、甚至 OOM。

redisTemplate.keys(pattern) 返回空?先检查序列化器

常见现象:调用 redisTemplate.keys("user:*") 总是返回空集合,但确认 Redis 里确实有 user:1user:2 这些 key。

  • 根本原因:默认 RedisTemplatekeySerializerJdkSerializationRedisSerializer,它会对 key 做 Java 序列化(比如加上 xacxedx00x05 前缀),导致 KEYS 命令在服务端匹配不到原始字符串
  • 解决办法:显式设置 StringRedisSerializer 为 key 序列化器,尤其当你用字符串做 key 时
  • 示例配置片段:
@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {    RedisTemplate<String, Object> template = new RedisTemplate<>();    template.setConnectionFactory(factory);    template.setKeySerializer(new StringRedisSerializer());    template.setHashKeySerializer(new StringRedisSerializer());    // 其他序列化器按需设置...    return template;}

不改这个,keys("user:*") 永远查不到你存进去的字符串 key。

批量删前缀 key 的正确链路:keys + delete 分两步走

Spring Data Redis 没有内置“删所有匹配前缀的 key”的原子方法,必须手动组合 keys()delete(Collection)

  • redisTemplate.keys("order:*") 返回的是 Set<String>,不是 List,可直接传给 delete()
  • 但注意:KEYS 是阻塞命令,在大实例上慎用;生产环境建议改用 SCAN + 分批处理(需手写逻辑,RedisTemplate 不封装 SCAN)
  • 简单安全的写法示例:
public void deleteByPrefix(String prefix) {    Set<String> keys = redisTemplate.keys(prefix + "*");    if (keys != null && !keys.isEmpty()) {        redisTemplate.delete(keys); // 传入 Set,内部转成 pipeline 批量发 DEL    }}

别把 keys 结果存 List 再转 Set,多一次遍历没意义;也别对空集合调 delete(),虽然不报错但浪费一次 Redis 往返。

delete(Collection) 的实际行为和限制

这个方法表面是“批量删”,底层其实是把集合里每个 key 包进一个 DEL 命令,通过 pipeline 发送——不是单条 DEL,也不是 FLUSHDB

  • 传入 null 或空集合:静默跳过,不抛异常
  • 传入不存在的 key:Redis 自动忽略,不影响其他 key 删除
  • 传入 10 万个 key:可能触发 Redis 的 client-output-buffer-limit 限制,或客户端内存飙升(所有 key 都加载到 JVM 堆里)
  • 性能临界点:实测在千级 key 内很稳;超 5k 建议分批(如每 500 个一批),避免单次请求过大

别试图传 "*"delete()——它不会展开通配符,只会去删一个叫 "*" 的 key(几乎不存在)。

StringRedisTemplate vs RedisTemplate:选哪个删字符串 key?

如果你的 key 全是字符串(如 "user:1001"),优先用 StringRedisTemplate

  • StringRedisTemplate 默认就是 StringRedisSerializer,省去手动配置序列化器的麻烦
  • redisTemplate.keys()stringRedisTemplate.keys() 行为一致,但前者容易因序列化器错配失效
  • 两者 delete(Collection) 方法签名和逻辑完全相同,只是泛型约束不同
  • 混用风险:如果缓存写入用 RedisTemplate(JDK 序列化),删除用 StringRedisTemplate(字符串序列化),keys() 查不到,delete() 也删不掉

真正关键的不是模板类名,而是 key 序列化方式是否统一。删之前,先确认你写入时用的是哪种序列化器。

热门栏目