redis 性能配置

性能相关的数据指标

      (1)最近在项目中遇到Redis的一个问题,在初启动redis时(或 flashdb 清除当前所有的keys),从redis的pool中获取数据是很快的,可随着访问次数的增加,key的增加,速度会越来越慢,当清理(flashdb)keys时速度回到最初的速度,非常的快。

      (2)基于这样的现象,我们首先就需要查看一下当前的radis 的配置信息情况:

查看配置 ,我们线上redis_version:2.6.14,最大内存设置的4g,没有设置MAXMEMORY POLICY,采用的默认配置。

maxmemory 4g

# The default is:
# maxmemory-policy volatile-lru 

查看info,最大时使用了3.73G

# Memory
used_memory:37306816 # Redis 分配的内存总量
used_memory_human:35.58M(与used_memory相等)

used_memory_rss:38125568 # Redis 分配的内存总量(包括内存碎片)
used_memory_peak:3999999912#Redis所用内存的高峰值
used_memory_peak_human:3.73G (与used_memory_peak相等)
used_memory_lua:31744 
mem_fragmentation_ratio:1.02 # 内存碎片比率
mem_allocator:jemalloc-3.2.0 

内存碎片比率:

redis 性能配置

      (3) 我们知道,Redis设置配置文件的maxmemory参数,可以控制其最大可用内存(字节)。那么当所需内存,超了maxmemory怎么办? 这里就需要配置中的maxmemory-policy 。

这里特别需要注意的是,如果不给maxmemory设置值的话,那么就会有一个默认值0,这样就不会给redis的空间限制。

         特别需要注意的是,不设置maxmemory, 如果你运行redis的服务器内存在你可以预见的业务增长空间可以存放所有业务数据,若无法保证,那么不设置maxmemory的限制,很有可能会导致redis-server 在运行一段时间后oom

  1. 使用swap危害:磁盘性能下降,持久化时间过长,可能出现暂停服务。
  2. oom危害:暂停服务,意外Crash(windows版本上十分明显)

     最近在项目中遇到Redis的maxmemory达到使用上限的问题,特地又回过头来看了下关于maxmemory的配置。

在我本机上我给radis 设置了1.20G的内存空间,当空间达到或者说将要达到的时候就会触发一种处理机制也就是过期策略。

 redis 中的默认的过期策略是 volatile-lru 。

设置方式   

config set maxmemory-policy volatile-lru

maxmemory-policy 六种方式

1、volatile-lru:只对设置了过期时间的key进行LRU(默认值) 

2、allkeys-lru : 删除lru算法的key   

3、volatile-random:随机删除即将过期key   

4、allkeys-random:随机删除   

5、volatile-ttl : 删除即将过期的   

6、noeviction : 永不过期,返回错误

      (4) 在这里我发现一个问题,就是这个策略的选择,在我没有设置maxmemory-policy 时,上面已经说了,默认是volatile-lru,但是他是只对设置了过期时间做处理,我们假设一下,如果说我们设置的key并没有过期那 策略机制要如何处理?

在这里我做了一个测试,我做了一个循环添加key ,我这里value是在数据库查询的实体类(这样能够保证对内存空间变化的有个清晰的观测),

在key创建的时候,我就给设定过期时间(7天),最后很不幸,我的radis感觉已经死掉了,几分钟都不动。

      应用radis就是为了速度,可是现在却有点本末倒置了,用了radis反而确是更慢了,我将radis注掉之后,直接在数据库上取都要比此时的radis快。在这里就要想到另一个问题,那就是你这里为什么要设置7天,而不是设置1天,或者1个小时,1分钟?,但是我想说,如果只是设置短短的时间那么是否应用radis就没有什么必要了。毕竟radis也是有消耗的,那么这时候我们就要考虑你过期时间的设置,不过你这里就需要了解你keys生成和销毁的数量和速度,使其达到一个平衡。

      在这里我使用了另一种策略:volatile-random(随机删除即将过期key),

首先打开radis配置文件(radis.conf) 

进行如下配置

maxmemory-policy volatile-random
maxmemory 567824856

      同样,继续用上面的循环创建key的方法,不过我是每次循环都创建两个key,第一个key名称是redisCacheKeyTest_+i,并且设置时间为(7)天,第二个key名称设置为redisCacheKeyTest10000_+i设置时间为(30min),此时在运行时,你就可以观察redis 的info:

redis 性能配置

(图中的是刚开始的值,evicted_keys是0),

     (5)随着key的创建,used_memory会慢慢达到最高,此时你可以查看一下你当前redis的所有的key,(命令:keys *) 这样你就会看到所有的key (redisCacheKeyTest_ 和 redisCacheKeyTest10000_ ),

此时的redis内存空间已经接近满了,redis策略机制它的作用就显现出来了,你会发现evicted_keys的值会一段数值一段数值的增加,并且观察你的内存空间的使用情况,你会很明显发现,内存空间会突然减少,然后在慢慢增加。 内存空间值的变化就是因为redis策略发挥了作用,它将一部分key删除掉了,到底是删除那些key了呢?我们查看一下 redis的info,你会发现此时几乎前缀为redisCacheKeyTest10000_的key就都消失了。因为期初我设置的前缀为redisCacheKeyTest10000_的key设置的过期时间为30min,而前缀为redisCacheKeyTest的key过期时间为7天,显而易见,volatile-random 删除了随机删除前缀为redisCacheKeyTest10000_的key。此时,我们的测试就结束了。

相关推荐