Redis常见的一些问题和注意事项

        本文汇总的都是在我们公司出现过的常见问题以及自己曾经记录的注意事项。

        我们公司sentinel模式以及RedisCluster集群两种部署方式都有使用,下面问题有些可能是哨兵模式下存在的,比如批量操作,下面可能不会特别说明。

1、注意热点key

        之前单位有一个实际案例是某个系统的交易成功率低于最低告警值 ,其产生原因就是Redis存在两个热点key,且这两个key都在同一个master节点上(RedisCluster集群),导致在高峰期间对应节点访问流量过大,造成了严重的访问倾斜。

        对于这种问题,我们可以通过两种方式解决。

        1、增加一层本地缓存,减少Redis的访问,基本上多级缓存都这么干;

        2、考虑到一致性的问题,用不了本地缓存,像秒杀场景的活动库存这种,就可以将热点key分散存储,一个key拆成多个子key存储。比如某电商进行茅台抢购活动,首先将茅台商品活动库存放到Redis中,茅台就是一个热点key,如maotai,1000,此时就可以将热点key分散存储,茅台抢购是需要预约的,可以将所有预约用户进行分组,Redis会根据组存储活动库存,key可以是 maotai:groupId1 300,maotai:groupId2 300,maotai:groupId3 400,通过这种方式把整个流量分散到不同的节点上,减轻单节点压力。

        当然,有人会问,那出现有些节点抢购完了,有些没抢购完怎么办?对于这个问题,首先是我们用户都是平均hash到不同的节点上的,请求总体上是平均的;其次就算是出现了这种情况,对于抢购这种营销活动,我们是允许少卖的,超卖却是不可以,同样因为性能降低导致系统崩溃也是不允许的。总结说就是我们要做到两权相害取其轻。

 

2、避免bigKey

        另一个实际案例同样是某系统的交易超时和成功率低预警,以及机房传输设备有端口心跳告警,其产生原因是存在bigKey,且进行批量操作(hgetall,hsetall),在交易并发量增大时,批量查询存储操作对Redis性能影响较大,查询缓慢进而导致交易超时。

       尽管Redis在Redis4.0引入了后台多线程,Redis6又引入了IO多线程,但Redis的主要命令执行依然是单线程的。如果对单个key进行批量操作,如hashKey的 hgetall,hsetall,执行的时间复杂度是O(N),当并发上来的时候,这种操作是非常低效的,很容易造成客户端阻塞。此外也可能会引发网络阻塞。因为每次获取大 key 产生的网络流量较大,举一个极端的例子,一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说比较难以承受。

  我在之前写的文章已经详细说了这个问题以及解决办法,传送门:

Redis的big key问题介绍以及监控手段icon-default.png?t=N7T8https://blog.csdn.net/hbnn111/article/details/135969182

3、在使用lettuce时,记得配置网络拓扑刷新

       在Java领域,Redis客户端还是比较多的,如jedis,redisson,lettuce等,Springboot2.x以后默认是lettuce,由于其高性能以及并发安全性使其得到了很广泛的使用,但其有一个最大的弊端是默认不进行网络拓扑刷新。那啥是网络拓扑刷新呢?即RedisCluster集群,如果某个master节点异常宕机,集群会自动进行重新选主,某个slave会被选举成为master,然而lettuce客户端默认并不会感知,导致请求还会达到不可达的节点上,从而出现超时,严重的会因为连接池的限制影响到其他正常的master请求。

        springboot2.3以后lettuce可以进行网络拓扑刷新配置:

spring:
  redis:
	lettuce:
	  cluster:
		refresh:
		  adaptive: true
		  period: 10000    # 10秒自动刷新一次

        如果不想用lettuce,可以切换成jedis或者Redisson都可以,这两者都默认实现了网络拓扑刷新。        

        这个问题在我前东家和现在的公司都出现过,前公司的解决方案是直接把客户端换成jedis,现在的解决方式就是配置网络拓扑刷新。

4、使用Redis客户端,根据实际情况配置连接池

        这个和数据库连接池是一致的,主要是配置最小空闲连接和最大空闲连接,min-idle和max-idel,这两个配置不是一拍脑门就决定的,而是要根据业务的实际情况不断去调试,这和所有的池化原理都一样,如连接池,线程池都要根据业务调优。

        连接池的问题在jedis上更为突出,因为lettuce采用了Netty,使用了多线程+IO多路复用+异步的并发方式,性能上比jedis更好,jedis非常容易因为某些请求长时间占用线程导致连接池耗尽。因此目前生产上出现Redis连接池问题的基本上都是jedis客户端引起的,我们单位出现的几起事故都是。当然,这并不是绝对啊,lettuce同样有出现问题的可能。

        

