redis通过key模糊删除,批量删除,批量查询,批量GET,批量设置相关数据

博客围绕Redis展开,讲述了使用redis - redisTemplate进行模糊匹配删除的经历,起初尝试失败,后经测试修改可用。还介绍了Redis模糊查询,允许使用*、?、[]通配符,以及批量查询、单个查询、批量设置或查询、批量设置Set的方法。

redis-redisTemplate模糊匹配删除

前几天需要一个模糊删除redis中key的功能, 没有多想,  直接

String key = "noteUserListenedPoi:*";
redisTemplate.delete(key);
LOGGER.info("redis中用户收听历史被清空");

结果发现不行, 

后来测试发现模糊查询是可以用的, 找了下资料, 改成

Set<String> keys = redisTemplate.keys("noteUserListenedPoi:" + "*");
redisTemplate.delete(keys);
LOGGER.info("{}, redis中用户收听历史被清空"

可以用了

 

Redis模糊查询

可以通过Redis中keys命令进行获取key值,具体命令格式:keys pattern

文中提到redis中允许模糊查询的有3个通配符,分别是:*,?,[]

其中:

*:通配任意多个字符

?:通配单个字符

[]:通配括号内的某一个字符

public Set keys(String pattern){
return stringRedisTemplate.keys("*" + pattern + "*");
   // return stringRedisTemplate.keys("?" + pattern);
// return stringRedisTemplate.keys("[" + pattern + "]");
}

批量查询

Set<String> keysList = stringRedisTemplate.keys(keys);
List<String> strings = stringRedisTemplate.opsForValue().multiGet(keysList);

 

单个

redisTemplate.opsForValue().set(keys+1,"this is a test content!",1000,TimeUnit.SECONDS);
String content=redisTemplate.opsForValue().get(keys+1).toString();
System.out.println("---------》获取到缓存的内容为:"+content);
redisTemplate.delete(redisTemplate.keys(keys+"*"));
Object msg=redisTemplate.opsForValue().get(keys+1);

 

批量设置或者查询

1、利用mGet

List<String> keys = new ArrayList<>();
//初始keys
List<YourObject> list = this.redisTemplate.opsForValue().multiGet(keys);

2、利用PipeLine

public void getBatch(List<String> keys, long expireTime) {
        //使用pipeline方式
        redisTemplate.executePipelined(new RedisCallback<List<Object>>() {
            @Override
            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
                keys.forEach(e -> {
                    connection.get(redisTemplate.getKeySerializer().serialize(e))
                });
               
                return null;
            }
        });
 
 
    }

其实2者底层都是用到execute方法,multiGet在使用连接是没用到pipeline,一条命令直接传给Redis,Redis返回结果。而executePipelined实际上一条或多条命令,但是共用一个连接。

还有一点,就是查询返回的结果,和键的顺序是一一对应的,如果没查到,会返回null值。

 

批量设置Set 

1、利用mSet

Map<String,String> map= new HashMap<>();
 
this.redisTemplate.opsForValue().multiSet(map);
 

2、利用PipeLine

public void setBatch(Map<String, Map> map, long expireTime) {
        //使用pipeline方式
        redisTemplate.executePipelined(new RedisCallback<List<Object>>() {
            @Override
            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
                map.forEach((key, value) -> {
                    if (expireTime > 0) {
                        connection.setEx(redisTemplate.getKeySerializer().serialize(key), expireTime, redisTemplate.getValueSerializer().serialize(value));
                    } else {
                        connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value));
                    }
 
                });
                return null;
            }
        });
 
 
    }

 

