redis性能优化

1、避免慢查询命令

慢查询也就是执行命令的时候较慢的命令,redis自身提供了很多命令,慢查询与命令的操作复杂度有关系

比如:

  • 如果value的类型为string,那么在执行set/get/append命令时主要是操作redis的哈希表索引,这个操作复杂度为O(1),注意是大写字母O,不是零(0),这个复杂度在redis文档中可查
  • 如果value的类型为Zset的时候,如果执行zrange/zrevrange命令时,操作复杂度就是O(log(n)+k),k为要获取成员个数,n为当前成员个数,这个复杂度就增加了很多
  • 如果value的类型为set,那么在执行smembers命令时,操作复杂度为O(N),n为元素总数,操作复杂度增加了很多

如果查询存在很多慢查询,可通过如下方式优化:

  • 用其他命令替代,比如上述的smembers获取全部元素,此时可以使用SSCAN遍历元素,避免一次返回大量元素
  • 在客户端执行一些相关操作,比如排序、交集、并集等操作

2、尽量避免使用keys*

这个命令是阻塞的,在执行期间,客户端无法执行写入操作,如果数据量很大,执行keys*会严重影响性能,可使用SCAN来代替

3、给key设置过期时间

redis中的数据都是在内存中,内存占用过大会影响性能,设置合理的过期时间定期删除过期数据

4、避免给过多的key设置相同的过期时间

默认情况下,redis每过100毫秒会删除一些过期的key,算法如下:

  • ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP:此参数默认值为20,表示100毫秒内随机抽取20个key,检查是否过期,如果过期了就删除
  • 如果redis中有超过25%的key过期了,那么redis会一直删除过期key,直到过期key的比例降低到25%以下

从上述算法可以看出,redis在100毫秒内最多删除20个key,1s内就会删除200个key,这对性能影响可以接受,但是如果key过多,超过了25%,那么就会一直不停的执行删除下去,此时就会影响性能,因为redis删除Key是阻塞的,删除期间不可用(redis4之后可以用异步线程机制减少阻塞影响),因此一定要避免给大量的key设置相同的过期时间

5、检查持久化策略

如果redis仅仅用来做缓存,并且数据不需要持久化的情况下,可将持久化RDB和AOF关闭,AOF默认关闭的,RDB可将save字段注释即可,因为持久化过程中redis是阻塞的,此时不可写入,影响性能

6、更换SSD硬盘

如果需要开启数据持久化,那么最好使用SSD硬盘

7、使用物理机

物理机相比虚拟机可以提供更好的性能

8、增加机器的内存,避免使用swap

如果机器内存不足,就会使用swap,swap是机器磁盘上划分的一块区域来使用的虚拟内存,swap操作的是磁盘数据,如果数据过大对性能非常大,因此建议增加机器内存

9、使用redis集群

redis集群采用哈希槽(slot)机制,每个节点的槽数量约为16384/节点数量,key存储在哪个槽的计算方式为

slot = CRC16(key) & 16384   #注意是取余

获得到槽(slot)的值后,根据这个值找到槽所在的节点,然后设置key即可,此种方式可将读写压力从一台机器分散到多台机器上,从而提高性能

10、清理内存碎片(redis 4.0以上版本才有)

redis长时间使用会导致内存碎片过多,此时需要清理内存碎片,首先查看内存碎片,执行命令如下:

info memory

mem_fragmentation_ratio表示内存碎片率,这个值就是used_memory_rss/used_memory得来的,此值有两种情况:

  • mem_fragmentation_ratio:大于 1 但小于 1.5,这种情况是合理的
  • mem_fragmentation_ratio:大于 1.5 。这表明内存碎片率已经超过了 50%,此时需要清理

注:used_memory_rss是系统分配给redis的物理内存空间,里面包含碎片,used_memory是redis为了保存数据实际申请使用的空间

自动清理内存碎片,默认情况下内存碎片是关闭的,如图:

修改redis.conf,开启碎片清理开关,如下:

#内存碎片开关
activedefrag yes   
#内存碎片达到多少的时候开启整理
active-defrag-ignore-bytes 100mb
# 碎片率达到百分之多少开启整理
active-defrag-threshold-lower 10
# 碎片率小余多少百分比开启整理
active-defrag-threshold-upper 100
# Minimal effort for defrag in CPU percentage
active-defrag-cycle-min 25
# Maximal effort for defrag in CPU percentage
active-defrag-cycle-max 75

配置完成后重启redis即可

手动清理内存碎片,执行命令如下:

memory purge

标签