依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 6|回复: 0

redis根据关键字删除key,sms:code:13812345678 如何删除sms这个下面所有的数据

[复制链接] 主动推送

2万

主题

2万

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
23344
发表于 1 小时前 | 显示全部楼层 |阅读模式
redis根据关键字删除key,sms:code:13812345678 如何删除sms这个下面所有的数据
先说结论:可以按 key 前缀匹配,然后批量 `DEL`,但要注意不要在生产环境直接用 `KEYS`,用扫描(SCAN)更安全。

你这里的例子是 `sms:code:13812345678`,如果想删除 `sms:` 下面所有数据(所有以 `sms:` 开头的 key):

**1. Redis 命令行写法(演示用)**

```bash
redis-cli --scan --pattern "sms:*" | xargs redis-cli del
```

或单机少量数据时临时用:

```bash
redis-cli KEYS "sms:*" | xargs redis-cli DEL
```

**2. 在 Spring Boot 中用 `StringRedisTemplate` 删除前缀为 `sms:` 的所有 key**

简单版本(keys + delete,适合 key 数量不大的情况):

```java
@Autowired
private StringRedisTemplate redisTemplate;

public void deleteAllSmsKeys() {
    Set<String> keys = redisTemplate.keys("sms:*");
    if (keys != null && !keys.isEmpty()) {
        redisTemplate.delete(keys);
    }
}
```

如果你只想删 `sms:code:` 这一类(保留别的 `sms:xxx`),把模式改成:

```java
Set<String> keys = redisTemplate.keys("sms:code:*");
```

**3. 扩展:只删除某个手机号的验证码**

- 单个手机号(你已有逻辑):  
  `String codeKey = "sms:code:" + phone; redisTemplate.delete(codeKey);`
- 某段号段:`sms:code:138*` → `redisTemplate.keys("sms:code:138*")` 再批删。




如果 key 数量很多,就不能再用一次性 `keys("sms:*")` 了,要换成**游标扫描 SCAN + 分批删除**,避免卡死 Redis。

**思路**

- 使用 `SCAN` 命令按游标批量遍历匹配 `sms:*` 的 key。
- 每批拿到一部分 key(比如 500 或 1000 个),调用 `delete` 删除。
- 循环直到游标回到 0。

**Spring Boot 代码示例(大数据量安全方式)**

可以写一个工具方法,例如放在某个服务类里:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class RedisBatchDeleteService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 使用 SCAN 按前缀批量删除,适合大量 key
     */
    public void deleteByPrefix(String prefix) {
        ScanOptions options = ScanOptions.scanOptions()
                .match(prefix + "*")
                .count(1000)   // 每批最多返回多少个 key,可根据情况调
                .build();

        try (Cursor<byte[]> cursor = (Cursor<byte[]>) redisTemplate.execute((connection) ->
                connection.scan(options))) {

            List<String> buffer = new ArrayList<>();
            while (cursor != null && cursor.hasNext()) {
                String key = new String(cursor.next());
                buffer.add(key);

                // 批量删除,避免一次性 delete 太多
                if (buffer.size() >= 1000) {
                    redisTemplate.delete(buffer);
                    buffer.clear();
                }
            }

            // 删除最后一批
            if (!buffer.isEmpty()) {
                redisTemplate.delete(buffer);
            }
        } catch (Exception e) {
            // 这里可以加日志
            e.printStackTrace();
        }
    }
}
```

使用方式示例:

- 删除所有 `sms:` 开头:

  ```java
  redisBatchDeleteService.deleteByPrefix("sms:");
  ```

- 只删验证码相关:`sms:code:*`:

  ```java
  redisBatchDeleteService.deleteByPrefix("sms:code:");
  ```

**说明**

- 这种写法本质上是 `SCAN`,不会像 `KEYS` 一样阻塞 Redis,很适合 key 较多的情况。
- `count(1000)` 是 hint,不是严格数量,可以按自己场景调大/调小。
- 如果你只是偶尔在运维脚本里清理,命令行也可以用类似:

  ```bash
  redis-cli --scan --pattern "sms:*" | xargs -r -n 1000 redis-cli del
  ```





相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-11-21 11:16

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表