项目优化之Redis调优
设置Redis使用的最大物理内存,即Redis在占用maxmemory大小的内存之后就开始拒绝后续的写入请求,该参数可以确保Redis因为使用了大量内存严重影响速度或者发生OOM(out-of-memory,发现内存不足时,它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存)。此外,可以使用info命令查看Redis占用的内存及其它信息调整键名简短(存储key)设置超时时间,防止无用的
公司项目使用的Redis调优
此文章也是相继搜索各种调优优化,写的太乱,于是我就结合我给公司项目使用的redis调优写的一篇文章,若存在不完善的地方,欢迎评论补充,我会进行验证后及时更新供各位参考
1.最大物理内存
设置Redis使用的最大物理内存,即Redis在占用maxmemory大小的内存之后就开始拒绝后续的写入请求,该参数可以确保Redis因为使用了大量内存严重影响速度或者发生OOM(out-of-memory,发现内存不足时,它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存)。
此外,可以使用info命令查看Redis占用的内存及其它信息
# maxmemory <bytes>
2.键名简短(存储key)
键的长度越长,Redis需要存储的数据也就越多
3.请求超时时间
设置超时时间,防止无用的连接占用资源。设置如下命令:
//redis配置文件调整
timeout 150
tcp-keepalive 150 (定时向client发送tcp_ack包来探测client是否存活的。默认不探测)
//项目优化调整
redis.timeout=10s
4.数据持久化策略
数据磁盘尽可能减少性能损坏,以空间换时间。设置如下命令:
//对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果
//你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbcompression no : 默认值是yes
//在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消
//耗,如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum no : 默认值是yes。
5.优化AOF和RDB
减少占用CPU时间 主库可以不进行dump操作或者降低dump频率。 取消AOF持久化。
appendonly no
6.监控客户端的连接
因为Redis是单线程模型(只能使用单核),来处理所有客户端的请求,但由于客户端连接数的增长, 处理请求的线程资源开始降低分配给单个客户端连接的处理时间
7.限制客户端连接数
在Redis-cli工具中输入info clients可以查看到当前实例的所有客户端连接信息
//可以通过在Redis-cli工具上输入 config set maxclients去设置最大连接数。根据连接数负载的情况
maxclients 10000
8.Redis的key过期策略以及内存淘汰机制(高阶三问三答)
分析:这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来
问:比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?
答:redis采用的是定期删除+惰性删除策略
问:为什么不用定时删除策略?
答:定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.
问:定期删除+惰性删除是如何工作的呢?
答:定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
问:采用定期删除+惰性删除就没其他问题了么?
答:不是,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。
淘汰机制配置详情
在redis.conf中有一行配置
# maxmemory-policy noeviction
该配置就是配内存淘汰策略的(什么,你没配过?好好反省一下自己)
1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。
2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。
3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。
4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐
6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐
ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。
人之所以能,是因为 相信能!!
更多推荐
所有评论(0)