【Redis】根据key模糊匹配批量删除

首先有一个业务场景是使用用户唯一标识作为key的前缀比如:

userId:token:xxxxxxxxx 或者userId:xxxxx:xxxxx 这种缓存的数据虽然有过期时间但是如果需要要在业务场景中需要批量删除而且Redis库中的数据很多、然后以userId为前缀的key又很多的话就需要批量删除,但是需要考虑原子性,那就又要用到Lua脚本了。废话不多说直接上代码

java 复制代码
    // 首先要注入起一个另外的名字  构造参数注入方式
    private final RedisTemplate<String, String> luaRedisTemplate;


    /**
     * 根据key模糊匹配删除缓存
     *
     * @param pattern key前缀
     */
    public void deleteByPatternLua(String pattern) {
        try {
            log.info("开始删除匹配模式的键: {}", pattern);
            String luaScript = "local pattern = ARGV[1]\n"
                    + "local cursor = '0'\n"
                    + "local deleted = 0\n"
                    + "local loop_count = 0\n"
                    + "repeat\n"
                    + "    loop_count = loop_count + 1\n"
                    + "    local result = redis.call('SCAN', cursor, 'MATCH', pattern, 'COUNT', 1000)\n"
                    + "    cursor = result[1]\n"
                    + "    local keys = result[2]\n"
                    + "    if #keys > 0 then\n"
                    + "        local del_result = redis.call('DEL', unpack(keys))\n"
                    + "        deleted = deleted + del_result\n"
                    + "    end\n"
                    + "    if loop_count > 1000 then break end\n"
                    + "until cursor == '0'\n"
                    + "return deleted";

            DefaultRedisScript<Long> script = new DefaultRedisScript<>();
            script.setScriptText(luaScript);
            script.setResultType(Long.class);

            // 使用luaRedisTemplate执行Lua脚本否则无法删除
            Long result = luaRedisTemplate.execute(script, Collections.emptyList(), pattern);
            log.info("删除匹配模式 {} 的键完成,实际删除数量: {}", pattern, result);
        } catch (Exception e) {
            log.error("通过key前缀删除键失败,pattern: {}", pattern, e);
            throw new I18nServiceException(INTERNAL_SERVER_ERROR);
        }
    }
相关推荐
啊吧怪不啊吧2 小时前
从单主机到多主机——分布式系统的不断推进
网络·数据库·redis·分布式·架构
予枫的编程笔记13 小时前
Redis 核心数据结构深度解密:从基础命令到源码架构
java·数据结构·数据库·redis·缓存·架构
CodeAmaz14 小时前
一致性哈希与Redis哈希槽详解
redis·算法·哈希算法
一条大祥脚16 小时前
25.12.30
数据库·redis·缓存
程可爱17 小时前
详解Redis消息队列的三种实现方案
redis
源代码•宸20 小时前
goframe框架签到系统项目开发(每日签到添加积分和积分记录、获取当月最大连续签到天数、发放连续签到奖励积分、实现签到日历详情接口)
数据库·经验分享·redis·中间件·golang·dao·goframe
斯普信云原生组20 小时前
Linux 平台 Redis Insight 安装卸载与常见问题
linux·运维·redis
小画家~21 小时前
第四十三:redis 查找所有KEY应用方法
数据库·redis·bootstrap
攻心的子乐21 小时前
redis 使用Pipelined 管道命令批量操作 减少网络操作次数
数据库·redis·缓存