配置
如何查看
1.在redis安装目录下找到redis.conf,打开找到如下行:
# maxmemory <bytes>
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select one from the following behaviors:
#
# volatile-lru -> Evict using approximated LRU, only keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key having an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
其中的maxmemory <bytes>即为最大内存配置项,默认是注释掉的会采用默认的最大内存大小:在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB。
2.在客户端通过命令行查看
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"
这里结果为0表示未手动指定过最大内存,采用默认的最大内存。
在生产环境的配置
一般推荐Redis设置内存为最大物理内存的四分之三。
如何配置
1.在配置文件redis.conf中指定maxmemory参数,例如,如果最大内存是200M,则在配置文件中添加maxmemory 209751200
;
2.通过命令config set maxmemory 209751200
设置,注意,这里如果是通过命令行设置的最大内存大小,在配置文件redis.conf中并不会添加maxmemory 209751200
这一行内容。
查看Redis内存状态
127.0.0.1:6379> info memory
# Memory
used_memory:865200
used_memory_human:844.92K
used_memory_rss:8273920
used_memory_rss_human:7.89M
used_memory_peak:887656
used_memory_peak_human:866.85K
used_memory_peak_perc:97.47%
used_memory_overhead:820082
used_memory_startup:802984
used_memory_dataset:45118
used_memory_dataset_perc:72.52%
Redis内存淘汰策略
当Redis达到最大的可用内存时,再向其中存入数据则会报OOM,因此,要避免无限制存入数据导致OOM,则需要采用合适的内存淘汰策略。
127.0.0.1:6379> config set maxmemory 1
OK
127.0.0.1:6379> set li 12
(error) OOM command not allowed when used memory > 'maxmemory'.
127.0.0.1:6379>
Redis过期键的删除策略
在讨论Redis的内存淘汰策略之前,我们要先对Redis中过期键的删除机制有个大体的了解;实际上,过期键的删除策略有三种,每种策略下过期键的删除时机均不同。
1.定时删除
所谓定时删除,就是在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即删除对键的删除操作。其能够对过期键进行立即删除,对内存是友好的,但是因为要维护定时器,对cpu是不友好的。
2.惰性删除
所谓惰性删除,就是放任过期键不管,但每次获取键时,都检查取得的键是否过期,如果过期的话,就删除该键。如果没有过期,就返回该键。惰性删除对cpu友好,但是由于其无法主动删除过期键,当过期键大量积聚时会占用很大内存,对内存不友好。
3.定期删除
所谓定期删除,是前两种删除策略的一种折中。会每隔一段时间执行一次删除过期键操作,并通过限制操作执行的时长和频率来减少删除操作对cpu时间的影响。
定期删除会周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度,其特点为:
a)CPU占用设置有峰值,检测频度可自定义设置。
b)内存压力有限,长期占用内存的冷数据会被持续清理。
总结下来,定期删除会周期性抽查存储空间(随机抽查、重点抽查)。
定期删除的难点在于如何确定产出操作执行的时长和频率,如果删除操作执行的太过频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过多的消耗在删除键上面。如果删除操作执行的太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现内存浪费的情况。因此,必须合理的设置定期删除策略的执行时长和执行频率。
定期删除在一定程度上是一种合理有效的过期键删除策略,但是由于其在执行时长和执行频度的局限性,必须要有另一种机制(策略)确保内存能够获得回收,因此,就需要引入内存淘汰策略。
在redis.conf中指出内存淘汰策略有有以下八种:
1.volatile-lru:从已设置过期时间的key中挑选最近最少使用的数据淘汰;
2.allkeys-lru:从全部key中挑选最近最少使用的数据淘汰;
3.volatile-lfu:从已设置过期时间的key中挑选使用频率最低的数据淘汰;
4.allkeys-lfu:从全部key中挑选使用频率最低的数据淘汰;
5.volatile-random:从已设置过期时间的key中任意选择数据淘汰;
6.allkeys-random:从全部key中任意选择数据淘汰
7.volatile-ttl:从已设置过期时间的key中挑选将要过期的数据淘汰;
8.no-enviction:禁止驱逐数据,这也是默认策略。当内存不足以容纳新入数据时,新写入操作就会报错。
内存淘汰策略的设置与查看
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> config set maxmemory-policy allkeys-lru
OK
127.0.0.1:6379>
网友评论