theme: mk-cute
方案一:keys *
keys的模糊匹配功能很方便也很强大,但是在生产环境需要慎用!
开发中使用keys的模糊匹配却发现redis的CPU使用率极高,所以公司的redis生产环境将keys命令禁用了!redis是单线程,会被堵塞
方案二:scan
SCAN 命令是一个基于游标的迭代器,SCAN命令每次被调用之后,都会向用户返回一个新的游标,用户在下次选代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的选代过程。
代码实现
scan方法
/** * 扫描主键,建议使用 * @param patten * @return */ public Set<String> scan(String patten){ Set<String> keys = stringRedisTemplate.execute((RedisCallback<Set<String>>) connection -> { Set<String> result = new HashSet<>(); try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder() .match(patten).count(10000).build())) { while (cursor.hasNext()) { result.add(new String(cursor.next())); } } catch (IOException e) { e.printStackTrace(); } return result; }); return keys; }
使用
匹配“future_*”开头的所有key @Test public void keys(){ Set<String> scan = cacheService.scan("future_*"); System.out.println(scan); }