5、尽量避免大量使用批量操作

        批量操作可能大家用的比较多,因为可以减少请求次数,但用多了同样是会出现问题的,如果频繁的进行批量操作,由于Redis是单线程的,其他命令就会阻塞住,如果批量操作比较耗时的话,就将是灾难性的。

        

6、生产环境禁用的命令

    • keys * :排在首位, 重中之重,用了它,Redis就完蛋了,很有可能导致整个集群出现大面积故障
    • flushall: 同步操作
    • flushdb: 同步操作,丢失当前database的所有数据,出现堵死现象
    • save: 同步操作
    • bgsave: 尽管是异步操作,但需要同步fork子线程,FORK引起COW内存消耗,有导致大面积OOM的风险。这个主要还是Redis自己执行就OK了,不需要我们操作
    • shutdown: 导致Redis关闭、数据丢失和故障转移
    • debug : 导致Redis Crash、堵死和集群故障转移等

7、Key的设计规范

    • Redis缓存场景,建议Key都设置TTL值,保证不使用的Key能被及时清理或淘汰,使内存复用。
    • 建议Key使用":"字符进行分层,如 hbnnmall:coupoun:uid。
    • Key名字本身是String对象,最大长度512MB,也是big key的范畴。
    • Key的长度小于30个字符,Key内容本身分占用1到多份内存容量。
    • 按业务功能命名key前缀,防止key冲突覆盖,同时方便运维管理。

8、程序架构规范

  • 查看命令时间复杂度,官方文档Commands,每个都对应有Time complexity属性;如HGETALL命令Time complexity: O(N) where N is the size of the hash.时间复杂度为O(N)的常见命令: keys mget mset hgetall。

  • redis是single-threaded server,如果命令耗时过长,命令独占server,其间不能响应其他命令,导致服务超时。如果执行时间比较长,甚于导致判断节点为下线状态,触发集群故障转移。
  • 避免使用时间复杂度为O(N)的访问模式或命令;对元素比较多的集群key使用时间复杂度为O(N)命令。
  • Cluster模式中,热点Key和大容量Key尽量设计"打散”;避免集群不均,导致某个分片QPS“过载“和容量过大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/524438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOV8 + 双目测距

