第十八章:Redis的配置——设置Redis最大占用内存

更新于:2019-02-27 10:57:59

redis缓存固然高效,可是它会占用我们系统中宝贵的内存资源,特别是当我们的项目运行了一段时间后,我们需要看一下redis占用了多少内存,那么可以用“info”命令查看。


直接使用info命令会显示Redis所有的信息,我们只查看memory这一栏,所以可这样执行命令:


info memory


1.png


used_memory:855344 //数据占用了多少内存(字节)

used_memory_human:835.30K //数据占用了多少内存(带单位的,可读性好)

used_memory_rss:5992448  //redis占用了多少内存

used_memory_peak:856576 //占用内存的峰值(字节)

used_memory_peak_human:836.50K //占用内存的峰值(带单位的,可读性好)

used_memory_lua:37888  //lua引擎所占用的内存大小(字节)

mem_fragmentation_ratio:7.36  //内存碎片率

mem_allocator:jemalloc-5.1.0 //redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。


maxmemory:1073741824 //最大占用内存。

如果一个项目的数据量比较大,就要经常用info来看内存的使用量,这样才能让项目更稳定。


Redis一般默认是不限制最大占用内存的,也就是(maxmemory参数),为了不让Redis把服务器内存全部占用,我们需要给它设置一个合理的值。


设置的方法,修改配置文件maxmemory参数:


1.png


然后重启Redis。


提示:

不重启Redis修改配置参数的方法可直接在客户端命令行使用config命令。

config set 参数名 参数值
config get 参数名



如果不设置maxmemory或者设置为0,64位系统是不限制内存的,32位系统最多使用3GB内存。


一般推荐Redis设置最大内存为物理内存的一半,例如服务器的物理内存是4G,Redis最大内存可设置为2G。


Redis使用超过设置的最大值


既然提供了最大内存限制, 那么当我们程序达到最大值时, Redis使用了多种策略进行置换。如果设置了maxmemory,一般都要设置过期策略。


设置的方法,修改配置文件maxmemory-policy参数:


1.png


Redis有六种过期策略:


1.png


volatile-lru -> 使用LRU算法删除一个键(只对设置了生存时间的键)

allkeys-lru -> 使用LRU算法删除一个键

volatile-random -> 随机删除一个键(只对设置了生存时间的键)

allkeys-random -> 随机删除一个键

volatile-ttl -> 删除生存时间最近的一个键

noeviction -> 不删除,直接在写操作时返回错误(默认值)。


LRU算法,least Recently Used,最近最少使用算法。也就是说默认删除最近最少使用的KEY。

注意一点!redis并不会准确地删除所有键中最近最少使用的键,而是随机抽取n个键,删除这n个键中最近最少使用的键。这个n也是可以设置的,对应位置是配置文件中的maxmeory-samples。


LFU算法是新加的淘汰算法。


volatile-randomallkeys-random策略, Redis直接在相应的数据集上随机并置换.

volatile-ttl需要抽样, 抽样的大小由maxmemory-samples控制, 默认maxmemory-samples为5, 抽样越大算法精确度越高,但是消耗也越大.

volatile-lruallkeys-lru是对抽样的数据中选出最近最久未使用的Key置换出去.这里抽样的大小默认是16, 如果我们设置maxmemory-samples并且大于16的话, 抽样值和最大的保持一致.Redis设置了一个可置换池, 大小为16, 每次先进行抽样, 抽样之后与置换池中的数据进行比较, 选出最近最久未使用的16个Key放入置换池中, 从置换池中再选择一个Key进行置换。


扩展阅读《redis为什么内存不宜过大