redis性能优化

2019-06-17  本文已影响0人  转过

阻塞解决

阻塞发现

1.客户端日志统计报警

2.服务端监控

阻塞原因

1.慢查询(线上设置1毫秒,避免O(n)命令,分拆大对象)

2.大对象(redis-cli  —bigkeys)

cpu饱和

统计使用情况(Redis-cli —stat)

单台redis ops一万以内垂直优化,5万以上 水平优化

1.fork阻塞 - p194

2.aof刷盘阻塞 - p194

3.huge page写阻塞 (关闭Linux huge page)

Ziplist:减少内存使用,增加cpu和命令时间,平衡内存和效率

内存优化(优先考虑垂直优化,再考虑水平扩展)

一.简化键

pencilnews:user:{uid}:identity 简化为 p:u:{uid}:idty

二.简化值

1.业务简化,去掉不必要的数据

2.选择高效的序列化工具(protostuff,kryo)(json可使用snappy,压缩效率高于gzip)

三.整数对象池[0-9999](设置maxmemory并开启lru类淘汰策略时无效)(ziplist无法使用 - 压缩且内存连续存储)

字符串(优化)预分配

追加修改字符串,redis会预分配一定内存,防止多次修改重新分配内存和字节数据拷贝

追加修改字符串内存导致重新分配会造成内存碎片

字符串预分配造成了内存浪费

优化

1.避免频繁使用append ,setrange,直接使用set

2.改为hash存储(ziplist,避免使用hashtable)

编码类型优化

编码类型转换不可逆,只能由小内存编码向大内存编码转换,重启redis,重新加载数据可完成转换

编码控制参数表 - p218

Ziplist:(内存要求较高场景)

1.连续内存数组

2.数据量更大时耗时: list < hash < zset

优化

1.建议长度不超过1000,元素大小控制在512字节内

Intset:(少量整数集合场景)

1.有序不重复整数

2.int16、int32、int64(根据集合内最长数据确定类型)

优化

1.保持整数范围一致,如控制在int-16范围内,避免内存浪费

控制键规模(小对象场景)

避免大量使用set/get,当做memcache来用

大量键分组映射到hash(ziplist),也可以节省大量内存(写入更耗时,随着value空间减少而降低) 

如100w个键,分1000个hash存储,每个存储1000个value

Hash优化后开发需手动删除过期键 

上一篇下一篇

猜你喜欢

热点阅读