key的长度尽量要短,在数据量非常大时,过长的key名会占用更多的内存;
一定避免存储过大的数据(大value),过大的数据在分配内存和释放内存时耗时严重,会阻塞主线程;
Redis 4.0以上建议开启lazy-free
机制,释放大value时异步操作,不阻塞主线程;
建议设置过期时间,把Redis当做缓存使用,尤其在数量很大的时,不设置过期时间会导致内存的无限增长;
不使用复杂度过高的命令,例如SORT
、SINTER
、SINTERSTORE
、ZUNIONSTORE
、ZINTERSTORE
,使用这些命令耗时较久,会阻塞主线程;
查询数据时,一次尽量获取较少的数据,在不确定容器元素个数的情况下,避免使用LRANGE key 0 -1
,ZRANGE key 0 -1
这类操作,应该设置具体查询的元素个数,推荐一次查询100个以下元素;
写入数据时,一次尽量写入较少的数据,例如HSET key value1 value2 value3...
,控制一次写入元素的数量,推荐在100以下,大数据量分多个批次写入;
批量操作数据时,用MGET/MSET
替换GET/SET
、HMGET/MHSET
替换HGET/HSET
,减少请求来回的网络IO次数,降低延迟,对于没有批量操作的命令,推荐使用pipeline
,一次性发送多个命令到服务端;
禁止使用KEYS
命令,需要扫描实例时,建议使用SCAN
,线上操作一定要控制扫描的频率,避免对Redis产生性能抖动;
避免某个时间点集中过期大量的key,集中过期时推荐增加一个随机时间,把过期时间打散,降低集中过期key时Redis的压力,避免阻塞主线程;
根据业务场景,选择合适的淘汰策略,通常随机过期要比LRU过期淘汰数据更快;
使用连接池访问Redis,并配置合理的连接池参数,避免短连接,TCP三次握手和四次挥手的耗时也很高;
只使用db0
,不推荐使用多个db,使用多个db会增加Redis的负担,每次访问不同的db都需要执行SELECT
命令,如果业务线不同,建议拆分多个实例,还能提高单个实例的性能;
读的请求量很大时,推荐使用读写分离,前提是可以容忍从节数据更新不及时的问题;
写请求量很大时,推荐使用集群,部署多个实例分摊写压力;
运维层面主要是DBA需要关注的,目的是合理规划Redis的部署和保障Redis的稳定运行,主要优化如下:
readonly
slowlog
阈值,推荐10毫秒,并对其进行监控,产生过多的慢日志需要及时报警repl-backlog
大小,适当调大repl-backlog
可以降低主从全量复制的概率client-output-buffer-limit
大小,对于写入量很大的实例,适当调大可以避免主从复制中断问题info
信息时,使用长连接,频繁的短连接也会影响Redis性能expired_keys
、evicted_keys
、latest_fork_usec
指标,短时间内这些指标值突增可能会阻塞整个实例,引发性能问题原文:https://www.cnblogs.com/KL2016/p/14960742.html