redis中根据通配符删除key

redis中根据通配符删除key

  1. 我们是不是在redis中keys user:*可以获取所有key,但是 del user:*却不行
  2. 这里我提供的命令主要是SCAN
  3. SCAN 0 MATCH user:* COUNT 100
  4. 使用lua保证原子性

SCAN参数描述

  • 在示例中,COUNT 被设置为 100。这是一个防止一次性获取大量数据而导致性能问题的一种策略。
  • 如果你的键数量可能很大,你可以根据实际情况适当调整 COUNT 的值。如果你希望一次性获取所有匹配的键,可以将 COUNT 设置为一个足够大的值,或者不指定 COUNT 参数,让 Redis 返回所有匹配的键。
  • COUNT 参数并不是用来限制返回结果的数量的,是控制每次迭代返回的元素数量
  • 请注意,使用较大的 COUNT 值可能会导致 SCAN 命令返回的响应时间增加,具体的选择需要根据你的实际场景和性能需求来调整。

SCAN返回参数

  • 第一个元素是一个整数,表示下一次调用 SCAN 命令时应该使用的新游标 。如果游标为 0,则表示遍历完成。
  • 第二个元素是一个数组,包含了匹配模式的键。这个数组的长度可以小于等于 COUNT 参数指定的数量。

这是我的lua脚本

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实现

go 复制代码
// 根据通配符删除
// 使用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
}


相关推荐
武子康11 小时前
Java-155 MongoDB Spring Boot 连接实战 | Template vs Repository(含索引与常见坑)
java·数据库·spring boot·后端·mongodb·系统架构·nosql
武子康11 小时前
Java-157 MongoDB 存储引擎 WiredTiger vs InMemory:何时用、怎么配、如何验证 mongod.conf
java·数据库·sql·mongodb·性能优化·系统架构·nosql
野犬寒鸦12 小时前
从零起步学习MySQL || 第八章:索引深入理解及高级运用(结合常见优化问题讲解)
java·服务器·数据库·后端·mysql
奥尔特星云大使12 小时前
Docker 拉取 MySQL 5.7 镜像、启动容器并进入 MySQL
数据库·mysql·docker·容器
低音钢琴13 小时前
【从零开始构建性能测试体系-08】如何诊断性能瓶颈:从服务器到数据库的全方位分析
服务器·数据库·php
蜡笔小炘14 小时前
SQL sever数据库--第三次作业
数据库·sql·oracle
xuejianxinokok14 小时前
io_uring 快吗? Postgres 17 与 18 的基准测试
数据库·后端·postgresql
PieroPc14 小时前
用Python Streamlit Sqlite3 写一个简单商品管理系统
数据库·python·sqlite·streamlit
GOATLong14 小时前
MySQL内置函数
android·数据库·c++·vscode·mysql