首页 > 编程知识 正文

redis 用scan 代替keyshgetAll,没有酵母粉用什么代替

时间:2023-05-06 20:21:58 阅读:178898 作者:4906

转载自: https://blog.csdn.net/w 05980598/article/details/80264568

redis中key的数量越多,keys命令执行越慢,最重要的是阻止服务器,这对于单线程的redis来说是灾难,我们终于找到了备用命令scan。

scan cursor [ match pattern ] [ count count ]

所有扫描及其关联的SSCAN、HSCAN和ZSCAN命令都用于逐步重复元素集合“a collection of elements”。

扫描命令用于重复当前数据库中的数据库键。 SSCAN命令用于重复集合键中的元素。 HSCAN命令用于重复散列密钥中的键值对。 ZSCAN命令用于迭代规则集合中的元素,包括元素成员和元素分数。 以上四个命令都支持增量迭代,每次运行时只返回少量元素,因此KEYS和SMEMBERS命令没有问题。 如果使用——keys命令处理大型数据库,或者使用SMEMBERS命令处理大型集合键,服务器可能会被阻止几秒钟或更长时间。

但是,增量小命令也不是没有缺点。 例如,可以使用SMEMBERS命令返回集合键中当前包含的所有元素,但增量迭代命令(如SCAN )可能会在增量迭代过程中更改该键,因为

由于SCAN、SSCAN、HSCAN和ZSCAN这四个命令的行为非常相似,因此本文档将一起介绍这四个命令,但请记住它们。

scan、HSCAN和ZSCAN命令的第一个参数始终是数据库密钥。 扫描命令不需要在第一个参数中指定数据库密钥——。 这是因为您重复了当前数据库中的所有数据库键。 scan 0默认返回10个数据。 127.0.0.1:6379 scan 0

1 ) 81920 )。

2 )1) CMD:1000004739:4 )。

2 ) CMD:1000010475:2 )。

3 ) CMD:380071400001208:766 )。

4 ) cmd :1000068663360列表)。

5 ) cmd :380071400001208336020415 )。

6 ) cmd :380071400001231336021530 )。

7 ) cmd :380071400001208336021780 )。

8 ) CMD:7485630165:LIST ()。

9 ) CMD:1000001545:2 )。

10 ) cmd :38007140000123133604387 )可以通过count参数指定返回数据量。 127.0.0.1:6379 scan0count 100

1 ) 104448 )。

2 )1) CMD:1000004739:4 )。

2 ) CMD:1000010475:2 )。

3 ) CMD:380071400001208:766 )。

4 ) cmd :1000068663360列表)。

5 ) cmd :380071400001208336020415 )。

6 ) cmd :380071400001231336021530 )。

7 ) cmd :380071400001208336021780 )。

8 ) CMD:7485630165:LIST ()。

9 ) CMD:1000001545:2 )。

10 ) cmd :38007140000123133604387 )。

……

94 ) CMD:201610200062:6 )。

95 ) CMD:VF3748211006:3 )。

96 ) CMD:1000009121:4 )。

97 ) cmd :38007140000123133606563 )。

98 ) CMD:1000010252:ID )。

99 ) CMD:1000005261:5 )。

100 ) SERVER:45568_0)使用match参数匹配模式: 127.0.0.133606379 scan0match cmd * count 100

1 ) 104448 )。

2 )1) CMD:1000004739:4 )。

2 ) CMD:1000010475:2 )。

3) "CMD:380071400001208:766"
    4) "CMD:1000006866:LIST"
    5) "CMD:380071400001208:20415"
    6) "CMD:380071400001231:21530"
    7) "CMD:380071400001208:21780"
    8) "CMD:7485630165:LIST"
    9) "CMD:1000001545:2"
   10) "CMD:380071400001231:4387"
   ......
   86) "CMD:201610200062:6"
   87) "CMD:VF3748211006:3"
   88) "CMD:1000009121:4"
   89) "CMD:380071400001231:6563"
   90) "CMD:1000010252:ID"
   91) "CMD:1000005261:5" 最重要的是scan不会阻塞服务器,现网环境也可以用,真方便。       官方文档:http://redisdoc.com/key/scan.html#scan     上java 代码    /** * * HSCAN 命令用于迭代哈希键中的键值对。 * @Title: getSortedSetSize * @Description: * @param key * @return * @return long * @author 2019-1-16 上午10:17:03 */ public static Map<String, String> hscan(int dbIndex,String key,int pageSize){ Map<String, String> map = new HashMap<String, String>(); Jedis jedis = null; try { jedis = getJedis(); jedis.select(dbIndex); ScanParams sp = new ScanParams(); sp.count(pageSize);//每次多少条 //可以设置模糊查询 loop(map, key, jedis, "0", sp); } catch (Exception e) { logger_xt_err.error(e.getMessage()); return null; }finally{ // 返还到连接池 if(jedis!=null)close(jedis); } return map; } public static Map<String, String> loop(Map<String, String> mapList, String key, Jedis jedis, String cursor, ScanParams sp) { try { ScanResult<Entry<String, String>> map = jedis.hscan(key, cursor, sp); cursor = map.getStringCursor(); for (Entry<String, String> en : map.getResult()) { mapList.put(en.getKey(), en.getValue()); } System.out.println("cursor:" + cursor); } catch (Exception e) { e.printStackTrace(); return null; } if (!"0".equals(cursor)) { loop(mapList, key, jedis, cursor, sp); } return mapList; }

 

使用的jar包:jedis-2.9.0.jar,commons-pool2-2.4.2.jar              

转载于:https://www.cnblogs.com/yangyang2018/p/10275671.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。