一直想着自己部署的Redis集群,只是简单的部署,肯定还有很大的优化空间。万一哪天用户暴增,出现了问题,我是不是得有几个备选方案?碰巧看了几篇Redis内存优化的文章,它们给了我很大的启发,在此用自己的语言整理一下,分享给大家。
Redis内存优化的目的:使用更少的空间存储更多的数据。
优化建议如下所示:
1. 键值对优化
1)减少键值key的长度,键名尽量精简,能缩写的缩写;
key规则: 业务名:表名:ID;
key使用embstr编码:开辟一块连续分配的内存(字符串长度小于等于44 字节);
2)value进行数据压缩;
3)value使用性能更好的占比更小的序列化方式;
2.小数据集合的编码优化
采用bitmap存储
setbit 前缀 key value
getbit 前缀 key
bitcount 前缀 // 统计
参考:https://mp.weixin.qq.com/s/ejlPNOuTu0owvsVdCwKPvw
3.使用对象共享池
redis在启动的时候会生成0-9999个整数对象池供对象复用,减少内存占用;
在采用ziplist 编码、设置maxmemory限制时失效;
4.使用 Bit 比特位或 byte 级别操作;
bitmap是一个以bit为单位的数组,数组的每个单元只能存储0和1,数组的下标是offset偏移量;
5.使用hash类型优化;
value能用hash的不用string;
6.内存碎片优化;
在redis.conf中开启activedefrag yes 相关配置;
7.使用32位的redis;
细说内存碎片优化
- 在redis客户端通过命令 info memory 查看内存信息,需要关注以下几个信息:
# redis分配的内存总量单位为b
used_memory:
# redis分配的内存总量单位为M
used_memory_human:
# redis向操作系统申请的内存总量单位为b
used_memory_rss:
# redis向操作系统申请的内存总量单位为M
used_memory_rss_human:
# 内存碎片率
mem_fragmentation_ratio:
# 内存分配器
mem_allocator:jemalloc-5.1.0
mem_fragmentation_ratio计算公式为:used_memory_rss/used_memory该值过高时考虑清理内存;
- 打开 redis.conf 配置文件,需要开启以下属性,默认都是关闭的;
# 开启自动清理内存碎片
activedefrag yes
# 内存碎片的字节数达到100M时开始清理
active-defrag-ignore-bytes 100mb
# 内存碎片空间占操作系统分配给redis的总空间比例达到 10% 时开始清理
active-defrag-threshold-lower 10
# 两个条件同时满足会触发内存碎片清理,当有一个不满足则停止清理
# active-defrag-ignore-bytes与active-defrag-threshold-lower
# 内存碎片超过 100%,则尽最大努力整理
active-defrag-threshold-upper 100
# 自动清理过程所用CPU时间的比例不低于1%,保证能正常清理
active-defrag-cycle-min 1
# 自动清理过程所用CPU时间的比例不高于25%,超过25%停止清理,避免redis主线程阻塞
active-defrag-cycle-max 25
# 自动清理过程中长度小于1000的set/hash/zset/list才会进行自动清理
active-defrag-max-scan-fields 1000
注意点:内存碎片优化,只支持redis4.0以上版本,windows安装的redis 3点几版本是不支持的。
参考链接:https://www.csdn.net/tags/Mtzakg5sNDkxMDQtYmxvZwO0O0OO0O0O.html
本文参考:https://mp.weixin.qq.com/s/HzBLqWaJyadnTsA-bB0ivg
最后总结
通过以上三篇文章的学习,学到了7个关于Redis内存优化的方法。第1、5点是关于键值对存储的优化,想办法减少数据存储的数量;第2、3、4点和业务逻辑有关,是否有这方面的需要,如果有可以这样存储。第6点是开启内存自动清理的优化。第7点是在redis存储结构上做整体调整。有了这几点优化方针做指导,能优化赶紧做起来吧。
网友评论