
# Redis实例内存使用率高问题排查和解决
#### 问题现象
Redis可提供高效的数据库服务，当内存不足时，可能导致Key频繁被逐出、响应时间上升、QPS（每秒访问次数）不稳定等问题，进而影响业务运行。由于Redis自身运行机制（主从同步、延迟释放等），内存占用率可能出现略微超过100%的情况，此为正常情况，此时内存已经写满，用户需要考虑扩容，或者清理一些无用的数据。通常情况下，当内存使用率超过95%时需要及时关注。
#### 排查原因
1. 查询指定时段的内存使用率信息，具体操作请参见[性能监控](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0312045.html)。"内存利用率"指标持续接近100%。
2. 查询内存使用率超过95%的时间段内，"已逐出的键数量"和"命令最大时延"，均呈现显著上升趋势，表明存在内存不足的问题。 建议客户登录控制台，参考[缓存分析](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-210330001.html)和[慢查询](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190926001.html)，执行大Key扫描和慢查询。如果实例没有设置过期时间，会导致存储数据太多，内存被占满。
   
3. Redis实例如果内存满了但是key不多，可能原因是客户端缓冲区（output buffer）占用过多的内存空间。 可以在Redis-cli客户端连接实例后，执行大key扫描命令：redis-cli --bigkeys，然后执行info，查看output buffer占用情况。
   
 
#### 处理措施
1. DCS控制台提供了大Key和热Key的分析功能，可参考[分析Redis实例大Key和热Key](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190808001.html)排查大key和热key。
   ![](https://support.huaweicloud.com/trouble-dcs/public_sys-resources/note_3.0-zh-cn.png)
   Redis 3.0实例不支持热key分析，您可以通过[配置告警]的方式帮助您发现热key。
   
2. 执行[过期Key扫描](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-210330002.html)释放已经过期的Key，或手动清理一些不需要的Key，释放空间。
3. 其他优化建议：
   - **String** **类型数据的Value大小控制在** **10KB** **以内**。
   
   - **Hash、List、Set、Zset类数据结构，建议单Key中的元素不要超过5000个。**
   
   - Key的命名前缀为业务缩写，禁止包含特殊字符（比如空格、换行、单双引号以及其他转义字符）。
   
   - Redis事务功能较弱，不建议过多使用。
   
   - 短连接性能差，推荐使用带有连接池的客户端。
   
   - 如果只是用于数据缓存，容忍数据丢失，建议关闭持久化（在实例参数配置中将appendonly参数修改为no即关闭AOF持久化）。
   
   - 配置告警，便于提前发现大Key、热Key。
     - 参考[配置告警](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190905001.html)配置节点级别的**内存利用率** 监控指标的告警。
       如果某个节点存在大key，这个节点比其他节点内存使用率高很多，会触发告警，便于您发现潜在的大key。
       
     
     - 参考[配置告警](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190905001.html)配置节点级别的**入网最大带宽、出网最大带宽** 、**CPU** **利用率** 监控指标的告警。
       如果某个节点存在热key，这个节点的带宽占用、CPU利用率都比其他节点高，该节点会容易触发告警，便于您发现潜在热key。
       
      
    
4. 如果实例内存使用率通过以上方式仍然很高，请考虑在业务低峰期扩大实例规格。具体操作请参见[变更实例规格](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713006.html)。
 
