命令使用规范
重要程度 规范 说明
★★★★★ 避免执行范围查询(例如KEYS *),使用多次单点查询或SCAN命令来获取延迟优势。 执行范围查询可能导致服务发生抖动、引发慢请求或产生阻塞。
★★★★★ 推荐使用扩展数据结构(数据结构模块集成)实现复杂功能,避免使用Lua脚本。 Lua脚本会占用较多的计算和内存资源,且无法被多线程加速,过于复杂或不合理的Lua脚本可能导致资源被占满的情况。
★★★★☆ 合理使用管道(pipeline)降低链路的往返时延RTT(Round-trip time)。 如果有多个操作命令需要被迅速提交至服务器端,且客户端不依赖每个操作返回的结果,那么可以通过管道来作为优化性能的批处理工具,注意事项如下:
● 管道执行期间客户端将独占与服务器端的连接,推荐为管道单独建立一个连接,将其与常规操作分离。
● 每个管道应包含合理的命令数量(不超过100个)。
★★★★☆ 正确使用Redis社区版命令支持。 使用事务(Transaction)时,需要注意其限制:
● 不同于关系型数据库的事务功能,Redis的事务功能不支持回滚(Rollback)。
● 对于集群架构的实例,需要使用hash tag确保命令所要操作的Key都分布在1个Hash槽中,同时还需要避免hash tag带来的存储倾斜问题。
● 避免在Lua脚本中封装事务命令,可能因编译加载消耗较多的计算资源。
★★★★☆ 避免使用Redis社区版命令支持执行大量的消息分发工作。 由于Pub和Sub不支持数据持久化,且不支持ACK应答机制无法实现数据可靠性,当执行大量消息分发工作时(例如订阅客户端数量超过100且Value超过1 KB),订阅客户端可能因服务端资源被占满而无法接收到数据。
说明
为提升性能和均衡性,云数据库Redis对Pub和Sub类命令进行了优化,集群架构下,代理节点会根据channel name进行Hash计算,并分配至对应数据节点。
运维管理规范
重要程度 规范 说明
★★★★★ 充分了解不同的实例管理操作带来的影响。 在对Redis实例执行变更配置、重启等操作时,实例的状态将发生变化并产生某些影响(例如产生秒级的连接闪断),在操作前您需要充分了解。更多信息,请参见实例状态与影响。
★★★★★ 验证客户端程序的差错处理能力或容灾逻辑。 云数据库Redis支持节点健康状态监测,当监测到实例中的主节点不可用时,会自动触发主备切换,保障实例的高可用性。在客户端程序正式上线前,推荐手动触发主备切换,可帮助您验证客户端程序的差错处理能力或容灾逻辑。具体操作,请参见手动执行主备切换。
★★★★★ 禁用高耗时或高风险的命令。 生产环境中,无限制地使用命令可能带来诸多问题,例如执行FLUSHALL会直接清空全部数据;执行KEYS会阻塞Redis服务。为保障业务稳定、高效率地运行,您可以根据实际情况禁用特定的命令,具体操作,请参见禁用高风险命令。
★★★★☆ 及时处理阿里云发起的计划内运维操作(即待处理事件)。 为提供更优质的服务,持续提升产品性能和稳定性,阿里云会不定期地发起计划内运维操作(即待处理事件),对部分实例所属的机器执行软硬件或网络换代升级(例如数据库小版本升级)。当您收到来自阿里云的事件通知后,您可以查看本次事件的影响,根据业务需求评估是否需要调整执行时间。更多信息,请参见查看并管理待处理事件。
★★★★☆ 为核心指标配置监控报警,帮助掌握实例运行状态。 为CPU使用率、内存使用率、带宽使用率等核心指标配置监控报警,实时掌握实例运行状态。具体操作,请参见报警设置。
★★★★☆ 通过云数据库Redis提供的丰富的运维功能,定期检查实例状态或辅助排查资源消耗异常问题。 ● 分析慢日志:帮助您快速找到慢请求问题发生的位置,定位发出请求的客户端IP,为彻底解决超时问题提供可靠的依据。
● 查看性能监控:云数据库Redis支持丰富的性能监控指标,帮助您掌握Redis服务的运行状况和进行问题溯源。
● 发起实例诊断:帮助您从性能水位、访问倾斜情况、慢日志等多方面评估实例的健康状况,快速定位实例的异常情况。
● 发起缓存分析:帮助您快速发现实例中的大Key,帮助您掌握Key在内存中的占用和分布、Key过期时间等信息。
● 实时Top Key统计:帮助您快速发现实例中的热点Key,为进一步的优化提供数据支持。
★★★☆☆ 评估并开启审计日志功能。 开通审计日志功能后,可记录写操作的审计信息,为您提供日志的查询、在线分析、导出等功能,助您时刻掌握产品安全及性能情况。更多信息,请参见开通审计日志。
重要
开通审计日志后,视写入量或审计量可能会对Redis实例造成5%~15%的性能损失。如果业务对Redis实例的写入量非常大,建议仅在运维需要(例如故障排查)期间开通审计功能,以免带来性能损失。
后续优化项
大KEY
大KEY其实并不是长度过长的KEY,而是存放了慢查询命令的KEY。
对于String类型,慢查询的本质在于value的大小。
对于其他类型,慢查询的本质在于集合的大小(时间复杂度带来)。
如何找到大key?
阿里云:发现并处理Redis的大Key和热Key:
https://help.aliyun.com/zh/redis/user-guide/identify-and-handle-large-keys-and-hotkeys?spm=a2c4g.11186623.0.i1
如何解决大key?
其实就是一个字 "拆"。
1.对于字符串类型的key,我们通常要在业务层面将value的大小控制在10KB左右,如果value确实很大,可以考虑采用序列化算法和压缩算法来处理,推荐常用的几种序列化算法:Protostuff、Kryo或者Fst。
2.对于集合类型的key,我们通常要通过控制集合内元素数量来避免bigKey,通常的做法是将一个大的集合类型的key拆分成若干小集合类型的key来达到目的。
压测关注点
1.数据是否倾斜(不能只看聚合信息,要切换到分片上,看数据节点);
2.是否有大key、热key;
a.压测过程中关注(1)CloudDBA-实时TOP KEY统计(2)CloudDBA-慢请求;
b.压测后(1)CloudDBA-离线全量KEY分析(2)CloudDBA-诊断报告,做到分析报告时间覆盖压测时段;
3.CPU使用率、内存使用率、带宽使用率变化趋势(流入、流出都要看,最好看一个缓存周期);
4.如果可以,打开审计日志,看写入日志是否符合代码逻辑。
常用运维命令
出线上事故的时候,用于快速分析和保留现场。