面试题答案
一键面试内存占用影响
- 编码转换导致内存增加:例如从int编码(占用8字节)转换为embstr编码(字符串长度较小时,embstr编码紧凑,内存占用相对小)再到raw编码(字符串长度较大时,raw编码内存占用会明显增大)。如果频繁从低内存占用编码向高内存占用编码转换,会显著增加Redis实例的内存消耗。
- 编码转换导致内存减少:若对象从复杂编码(如raw)转换为简单编码(如int,当对象值为整数且符合int编码范围时),则会减少内存占用,释放内存空间,使得Redis在有限内存下可以存储更多数据。
读写性能影响
- 编码转换提升读性能:例如从raw编码转换为int编码,由于int编码结构简单,在读取时CPU计算量小,能够更快地获取数据,提升读操作的速度。对于读操作频繁的应用场景,这种转换能显著提升性能。
- 编码转换降低读性能:相反,若从int编码转换为raw编码,由于raw编码存储结构相对复杂,读取时需要更多的CPU资源来解析,读操作的性能可能会下降。
- 编码转换提升写性能:以从raw编码转换为embstr编码为例,embstr编码内存分配和释放更高效,在写入操作时,不需要像raw编码那样频繁进行复杂的内存管理操作,从而提升写性能。
- 编码转换降低写性能:若从简单编码如int转换为复杂编码如raw,在写入时,除了存储数据本身,还需要额外处理复杂的编码结构,会增加写操作的时间开销,降低写性能。
监控相关指标及优化策略
- 监控内存相关指标:
- used_memory:通过监控这个指标,可以了解Redis当前已使用的内存量。如果该值持续上升且接近系统内存限制,可能需要关注是否因为编码转换导致内存不合理增长。
- mem_fragmentation_ratio:该指标反映了内存碎片率。当编码频繁转换时,可能会产生内存碎片,导致该指标偏离1较多。若该值大于1.5,可能需要考虑手动干预编码调整,例如通过调整
hash-max-ziplist-entries
、list-max-ziplist-entries
等配置参数,避免不合理的编码转换。
- 监控读写性能指标:
- instantaneous_ops_per_sec:该指标显示Redis当前每秒执行的操作数。若在编码转换后,该值明显下降,说明读写性能受到了影响。结合具体的读写操作命令统计(如
get
、set
命令的执行次数和耗时),分析是读性能还是写性能出现问题。 - latency stats:通过
latency monitor
命令开启延迟统计,可以获取不同操作的延迟情况。如果编码转换后,某些操作的延迟显著增加,如get
操作延迟从1ms增加到10ms,需要针对性地调整编码策略,例如对于读操作延迟增加的情况,尽量保持对象为利于快速读取的编码形式。
- instantaneous_ops_per_sec:该指标显示Redis当前每秒执行的操作数。若在编码转换后,该值明显下降,说明读写性能受到了影响。结合具体的读写操作命令统计(如
- 优化策略:
- 预配置参数:在部署Redis时,根据业务数据特点,合理设置编码相关的配置参数,如
hash-max-ziplist-value
、zset-max-ziplist-value
等,尽量减少运行时不必要的编码转换。 - 动态调整:利用Redis提供的
OBJECT ENCODING
命令实时查看对象编码,结合监控指标,当发现性能问题与编码相关时,手动调整数据存储形式,例如将大字符串拆分成多个小字符串,使其更有可能采用embstr编码,提升性能。
- 预配置参数:在部署Redis时,根据业务数据特点,合理设置编码相关的配置参数,如