【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);
        }
    }
相关推荐
天疆说11 小时前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
嘟嘟071712 小时前
Next.js 博客左侧笔记列表是怎么从 Redis 渲染出来的?从组件、children 到动态路由一次讲清
redis·react.js·前端工程化
Rain的Java大神之路14 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Amir_zy17 小时前
Redis测试方法全攻略:冒烟、压测与稳定性验证
redis·压力测试
霸道流氓气质18 小时前
RedLock:Redis 分布式锁的高可用方案
数据库·redis·分布式
breeze jiang19 小时前
Next.js App Router 父子组件 RSC 拆分实战:从 Redis Hash 到客户端交互的最小化边界
javascript·redis·哈希算法
晚染烟1 天前
每日八股day17
redis
xqqxqxxq2 天前
Redis 五大常用数据类型 + 通用命令笔记
数据库·redis·笔记
LCG元2 天前
ESP32-IDF 远程固件升级实战:HTTPS OTA + 双分区切换 + 自动回滚
数据库·redis·https
MC皮蛋侠客2 天前
Redis 系列(十一):高可用(二)——Redis Cluster 集群
数据库·redis·bootstrap