Redis内存优化,读书笔记整理

一直想着自己部署的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;

细说内存碎片优化

  1. 在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该值过高时考虑清理内存;

  1. 打开 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存储结构上做整体调整。有了这几点优化方针做指导,能优化赶紧做起来吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章