您的当前位置:首页SpringRedisTemplate实现scan操作

SpringRedisTemplate实现scan操作

来源:爱问旅游网
SpringRedisTemplate实现scan操作

⽼⽣常谈,keys不安全,因为

keys的操作会导致数据库暂时被锁住,其他的请求都会被堵塞;业务量⼤的时候会出问题

Spring RedisTemplate实现scan

1. hscan sscan zscan

例⼦中的\"field\"是值redis的key,即从key为\"field\"中的hash中查找

redisTemplate的opsForHash,opsForSet,opsForZSet 可以 分别对应 sscan、hscan、zscan

也可以使⽤ (JedisCommands) connection.getNativeConnection() 的 hscan、sscan、zscan ⽅法实现cursor遍历,参照下⽂2.2章节

try {

Cursor> cursor = redisTemplate.opsForHash().scan(\"field\", ScanOptions.scanOptions().match(\"*\").count(1000).build()); while (cursor.hasNext()) {

Map.Entry entry = cursor.next(); Object key = entry.getKey();

Object valueSet = entry.getValue(); }

//关闭cursor cursor.close();

} catch (IOException e) { e.printStackTrace();}

cursor.close(); 游标⼀定要关闭,不然连接会⼀直增长;可以使⽤client lists info clients info stats 命令查看客户端连接状态,会发现scan操作⼀直存在我们平时使⽤的redisTemplate.execute 是会主动释放连接的,可以查看源码确认

代码虽然只是调⽤⼀次scan⽅法,但是spring-data-redis已经对scan做了封装,这个scan结合cursor.hasNext会多次redis scan,最终拿到所有match的结果

2. scan

2.1 使⽤spring-data-redis封装好的scan⽅法 public Set scan(String matchKey) {

Set keys = redisTemplate.execute((RedisCallback>) connection -> { Set keysTmp = new HashSet<>();

Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()

                            .match(\"*\" + matchKey + \"*\").count(1000).build()); while (cursor.hasNext()) {

keysTmp.add(new String(cursor.next())); }

return keysTmp; });

return keys; }

  项⽬中我⽤的就是这种⽅法来代替

Set keys = redisTemplate.keys(uploadTag + entity.getCaseNo() + \":*\");

  

因篇幅问题不能全部显示,请点此查看更多更全内容