网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
云化数据中心 CloudDC
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务

DCS使用规范

更新时间:2025-01-07 GMT+08:00
分享

业务使用规范

原则

原则说明

备注

就近部署业务,避免时延过大

如果部署位置过远(非同一个region)或者时延较大(例如业务服务器与Redis实例通过公网连接),网络延迟将极大影响读写性能。

如果对于时延较为敏感,请避免创建跨AZ Redis实例。

冷热数据区分

建议将热数据加载到 Redis 中。低频数据可存储在 Mysql或者ElasticSearch中。

Redis将低频数据存入内存中,并不会加速访问,且占用Redis空间。

业务数据分离

避免多个业务共用一个Redis。

一方面避免业务相互影响,另一方面避免单实例膨胀,并能在故障时降低影响面,快速恢复。

禁止使用select功能在单Redis实例做多db区分。

Redis单实例内多DB隔离性较差,Redis开源社区已经不再发展多DB特性,后续不建议依赖该特性。

设置合理的内存淘汰(逐出)策略

合理设置淘汰策略,可以在Redis内存意外写满的时候,仍然正常提供服务。

DCS默认的逐出策略为volatile-lru,请根据业务需求选择。Redis支持的数据逐出策略

以缓存方式使用Redis

Redis事务功能较弱,不建议过多使用。

事务执行完后,不可回滚。

数据异常的情况下,支持清空缓存进行数据恢复。

Redis本身没有保障数据强一致的机制和协议,业务不能强依赖Redis数据的准确性。

以缓存方式使用Redis时,所有的key需设置过期时间,不可把Redis作为数据库使用。

失效时间并非越长越好,需要根据业务性质进行设置。

防止缓存击穿

推荐搭配本地缓存使用Redis,对于热点数据建立本地缓存。本地缓存数据使用异步方式进行刷新。

-

防止缓存穿透

非关键路径透传数据库,建议对访问数据库进行限流。

-

从Redis获取数据未命中时,访问只读数据库实例。可通过域名等方式对接多个只读实例。

核心是未命中的缓存数据不会打到主库上。

用域名对接多个只读数据库实例,一旦出现问题,可以增加只读实例应急。

不用作消息队列

发布订阅场景下,不建议作为消息队列使用。

  • 如没有非常特殊的需求,不建议将 Redis 当作消息队列使用。
  • Redis 当作消息队列使用,会有容量、网络、效率、功能方面的多种问题。
  • 如需要消息队列,可使用高吞吐的Kafka或者高可靠的RocketMQ。

合理选择规格

如果业务增长会带来Redis请求增长,请选择集群实例(Proxy集群和Cluster集群)。

单机和主备扩容只能实现内存、带宽的扩容,无法实现计算性能扩容。

生产实例需要选择主备或者集群实例,不能选用单机实例。

-

主备实例,不建议使用过大的规格。

Redis在执行RewriteAOF和BGSAVE的时候,会fork一个进程,过大的内存会导致卡顿。

具备降级或容灾措施

缓存访问失败时,具备降级措施,从DB获取数据;或者具备容灾措施,自动切换到另一个Redis使用。

-

数据设计规范

分类

原则

原则说明

备注

Key相关规范

使用统一的命名规范。

一般使用业务名(或数据库名)为前缀,用冒号分隔。Key的名称保证语义清晰。

例如,业务名:子业务名:id

控制Key名称的长度。

在保证语义清晰的情况下,尽量减少Key的长度。有些常用单词可使用缩写,例如,user缩写为u,messages缩写为msg。

建议不要超过128字节(越短越好)。

禁止包含特殊字符(大括号“{}”除外)。

禁止包含特殊字符,如空格、换行、单双引号以及其他转义字符。

由于大括号“{}”为Redis的hash tag语义,如果使用的是集群实例,Key名称需要正确地使用大括号避免分片不均的情况。

Value相关规范

设计合理的Value大小。

设计合理的Key中Value的大小,推荐小于10 KB。

过大的Value会引发分片不均、热点Key、实例流量或CPU使用率冲高等问题,还可能导致变更规格和迁移失败。应从设计源头上避免此类问题带来的影响。

设计合理的Key中元素的数量。

对于集合和列表类的数据结构(例如Hash,Set,List等),避免其中包含过多元素,建议单Key中的元素不要超过5000个。

由于某些命令(例如HGETALL)的时间复杂度直接与Key中的元素数量相关。如果频繁执行时间复杂度为O(N)及以上的命令,且Key中的子Key数量过多容易引发慢请求、分片流量不均或热点Key问题。

选择合适的数据类型。

合理地选择数据结构能够节省内存和带宽。

例如存储用户的信息,可用使用多个key,使用set u:1:name "X"、set u:1:age 20存储,也可以使用hash数据结构,存储成1个key,设置用户属性时使用hmset一次设置多个,同时这样存储也能节省内存。

设置合理的过期时间。

合理设置Key的过期时间,将过期时间打散,避免大量Key在同一时间点过期。

设置过期时间时,可以在基础值上增减一个随机偏移值,避免在同一个时间点大量Key过期。大量Key过期会导致CPU使用率冲高。

命令使用规范

原则

原则说明

备注

谨慎使用O(N)复杂度的命令

时间复杂度为O(N)的命令,需要特别注意N的值。避免N过大,造成Redis阻塞以及CPU使用率冲高。

例如:hgetall、lrange、smembers、zrange、sinter这些命令都是做全集操作,如果元素很多,会消耗大量CPU资源。可使用hscan、sscan、zscan这些分批扫描的命令替代。