<think> 我们注意到用户的问题是关于如何使用`redis-key -s`进行模糊查询。然而,根据Redis官方文档和常见用法,`redis-key -s`并不是Redis的标准命令。Redis中用于模糊查询键的命令是`KEYS`或`SCAN`。因此,我们需要澄清这一点,并提供正确的模糊查询方法。 用户可能混淆了`redis-key`(可能是一个自定义脚本或工具)和Redis原生命令。但根据引用[3]中提到的`keys 'user*'`,我们可以确定在Redis中模糊查询键的标准方法是使用`KEYS`模式或`SCAN`命令。 因此,我们将解释如何使用`KEYS`和`SCAN`进行模糊查询,并强调生产环境中推荐使用`SCAN`以避免阻塞。 步骤: 1. 连接Redis服务器(参考之前的方法)。 2. 选择数据库(如果需要)。 3. 使用`KEYS`命令(注意:不要在正式环境中使用)或`SCAN`命令(推荐)进行模糊查询。 详细说明: - `KEYS pattern`:返回所有匹配给定模式的键。例如,`KEYS user*`返回所有以"user"开头的键。但该命令会遍历整个键空间,在数据量大的情况下会阻塞服务器,因此不建议在生产环境中使用[^3]。 - `SCAN cursor [MATCH pattern] [COUNT count]`:增量迭代键空间,可以安全地用于生产环境。它每次返回一部分键和一个新的游标,直到游标为0表示迭代结束。 示例: ```bash # 使用KEYS(仅用于测试或数据量小的情况) KEYS user* # 使用SCAN(推荐) SCAN 0 MATCH user* COUNT 10 # 从游标0开始,匹配user*,每次返回最多10个键 ``` 另外,如果用户提到的`redis-key -s`是指某个特定工具(如某些Redis管理工具中的命令),则可能需要查看该工具的文档。但根据标准Redis命令行工具(redis-cli),并没有`redis-key -s`这个子命令。 因此,我们将重点放在redis-cli的标准命令上。 同时,根据引用[3],我们还可以看到使用`keys`命令配合`xargs`进行批量删除的示例,这同样适用于模糊查询(先查询再操作)。 如果用户需要批量获取匹配键的值,可以使用以下方法(结合SCAN和管道): ```bash # 使用redis-cli和SCAN命令迭代,然后获取每个键的值 # 注意:这个命令比较复杂,通常需要编写脚本处理多个批次 # 以下是一个示例,使用bash循环(效率较低,适用于小批量数据) for key in $(redis-cli --scan --pattern "user*"); do echo "Key: $key, Value: $(redis-cli GET $key)" done ``` 或者使用更高效的方式(使用管道一次获取多个值): ```bash # 一次性获取所有匹配的键,然后使用MGET获取值(注意:MGET只能用于字符串类型) # 但要注意,如果键非常多,可能会阻塞,所以不推荐在正式环境中使用大量键的MGET keys=$(redis-cli --scan --pattern "user*") if [ -n "$keys" ]; then redis-cli MGET $keys fi ``` 但是,上述方法仍然可能因为键的数量过多而影响性能。更好的方法是使用SCAN迭代,并分批获取值(例如每次迭代100个键,然后用MGET获取这些键的值)。 最后,我们还需要提到,在redis-cli中,可以直接使用`--scan`和`--pattern`参数来模拟`SCAN`命令的迭代,而不需要手动处理游标。例如: ```bash redis-cli --scan --pattern "user*" ``` 这个命令会以非阻塞的方式逐步输出所有匹配的键。 总结回答结构: 1. 澄清`redis-key -s`不是标准命令,并介绍正确的模糊查询方法。 2. 解释`KEYS`和`SCAN`的区别,强调生产环境中使用`SCAN`。 3. 提供使用`KEYS`进行模糊查询的示例(仅用于测试)。 4. 提供使用`SCAN`进行模糊查询的示例(推荐)。 5. 提供批量获取匹配键值的示例(注意性能问题)。 同时,根据用户引用[3]中的内容,我们可以指出使用`keys`命令配合其他命令(如删除)的用法,但查询类似。 相关问题: 1. 如何安全地删除Redis中匹配特定模式的键? 2. 除了模糊查询键,Redis还支持哪些数据查询方式? 3. 在Python中如何使用Redis进行模糊查询? </think> 以下是使用 Redis 进行键名模糊查询的详细方法(标准 Redis 命令中不存在 `redis-key -s` 语法,实际需使用 `KEYS` 或 `SCAN` 命令): ### 🔍 正确实现键名模糊查询的方法 #### 1. **使用 `KEYS` 命令(适合测试环境)** ```bash # 连接 Redis 后执行(示例:查询以 "user:" 开头的键) KEYS "user:*" # 输出示例 1) "user:1001" 2) "user:1002" 3) "user:profile:1003" ``` ⚠️ **注意**: `KEYS` 命令会**阻塞整个 Redis 服务**直到查询完成,在正式环境可能导致服务不可用[^3]。 #### 2. **使用 `SCAN` 命令(生产环境推荐)** ```bash # 迭代查询(避免阻塞) SCAN 0 MATCH "order:*" COUNT 100 # 输出示例 1) "17" # 下次迭代的游标 2) 1) "order:2023" # 匹配的键 2) "order:2024" ``` - `COUNT 100`:每次扫描 100 个键(可调整) - 游标为 `0` 时表示迭代结束 - 支持的模式符: - `*`:匹配任意字符(如 `product:*`) - `?`:匹配单个字符(如 `user:?`) - `[abc]`:匹配指定字符(如 `id:[123]`) #### 3. 通过 redis-cli 直接扫描(非交互模式) ```bash # 批量查询并导出结果(示例:导出所有 "cache:" 开头的键) redis-cli --scan --pattern "cache:*" > keys.txt # 带中文不转义(添加 --raw) redis-cli --raw --scan --pattern "名称:*" ``` ### ⚠️ 关键注意事项 1. **性能影响** - `KEYS` 复杂度为 $O(N)$($N$ 为总键数),可能引发服务中断 - 生产环境**必须使用 `SCAN`**(增量式迭代) 2. **数据一致性** 模糊查询仅返回键名,需配合 `TYPE` + 数据类型命令获取值: ```bash TYPE user:1001 # 查看键类型 → 返回 "hash" HGETALL user:1001 # 获取哈希数据 ``` 3. **删除操作参考** 如引用[3]所示,模糊查询常配合删除操作(但需谨慎): ```bash redis-cli -n 2 --scan --pattern "temp:*" | xargs redis-cli del ``` ### 📝 查询流程示例 查询 5 号库中 `device:[区域码]:*` 的键: ```bash # 连接指定数据redis-cli -n 5 # 安全迭代查询 SCAN 0 MATCH "device:CN:*" COUNT 50 1) "23" 2) 1) "device:CN:bj-001" 2) "device:CN:sh-002" # 获取具体值(假设是字符串类型) GET "device:CN:bj-001" ``` ### 💡 总结建议 | 场景 | 命令 | 风险等级 | |---------------|------------------|----------| | 开发/测试环境 | `KEYS pattern` | ️ 高 | | 生产环境 | `SCAN + MATCH` | ✅ 低 | | 批量导出 | `--scan --pattern` | ✅ 安全 | > 当需要高频执行模糊查询时,建议在应用层维护键名索引(如用 Set 存储键名前缀),避免直接扫描全库[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值