导致Redis访问慢的原因通常有2个方面:

第一,Redis本身性能出现了瓶颈,如:内存使用率过高,并发过大等

第二,存在大KEY,或者客户端访问命令使用不当引起的阻塞

在此,只列举因为的客户端命令使用不当导致访问Redis慢的操作,表现出来的现象就是:某些接口的访问耗时不稳定,时好时坏。

无序集合“SMEMBERS”命令

当无序集合(SET)中的元素个数很多时,使用“SMEMBERS”命令访问可能会引起Redis访问阻塞。

替代方案:使用SSCAN命令代替SMEMBERS命令。

使用示例:

// 使用SMEMBERS命令访问集合所有元素
Set<String> set = redisTemplate.opsForSet().members(key); // 使用SSCAN命令访问集合所有元素
Set<String> set = new HashSet<>();
Cursor<String> cursor = this.redisTemplate.opsForSet().scan(key, ScanOptions.NONE);
try {
while (cursor.hasNext()) {
String value = cursor.next();
set.add(value)
}
} finally {
try {
cursor.close();
} catch (Exception e) {}
}

哈希集合“HGETALL”命令

当哈希集合(HASH)中的元素很多时,使用“HGETALL”命令获取所有元素可能会引起Redis访问阻塞。

替代方案:使用HSCAN命令替代HGETALL命令。

使用示例:

// 使用HGETALL命令获取集合所有元素
Map<String, Object> map = redisTemplate.opsForHash().entries(key); // 使用HSCAN命令访问集合所有元素
Map<String, Object> map = new HashMap<>();
Cursor<Map.Entry<String, Object>> cursor = redisTemplate.opsForHash().scan(key, ScanOptions.NONE);
try {
while (cursor.hasNext()) {
Map.Entry<String, Object> entry = cursor.next();
if (entry.getKey() == null || entry.getValue() == null) {
continue;
}
map.put(entry.getKey(), entry.getValue());
}
} finally {
try {
cursor.close();
} catch (Exception e) {}
}

【参考】

http://kaito-kidd.com/2021/01/23/redis-slow-latency-analysis/ Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文

http://xiaoyue26.github.io/2020/03/23/2020-03/redis大key问题/ redis大key问题

导致Redis访问慢的常见操作的更多相关文章

  1. jedis操作redis的几种常见方式总结

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...

  2. Redis入门很简单之六【Jedis常见操作】

    Redis入门很简单之六[Jedis常见操作] http://www.tuicool.com/articles/vaqABb http://www.cnblogs.com/stephen-liu74/ ...

  3. Redis安装和客户端cli常见操作

    安装Redis $ wget http://download.redis.io/releases/redis-4.0.6.tar.gz $ tar xzf redis-4.0.6.tar.gz $ c ...

  4. redis之常见操作

    目录 redis的常见操作 1. redis客户端登录方式 2. 设置密码 3. 获取redis的配置 4. redis键(key) 语法 实例 Redis keys (黄色为重点) redis的常见 ...

  5. Redis的那些最常见面试问题

    随笔:经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估 ...

  6. (转)Redis的那些最常见面试问题

    背景:最近在准备面试相关的题目,发现redis基本一片空白,有必要好好总结下. 转自:https://www.cnblogs.com/Survivalist/p/8119891.html 1.什么是r ...

  7. Redis的那些最常见面试问题(转)

    Redis的那些最常见面试问题         1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型 ...

  8. Redis 的几种常见使用方式

    常见使用方式 Redis 的几种常见使用方式包括: Redis 单副本 Redis 多副本(主从) Redis Sentinel(哨兵) Redis Cluster Redis 自研 各种使用方式的优 ...

  9. 聊聊redis实际运用及骚操作

    前言 聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过.甚至大部分前端猿都知道. 数据结构: string. hash. list. set (无序集合). setsorted(有序集合 ...

  10. hystrix完成对redis访问的资源隔离

    相对来说,考虑的比较完善的一套方案,分为事前,事中,事后三个层次去思考怎么来应对缓存雪崩的场景 1.事前解决方案 发生缓存雪崩之前,事情之前,怎么去避免redis彻底挂掉 redis本身的高可用性,复 ...

随机推荐

  1. [转帖]ioping测试

    https://www.cnblogs.com/ishmaelwanglin/p/10839702.html 一个实时显示磁盘io延时的工具,以类似ping 的输出一样展示输出结果 常用参数: -c ...

  2. Redis命令监控与简单分析

    Redis命令监控与简单分析 前言 为了能够快速识别分析redis的命令 自己在环境上面进行了一些简单的跟踪以及脚本 这里不全是进行metrics, 细致到具体的命令分析 脚本部分-1 mkdir - ...

  3. 我在京东做研发 | 京东云算法科学家解析爆火的ChatGPT

    令人惊艳的ChatGPT横空出世 背后有怎样的前沿技术支撑 走向大规模产品应用又有何局限 深耕对话式AI技术十余年 京东云算法科学家将带您一同走进技术世界 解析ChatGPT的技术亮点与局限 分享下一 ...

  4. 【一个经典BUG】gin框架中,异步协程使用context导致取不到数据

    bug的内容大致如下: func httpHandle(c *gin.Context) { go func(ctx Context){ v := ctx.Value("xxx") ...

  5. vim 从嫌弃到依赖(8)——使用命令模式编辑文本

    通过前面的文章,我们已经介绍了vim的普通模式.插入模式.可视模式.接下来让我们接着介绍vim中另一个强大的模式--命令行模式 命令模式简介 命令模式可以说在vim中的使用频率不亚于普通模式,像我们平 ...

  6. Vue双向数据绑定原理-中

    defineProperty方法 defineProperty除了可以动态修改/新增对象的属性以外, 还可以在修改/新增的时候给该属性添加get/set方法, 从而实现数据劫持. defineProp ...

  7. Docker 安装与升级

    卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest ...

  8. 强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示

    强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域,区别与监督学习和无监 ...

  9. 21.6 Python 构建ARP中间人数据包

    ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改 ...

  10. 4.0 Python 变量与作用域

    在python中,变量的作用域决定了变量在哪些位置可以被访问.一个程序中的变量并不是所有的地方都可以访问的,其访问权限决定于变量的赋值位置.python中有两种最基本的变量作用域:局部作用域和全局作用 ...