redis 遍历键

mac2022-06-30  24


redis 遍历键

 

如果键的数量很多,keys遍历会造成后续命令阻塞,可使用scan命令遍历键,详见 redis 概述

 

 

********************

相关类与接口

 

RedisCallback:扫描调用的回调接口

public interface RedisCallback<T> { @Nullable T doInRedis(RedisConnection var1) throws DataAccessException; } ************************** RedisConnection public interface RedisConnection extends RedisCommands { ************************* RedisCommands public interface RedisCommands extends RedisKeyCommands, RedisStringCommands, RedisListCommands, RedisSetCommands, RedisZSetCommands, RedisHashCommands, RedisTxCommands, RedisPubSubCommands, RedisConnectionCommands, RedisServerCommands, RedisScriptingCommands, RedisGeoCommands, RedisHyperLogLogCommands { @Nullable Object execute(String var1, byte[]... var2); } ********************** RedisKeyCommands public interface RedisKeyCommands { Cursor<byte[]> scan(ScanOptions var1); //调用该方法执行键的扫描操作 。。。。 }

 

ScanOptions:设置扫描返回数量、扫描通配符

public class ScanOptions { public static ScanOptions NONE = new ScanOptions((Long)null, (String)null); @Nullable private final Long count; //每次最多返回的数量 @Nullable private final String pattern; //通配符模式 private ScanOptions(@Nullable Long count, @Nullable String pattern) { this.count = count; this.pattern = pattern; } public static ScanOptions.ScanOptionsBuilder scanOptions() { return new ScanOptions.ScanOptionsBuilder(); }//返回扫描条件构造器 public Long getCount() { public String getPattern() { public String toOptionString() { ************************** 内部类 public static class ScanOptionsBuilder { @Nullable private Long count; @Nullable private String pattern; public ScanOptionsBuilder() { } public ScanOptions.ScanOptionsBuilder count(long count) { //设置每次最多返回的数量 public ScanOptions.ScanOptionsBuilder match(String pattern) { //设置通配符表达式 public ScanOptions build() { return new ScanOptions(this.count, this.pattern); } } }

 

Cursor:接收扫描结果

public interface Cursor<T> extends Iterator<T>, Closeable { long getCursorId(); boolean isClosed(); Cursor<T> open(); long getPosition(); } ********************************* public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } } ********************************* public interface Closeable extends AutoCloseable { public void close() throws IOException; }

 

 

********************

示例

 

HelloController

@RestController public class HelloController { @Autowired private StringRedisTemplate redisTemplate; @RequestMapping("/save") public String save(){ for(int i=0;i<100;i++){ redisTemplate.opsForValue().set("瓜田李下"+i,"海贼王"+i); } return "success"; } @RequestMapping("/get") public void get(){ redisTemplate.execute((RedisCallback<Object>) redisConnection -> { try{ AtomicInteger count= new AtomicInteger(); Cursor<byte[]> cursor=redisConnection.scan(ScanOptions.scanOptions().count(100).build()); while(cursor.hasNext()){ count.getAndIncrement(); byte[] bytes=cursor.next(); String s=new String(bytes); System.out.print(s+" "); if (count.get()==0){ System.out.println(); } } System.out.println(count.get()); }catch (Exception e){ e.printStackTrace(); } return null; }); } }

 

*****************

控制台输出

 

瓜田李下10 瓜田李下89 瓜田李下64 瓜田李下47 瓜田李下5 瓜田李下58 瓜田李下97 瓜田李下87 瓜田李下77 瓜田李下23 瓜田李下12 瓜田李下27 瓜田李下48 瓜田李下96 瓜田李下39 瓜田李下52 瓜田李下41 瓜田李下9 瓜田李下93 瓜田李下21 瓜田李下66 瓜田李下40 瓜田李下56 瓜田李下91 瓜田李下59 瓜田李下55 瓜田李下32 瓜田李下28 瓜田李下85 瓜田李下11 瓜田李下82 瓜田李下7 瓜田李下99 瓜田李下50 瓜田李下49 瓜田李下54 瓜田李下98 瓜田李下29 瓜田李下20 瓜田李下45 瓜田李下31 瓜田李下71 瓜田李下62 瓜田李下38 瓜田李下42 瓜田李下33 瓜田李下57 瓜田李下60 瓜田李下18 瓜田李下94 瓜田李下78 瓜田李下22 瓜田李下2 瓜田李下69 瓜田李下51 瓜田李下79 瓜田李下76 瓜田李下68 瓜田李下83 瓜田李下37 瓜田李下95 瓜田李下70 瓜田李下30 瓜田李下73 瓜田李下6 瓜田李下74 瓜田李下34 瓜田李下19 瓜田李下61 瓜田李下63 瓜田李下81 瓜田李下8 瓜田李下0 瓜田李下46 瓜田李下36 瓜田李下3 瓜田李下16 瓜田李下92 瓜田李下53 瓜田李下88 瓜田李下4 瓜田李下75 瓜田李下35 瓜田李下25 瓜田李下65 瓜田李下86 瓜田李下80 瓜田李下44 瓜田李下67 瓜田李下72 瓜田李下15 瓜田李下43 瓜田李下90 瓜田李下17 瓜田李下84 瓜田李下24 瓜田李下1 瓜田李下13 瓜田李下26 瓜田李下14 100

 

 

最新回复(0)