在使用redis过程中,往往我们会忽视一些重要的因素,例如redis内存的限制与内存淘汰策略。
首先我们来说下redis内存限制
在redis配置文件中,影响redis使用系统内存的参数是maxmemory。查看当前maxmemory值可以通过redis-cli命令执行config get maxmemory查看。
例如,要配置1gb的最大内存使用值,可以在redis配置文件中修改# maxmemory <bytes>参数
maxmemory 1gb
|---|---------------| | 1 | maxmemory 1gb |
这样redis的内存使用限制最大值就为1gb,在64位系统环境下默认maxmemory为0,即没有内存限制(32位系统隐式内存限制3gb),也就是说redis将尝试使用系统中的所有可用内存,这会导致在某些场景下可能会导致系统资源被耗尽,因此在生产环境中,通常建议设置一个合理的maxmemory值来限制redis的内存使用。
接下来再说下redis的内存淘汰策略
如果内存达到了maxmemory最大值,并且没有配置淘汰的策略,那么在写入新的数据时,redis会返回错误,拒绝写入新的数据,可能会产生如下错误。
OOM command not allowed when used memory > 'maxmemory'.
内存淘汰策略可选的值有以下8种:
noeviction(默认策略):当内存不足时,redis会返回一个写入错误,这是最保守的策略,但也是最安全的,因为它不会删除任何数据。推荐用于那些不允许数据丢失的场景,但需要注意的是,这可能会影响业务正常运行。
allkeys-lru(最近最少使用):删除最近使用最少的keys,从而保留最近常用的keys。该策略不考虑keys的访问频率,而是更注重最近被访问的keys,认为这些keys可能是最有用的。
allkeys-lfu(最不经常用):删除最不常用的keys,从而保留常用的keys。该策略根据keys的访问频率来做出淘汰决策,即使某些keys最近没有被访问,但是他们的总访问频率很高,也会保留这些keys,通过计数统计来跟踪每个keys的访问次数,并根据这些统计结果来做出淘汰决策。
volatile-lru(有过期时间最近最少使用):内存淘汰的优先级是基于过期时间,然后在这些即将过期的keys种选择最近最少使用的keys进行删除。
volatile-lfu(有过期时间最近最不经常用):内存淘汰的优先级是基于过期时间,然后在这些即将过期的keys中选择最不常用的keys进行删除。
allkeys-random(随机删除):这种策略比较简单直接,不需要额外的计算判断,只需要随机选择一个keys进行删除即可。
volatile-random(有过期时间的随机删除):内存淘汰的优先级是基于过期时间,然后在这些即将过期的keys中,随机选择一个keys进行删除即可。
volatile-ttl(基于过期时间的删除):该策略会优先删除那些即将过期的keys,只考虑到期的时间,不考虑访问情况。
例如,要配置allkeys-lru,可以在redis配置文件中修改# maxmemory-policy noeviction参数
maxmemory-policy allkeys-lru
|---|------------------------------| | 1 | maxmemory-policy allkeys-lru |
修改完成后,在redis-cli中可通过config get maxmemory-policy查看当前的淘汰策略。
最后,在选择redis内存淘汰策略时,需要结合多个方面来进行考虑,比如数据的重要性、数据的访问频率,数据的一致性等,并根据实际效果进行调整和优化。