1、业务背景

在互联网的项目中为了提高性能和吞吐量,通常需要做一些优化和数据异构,比如查询DB,我们可以优化索引,通过命中索引来提高查询速度,也可以把数据异构到Redis,虽然Redis的性能非常好也支持5种数据结构,如果想性能更好的话,可以考虑异构到JVM缓存,也就是DB的数据异构到Redis,Redis的数据定期异构到JVM缓存

2、带来问题

在Redis中通过用一个hashmap来存储业务数据,当这些业务数据比较小,我们可以通过hGetAll来获取redis的整个map然后设置到JVM缓存中,伴随这业务的增长Redis中的key会非常多,这是我们调用hGetAll获取数据时就会把Redis给hang住,造成整个redis阻塞,进而影响整个redis集群的使用,导致其它业务调用redis时性能抖动

3、解决方案

1调整获取命令hGetAll改成hscan,分阶段获取
      2调整hash-max-ziplist-entries参数阈值由于调整改配置需要重新刷数据(不建议)

我们采取方案1,通过HSCAN来迭代获取对应的值,通过指定游标和获取的数量,比如一次获取10个,命令如下HSCAN key cursor [MATCH pattern] [COUNT count]  它是一个增量式命令,每次查询都是返回一部分数据,还可以通过它处理模糊查询,所以不会像hGetAll类命令hang住Redis导致服务短暂停滞,最开始cursor我们都设置为0就好,count来控制每次遍历的数量,由于这个命令执行的时间复杂度是O(N),所以count越大,每次执行时间理论上会越长,可以根据实际场景进行调整,在遍历时候判断返回的游标cursor是否为0,如果为0代表整个遍历结束。

类似的命令如下:原理都一样,都是避免把redis的进场hang住,

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

4、参考文档

http://doc.redisfans.com/key/scan.html#scan

http://redisdoc.com/database/scan.html#scan

5、测试用例

测试过程发现如果map集合的数据比较少,比如100个,虽然设置count只查10个,也会都返回过来 注意点:所有jimdb scan类操作,都要确保在一个副本。

 public Map<String,String> hScan(String key) {Map<String,String> allResult =new HashMap<>(1024);CallerInfo callerInfo = Profiler.registerInfo("CacheServicneire_hScan", O2nConstants.APP_NAME,false, true);try {ScanOptions scanOptions =  ScanOptions.scanOptions().match("*").count(50).concurrent(1).build();ScanResult<Map.Entry<String, String>> scanResult =  cluster.hScan(key,0,scanOptions);if(scanResult !=null && CollectionUtils.isNotEmpty(scanResult.getResult())){allResult.putAll(scanResult.getResult().stream().collect(Collectors.toMap(Entry::getKey,Entry::getValue)));while (scanResult.getCursor()>0){scanResult =  cluster.hScan(key,scanResult.getCursor(), scanOptions);if(scanResult !=null && CollectionUtils.isNotEmpty(scanResult.getResult())){allResult.putAll(scanResult.getResult().stream().collect(Collectors.toMap(Entry::getKey,Entry::getValue)));}}}}catch (Exception e) {Profiler.functionError(callerInfo);log.error("执行hScan操作失败, key:{}", key, e);throw e;} finally {Profiler.registerInfoEnd(callerInfo);}return allResult;}

Redis命令之hscan相关推荐

  1. Redis 命令参考

    Redis 命令参考 本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版, 阅读这个文档可以帮助你了解 Redis 命令的具体使用方法, ...

  2. redis命令-key操作

    目录 DEL RENAME RENAMENX EXPIRE EXPIREAT PEXPIRE PEXPIREAT TTL PTTL PERSIST EXISTS KEYS MOVE RANDOMKEY ...

  3. redis查询所有key命令_想在生产搞事情?那试试这些 Redis 命令

    作者:鸭血粉丝 出自:Java极客技术 原文:mp.weixin.qq.com/s/WeAamgYYGQfxlsppsn9_lg 哎,最近阿粉又双叒叕犯事了. 事情是这样的,前一段时间阿粉公司生产交易 ...

  4. Redis命令详解:Hashs

    Hash是一种String类型的field.value的映射表,因此,它非常适合存储对象.下面我们来一一介绍与Hash相关的命令. HDEL 最早可用版本:2.0.0 时间复杂度:O(N),其中N为要 ...

  5. 关于Redis命令keys在性能方面的说明

    redis的keys命令类似于Mysql的like命令,无非就是模糊匹配相近的字符数据. KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 k ...

  6. Redis命令:scan实现模糊查询

    1.scan前言 从Redis v2.8开始,SCAN命令已经可用,它允许使用游标从keyspace中检索键. 对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险 ...

  7. 【Redis】(二)Redis命令大全(速记)

    文章目录 字符串 string 命令: 哈希 hash 类型命令 列表 list 命令 集合 set 命令 有序集合Zset 命令 系统命令 对于Redis命令,整理出部分常用命令,便于学习和记忆. ...

  8. 消息中间件----内存数据库 Redis7(第3章 Redis 命令)

    Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令, 对 Key 的操作命令,对 Value 的操作命令. 3.1 Redis 基本命令 首先通过 redis- ...

  9. 误用Redis命令导致服务器挂了,领导让我写事故报告

    大家肯定用过Redis,也知道Redis的命令以及用法,但是假如在某些场景下,误用了一些命令,后果会非常严重,所以要坚决杜绝这样的事情发生,由于我自己之前误用过,所以事故报告它来了! 前言 我相信大家 ...

  10. 超全Redis命令总结,墙裂建议收藏,说不定就用上了呢

    前言 Redis是一个开源的使用ANSIC语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis可以广泛用于微服务架构.它可能是您应用程序以多 ...

最新文章

  1. 格式化时间算前七天php,php 格式化时间 秒前 分钟前 小时前 天前
  2. ES6 WeakMap的实际用途是什么?
  3. 邀请参加活动的邀请函_邀请函||王坝镇中心幼儿园邀请家长参加期中分享活动的通知...
  4. 腾讯 开源软件列表-开源中国社区
  5. bzoj#4555. [Tjoi2016Heoi2016]求和
  6. MyBatis中的注解
  7. Java面试2021,java黑马百度云
  8. java类和对象:封装、继承和多态
  9. php中静态方法的和属性的使用
  10. Class类文件结构之ConstantValue属性
  11. QQ音乐2009去广告方法
  12. Javascript飘窗代码
  13. 使用Python库valuequant和每股收益历史数据计算股权价值
  14. 爬取北京市公交线路信息
  15. [业务流程]JWT实现单点登录(SpringBoot + Vue +axious)
  16. 教你十分钟写一个软件防火墙
  17. Python实现猜单词游戏
  18. python import相对引用和绝对引用
  19. harris角点检测和SIFT
  20. AD17在丝印层添加汉字

热门文章

  1. Fences有一个桌面分区消失了怎么办
  2. 套管式换热器原理、设计、仿真!附全套资料下载
  3. python网络爬虫项目——翻译英文单词
  4. npm下载require
  5. autocad不能画图_AutoCAD经典技巧!
  6. 智慧水务项目建设方案
  7. java1.8.0_java jdk官方下载|java jdk v1.8.0 官方免费版-520下载站
  8. mac 中的 zip 和 unzip 命令
  9. oracle查看视图定义语句_oracle视图(oracle创建视图的sql语句)
  10. 计算机五笔打字员,mac五笔打字软件 五笔打字员mac