SpringBoot中使用Redis的keys替代方案scan
众所周知redis的keys命 在测试环境这样开发没有问题, 由于项目对redis依赖比较大, 就网上找了一些关于redis的keys命令, 得知keys命令执行的时候会严重阻塞线上其它命令的正常请求, 于是做了以下替代方案
前同事留下的坑 优化redis时候记录下,也可以代码循环手动删除对应的key
/** * 获取指定前缀的一系列key * 使用scan命令代替keys, Redis是单线程处理,keys命令在KEY数量较多时, * 操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求 * @param keyPrefix * @return */ public Set<String> keys(String keyPrefix) { String realKey = "*" + keyPrefix + "*"; try { return redisTemplate.execute((RedisCallback<Set<String>>) connection -> { Set<String> binaryKeys = new HashSet<>(); Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build()); while (cursor.hasNext()) { binaryKeys.add(new String(cursor.next())); } return binaryKeys; }); } catch (Throwable e) { e.printStackTrace(); } return null; } /** * 删除指定前缀的一系列key * @param keyPrefix */ public void removeAll(String keyPrefix) { try { Set<String> keys = keys(keyPrefix); redisTemplate.delete(keys); } catch (Throwable e) { e.printStackTrace(); } }
生成环境不可直接用!!! 错误用法
Set<String> keys = redisUtil.keys(accessTokenKey + ":*");
redisUtil.del(keys);
早年同窗始相知,三载瞬逝情却萌。年少不知愁滋味,犹读红豆生南国。别离方知相思苦,心田红豆根以生。
分类:
【redis】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
2017-02-09 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
2017-02-09 Cannot refer to the non-final local variable user defined in an enclosing scope 内部类定义在方法内,方法定义的参数(形参)无法被内部类直接访问,需要用final定义