禁用高危命令

禁止使用flushall、keys、hgetall等命令,或对命令进行重命名限制使用。

请参考命令重命名的内容。

慎重使用select

Redis多数据库支持较弱,多业务用多数据库实际还是单线程处理,会有干扰。最好是拆分使用多个Redis。

-

使用批量操作提高效率

如果有批量操作,可使用mget、mset或pipeline,提高效率,但要注意控制一次批量操作的元素个数。

mget、mset和pipeline的区别如下:

  • mget和mset是原子操作,pipeline是非原子操作。
  • pipeline可以打包不同的命令,mget和mset做不到。
  • 使用pipeline,需要客户端和服务端同时支持。

避免在lua脚本中使用耗时代码

lua脚本的执行超时时间为5秒钟,建议不要在lua脚本中使用比较耗时的代码。

比如长时间的sleep、大的循环等语句。

避免在lua脚本中使用随机函数

调用lua脚本时,建议不要使用随机函数去指定key,否则在主备节点上执行结果不一致,从而导致主备节点数据不一致。

-

遵循集群实例使用lua的限制

遵循集群实例使用lua的限制。

  • 使用EVAL和EVALSHA命令时,命令参数中必须带有至少1个key,否则客户端会提示“ERR eval/evalsha numkeys must be bigger than zero in redis cluster mode”的错误。
  • 使用EVAL和EVALSHA命令时,DCS Redis集群实例使用第一个key来计算slot,用户代码需要保证操作的key是在同一个slot。

对mget,hmget等批量命令做并行和异步IO优化

某些客户端对于MGET,HMGET这些命令没有做特殊处理,串行执行再合并返回,效率较低,建议做并行优化。

例如Jedis对于MGET命令在集群中执行的场景就没有特殊优化,串行执行,比起lettuce中并行pipeline,异步IO的实现,性能差距可达到数十倍,该场景建议使用Jedis的客户端自行实现slot分组和pipeline的功能。

禁止使用del命令直接删除大Key

使用del命令直接删除大Key(主要是集合类型)会导致节点阻塞,影响后续请求。

Redis 4.0后的版本可以通过UNLINK命令安全地删除大Key,该命令是异步非阻塞的。

对于Redis 4.0之前的版本:

  • 如果是Hash类型的大Key,推荐使用hscan + hdel
  • 如果是List类型的大Key,推荐使用ltrim
  • 如果是Set类型的大Key,推荐使用sscan + srem
  • 如果是SortedSet类型的大Key,推荐使用zscan + zrem

SDK使用规范

原则

原则说明

备注

使用连接池和长连接

短连接性能差,推荐使用带有连接池的客户端。

连接的频繁创建和销毁,会浪费大量的系统资源,极限情况会造成宿主机宕机。请确保使用了正确的Redis客户端连接池配置。

客户端需要对可能的故障和慢请求做容错处理

由于Redis服务可能因网络波动或基础设置故障的影响,引发主备倒换,命令超时或慢请求等现象,需要在客户端内设计合理的容错重试机制。

参考Redis客户端重试指南

合理设置重试时间和次数

合理设置容错处理的重试时间,根据业务要求设置,避免过短或者过长。

  • 如果超时重试时间设置的非常短(例如200毫秒以下),可能引发重试风暴,极易引发业务层雪崩。
  • 如果重试时间设置得较长或者重试次数设置得较大,则可能导致在主备倒换情况下业务恢复较慢。

避免使用Lettuce客户端

Lettuce客户端在默认配置下有一定性能优势,并且是spring的默认客户端,但是Jedis客户端在面对连接异常,网络抖动等场景下的异常处理和检测能力明显强于Lettuce,可靠性更强,建议使用Jedis。

Lettuce存在几个方面的问题:

  • Lettuce默认未配置集群拓扑刷新的配置,会导致Cluster集群在发生拓扑信息变化(主备倒换,扩容缩容)时,无法识别新的节点信息,导致业务失败。可参考使用Lettuce连接Cluster集群实例时的扩容异常处理
  • Lettuce没有连接池校验的功能,无法检测连接池中的连接是否仍然有效,获取失效连接之后会导致业务失败,存在分钟级不可用的故障风险。

运维管理规范

原则

原则说明

备注

生产开启密码保护

生产系统中需要开启Redis密码保护机制。

-

现网操作安全

禁止开发人员私自连到线上Redis服务。

-

验证业务的故障处理能力或容灾逻辑

在测试环境或者预生产环境中组织演练,验证在Redis主备倒换、宕机或者扩缩容场景下业务的可靠性。

主备倒换可以自行在页面上触发。强烈建议使用Lettuce客户端的应用进行相关的演练。

监控实践

关注Redis负载,在过载前提前扩容。

根据告警基线配置告警:配置节点cpu、内存、带宽等告警。

日常巡检

例行检查各个节点的内存使用率,查看主节点内存使用率是否有不均衡的状态。

内存使用率不均衡说明存在大Key问题,需要进行大Key拆分及优化。

开启热Key例行分析,并分析是否有Key频繁调用。

-

例行诊断Redis实例的命令,分析O(N)类命令是否存在隐患。

针对O(N)命令,即使耗时很小,建议开发分析业务增长,N是否会增长。

例行巡检Redis慢日志命令。

针对慢日志分析隐患,并尽快从业务上进行修复。

提示

您即将访问非华为云网站,请注意账号财产安全

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容