浅谈redis的maxmemory设置以及淘汰策略

 更新时间:2017年03月27日 09:05:47   投稿:jingxian  
下面小编就为大家带来一篇浅谈redis的maxmemory设置以及淘汰策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

redis的maxmemory参数用于控制redis可使用的最大内存容量。如果超过maxmemory的值,就会动用淘汰策略来处理expaire字典中的键。

关于redis的淘汰策略:

Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:

·   noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。

·   allkeys-lru:在主键空间中,优先移除最近未使用的key。

·   volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。

·   allkeys-random:在主键空间中,随机移除某个key。

·   volatile-random:在设置了过期时间的键空间中,随机移除某个key。

·   volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

PS:

关于maxmemory的设置,如果redis的应用场景是作为db使用,那不要设置这个选项,因为db是不能容忍丢失数据的。

如果作为cache使用,则可以启用这个选项(其实既然有淘汰策略,那就是cache了。。。)

但是在集群环境下(尤其是有多个slavers的情形),maxmeomory的值并不是实际redis使用的内存,这个选项值并没有包括slaver的output buffer。

redis早期版本出过一个bug,在多个slaver的情形下,设置了maxmemory值,同时设定了淘汰策略,会造成master上的数据被渐渐擦除。

antirez先生给出了这个问题的原因:

The issue happens for the following reason:
 
Redis reached the configured limit, so it tries to expire keys.
Evicting keys turns into explicit DELs sent to slaves, since masters control the eviction of slaves for well known reasons.
But this way if there are enough slaves, emitting the protocol in the output buffers will actually take more memory than the amount freed removing keys...
So the key eviction process starts to enter into an infinite loop.
Up to a given point the fact that there is a static buffer part in the output queue of every client (including slaves) mitigate this in certain conditions, but once Redis can't use the output buffer but must use the queue of objects the infinite loop is triggered. 

简单说来,删除过期键,需要产生del命令发送给slaver,如果slaver足够多,output buffer将会占用足够多的内存,导致更多的键过期,如此往复,陷入了无线循环。

解决方案有多种,比如output buffer可以不计入maxmemory。

因此,在3.0版本的配置说明中有了以下表述:

# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes></bytes> 

由此可见,如果有slaver的情况下,建议适当调低maxmemory,给output buffer留出一定的可用空间是合理的。

以上这篇浅谈redis的maxmemory设置以及淘汰策略就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Redis实现UV统计的示例代码

    Redis实现UV统计的示例代码

    本文主要介绍了Redis实现UV统计的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Redis实现限量优惠券的秒杀功能

    Redis实现限量优惠券的秒杀功能

    文章详细分析了避免超卖问题的方法,包括确保一人一单的业务逻辑,并提供了代码实现步骤和代码示例,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • redis反序列化报错原因分析以及解决方案

    redis反序列化报错原因分析以及解决方案

    这篇文章主要介绍了redis反序列化报错原因分析以及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • redis不能访问本机真实ip地址的解决方案

    redis不能访问本机真实ip地址的解决方案

    这篇文章主要介绍了redis不能访问本机真实ip地址的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • redis缓存一致性延时双删代码实现方式

    redis缓存一致性延时双删代码实现方式

    这篇文章主要介绍了redis缓存一致性延时双删代码实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Redis高可用的三种实现方式

    Redis高可用的三种实现方式

    在实际生产环境中为保证Redis的服务连续性和可靠性,需要设计一个高可用架构,本文就来介绍一下Redis高可用的三种实现方式,主要包括主从复制模式,Redis Sentinel模式和Redis Cluster模式,感兴趣的可以了解一下
    2023-12-12
  • 关于Redis网络模型的源码详析

    关于Redis网络模型的源码详析

    这篇文章主要给大家介绍了关于Redis网络模型的源码,文中通过示例代码介绍的非常详细,对大家的学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • Redis 出现错误1067的解决办法

    Redis 出现错误1067的解决办法

    这篇文章主要介绍了Redis 出现错误1067的解决办法的相关资料,Redis 错误1067:进程意外终止,Redis不能启动,Redis启动不了,需要的朋友可以参考下
    2017-07-07
  • Redis缓存异常常用解决方案总结

    Redis缓存异常常用解决方案总结

    Redis缓存异常问题分别是缓存雪崩,缓存预热,缓存穿透,缓存降级,缓存击穿,本文主要介绍了Redis缓存异常常用解决方案总结,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • RedisDesktopManager 连接redis的方法

    RedisDesktopManager 连接redis的方法

    这篇文章主要介绍了RedisDesktopManager 连接redis,需要的朋友可以参考下
    2023-08-08

最新评论