结合以前项目使用的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数据,可是你写了6G,那会删1G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?
答: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,去随机删。
4volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
5volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐
6volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐
#ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。