|
|
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
```
|
|