redis中根据通配符删除key
2023-12-27 12:41:41
redis中根据通配符删除key
- 我们是不是在redis中keys user:*可以获取所有key,但是 del user:*却不行
- 这里我提供的命令主要是SCAN
- SCAN 0 MATCH user:* COUNT 100
- 使用lua保证原子性
SCAN参数描述
- 在示例中,COUNT 被设置为 100。这是一个防止一次性获取大量数据而导致性能问题的一种策略。
- 如果你的键数量可能很大,你可以根据实际情况适当调整 COUNT 的值。如果你希望一次性获取所有匹配的键,可以将 COUNT 设置为一个足够大的值,或者不指定 COUNT 参数,让 Redis 返回所有匹配的键。
- COUNT 参数并不是用来限制返回结果的数量的,是控制每次迭代返回的元素数量
- 请注意,使用较大的 COUNT 值可能会导致 SCAN 命令返回的响应时间增加,具体的选择需要根据你的实际场景和性能需求来调整。
SCAN返回参数
- 第一个元素是一个整数,表示下一次调用 SCAN 命令时应该使用的新游标。如果游标为 0,则表示遍历完成。
- 第二个元素是一个数组,包含了匹配模式的键。这个数组的长度可以小于等于 COUNT 参数指定的数量。
这是我的lua脚本
-- Lua脚本:根据通配符删除键
-- KEYS[1]: 匹配的键的通配符
local keyPattern = KEYS[1]
local cursor = 0
local keys = {}
repeat
local result = redis.call("SCAN", cursor, "MATCH", keyPattern, "COUNT", 100)
cursor = tonumber(result[1])
local replyKeys = result[2]
for _, key in ipairs(replyKeys) do
table.insert(keys, key)
end
until cursor == 0
-- 逐个删除键
for _, key in ipairs(keys) do
redis.call("DEL", key)
end
使用golang实现
// 根据通配符删除
// 使用lua保证原子性
func DeleteRedisKeysByPattern(conn redis.Conn, key string) error {
// 读取Lua脚本内容
luaScript := `
local cursor = 0
local keys = {}
repeat
local result = redis.call("SCAN", cursor, "MATCH", ARGV[1], "COUNT", 100)
cursor = tonumber(result[1])
local replyKeys = result[2]
for _, key in ipairs(replyKeys) do
table.insert(keys, key)
end
until cursor == 0
-- 逐个删除键
for _, key in ipairs(keys) do
redis.call("DEL", key)
end
`
// 将Lua脚本注册到Redis连接
script := redis.NewScript(0, luaScript)
// 执行Lua脚本
_, err := script.Do(conn, key)
if err != nil {
fmt.Println("Lua脚本执行失败:", err)
return err
}
return nil
}
文章来源:https://blog.csdn.net/qq_39272466/article/details/135239227
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!