YOLOV8 双目测距 1. 环境配置2. 测距流程和原理2.1 测距流程2.2 测距原理 3. 代码部分解析3.1 相机参数stereoconfig.py3.2 测距部分3.3 主代码yolov8-stereo.py 4. 实验结果4.1 测距4.2 测距跟踪4.3 测距跟踪分割4.4 视频展示 相关文章 1. YOLOv5双目测距(python&…

MySQL高级篇(存储引擎InnoDB、MyISAM、Memory)

目录 1、存储引擎简介 1.1、查询建表语句,默认存储引擎:InnoDB 1.2、查看当前数据库支持的存储引擎 1.3、创建表,并指定存储引擎 2、 存储引擎-InnoDB介绍 2.1、存储引擎特点 3、MyISAM存储引擎 4、Memory存储引擎 5、InnoDB、MyISAM、Memory…

layui在上传多图时,allDone方法只是在第一次全部成功时调用了

问题点:在使用layui框架做多张图片上传时,遇见只有第一次操作上传图片时,触发了allDone全部上传成功的方法,后面再添加图片时,就不会调用这个方法 原因:是因为我删除了 choose 方法,并且也没有将…

算法部署 | 使用TensorRT+DeepSort+YOLOv5在NVIDIA-Jetson平台上部署目标跟踪算法

项目应用场景 面向英伟达 Jetson 边缘计算平台部署目标跟踪算法场景,使用深度学习算法 YOLOv5 DeepSort 来实现,并使用 TensorRT 进行算法加速,项目支持 NVIDIA Jetson Xavier、NVIDIA Jetson Xavier NX、X86 平台的算法部署。 项目效果 项…

uniapp - 微信小程序 - 使用uCharts的一些问题

文章目录 uniapp - 微信小程序 - 使用uCharts的一些问题一、开发者工具显示正常,真机调试统计图不随页面滚动二、数据过多开启滚动条,无法滑动滚动条三、饼图点击不显示提示窗/点击位置bug、多个同类型统计图点击不显示提示框问题四、 formatter 自定义 …

C++进阶(五) 哈希

1. unordered系列关联式容器 1.1 unordered_map 1.2 unordered_map的接口说明 2. 底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.4 哈希冲突解决 2.4.1 闭散列 2.4.2 开散列 3. 模拟实现 3.1 unordered_set 3.2 unordered_map 4.哈希的应用 4.1 位图 4.1.…

【机器学习·浙江大学】机器学习概述、支持向量机SVM(线性模型)

机器学习概述 机器学习 特征提取(feature) 根据提取的特征构造算法,实现特定的任务⭐(这门课程的重点:假设所有的特征已经存在且有效,如何根据这些特征来构造学习算法) 如下图所示,机器学习主要就是来进行…

ArcGIS Server 安装教程

​​​​​​​ 一、环境与文件准备 1.软件环境 已安装arcgis Desktop 10.2 2.安装及授权文件 二、安装步骤 1.下载安装包和授权文件,解压后打开ArcGIS Server10.2文件夹,打开ESRI.exe。 2.点击ArcGIS for Server后的Setup,开始安装。 3.…

设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 策略模式与模板方法模式对比解析 文章目录 🌟引言🌟Part 1:…

Excel 文件底部sheet 如何恢复

偶然打开一个excel文件,惊奇地发现:原来excel文件底部的若干个sheet居然全都看不到了。好神奇啊。 用其它的电脑打开同样的excel文件,发现:其实能看到的。说明这个excel文件并没有被损坏。只要将修改相关设置。就可以再次看…

如何插入LinK3D、CSF、BALM来直接插入各个SLAM框架中

0. 简介 LinK3D、CSF、BALM这几个都是非常方便去插入到激光SLAM框架的。这里我们会分别从多个角度来介绍如何将每个框架插入到SLAM框架中 1. LinK3D:三维LiDAR点云的线性关键点表示 LinK3D的核心思想和基于我们的LinK3D的两个LiDAR扫描的匹配结果。绿色线是有效匹配。当前关…

WPS二次开发系列:WPS SDK实现文档打印功能

在办公场景或者家教场景中经常碰到需要对文档进行打印的能力,今天给大家带来一篇如何通过WPS SDK调用WPS打印接口实现文档打印能力 最终实现效果图 实现步骤 2.1. 申请集成资料 通过向WPS官方发送邮件申请,审批通过后即可获取集成相关资料,详…

AI智能分析盒子在工地的应用,提高工地管理效率和安全性

工地ai智能分析盒子是一种基于人工智能视觉分析技术的人工智能盒子,旨在提升工地作业区域的管理效率和保障作业人员的安全。通过最前沿的AI视觉算法、大数据,能够实时监控工地现场视频流画面,对施工工地人员的工作着装及日常作业行为进行规范…

Shell脚本从0到会基础学习(个人学习)

一、前言 本人在找工作的时候,发现有的职位要会shell或者是python其中一种脚本语言。由于博主学过python。所以专门开栏学习,只做个人学习。一天学会那种~ 二、练习 2.1 我的第一个脚本--HelloWorld 代码 运行结果 2.2 输出系统常量和 自定义变量 #!…

wheeltec轮趣ROS教育机器人的网络连接

一、术语解析 宿主机:宿主机是指物理主机,比如用于开发测试的笔记本电脑和台式机电脑。 虚拟机:虚拟机是指安装在宿主机的VMware,推荐在宿主机上安装虚拟机,官方提供虚拟机的镜像以及配套的开发环境。 ROS主机&…

《云原生安全攻防》-- 云原生应用风险分析

为了满足每位朋友的学习需求,并且支持课程的持续更新,本系列课程提供了免费版和付费视频版两种方式来提供课程内容。我们会持续更新课程内容,以确保内容的度和实用性。 在本节课程中,我们将一起探讨云原生应用在新的架构模式下可能…

plasmo浏览器插件框架使用react和ant.design框架创建页面内容脚本UI样式注入

使用plasmo开发浏览器插件的时候,想要使用内容脚本UI注入自定义的UI组件,官方文档:Content Scripts UI – Plasmo,最好是搭配上好看的UI样式,所以可以集成ant.design的UI组件库,但是只集成组件还不行&#…

前端入门(认识HTML,CSS,JavaScript三件套)

目录 前言 HTML(构建) CSS(设计) JavaScript(互动) 总结 相关书籍推荐 前言 前端(Frontend)指的是与用户直接交互的部分,也称为客户端。在网站或者应用程序中&…

PyCharm关闭项目后等待时间长

每次关闭项目或PyCharm时,会显示正在关闭项目,而这个关闭时间很长且不可确定,很浪费我们的时间,不过愿意等的话,倒也是可以。 解决方法 Help -> Find Action -> 查找 Registry -> 禁用 ide.await.scope.comp…

【功能更新】强化知识库管理与AI问答机器人性能

三月HelpLook带来了3大类功能焕新,主要聚焦于:知识库的管理功能升级和AI问答机器人的优化,让我们看看更新了哪些新功能! 那么,接下来就让我们来详细了解一下本次升级都带来了哪些新功能吧! 知识库使用与管理…