zoukankan      html  css  js  c++  java
  • Redis内存回收策略

     

    如果使用Redis的时候,不合理使用内存,把什么东西都放在内存里面,又不设置过期时间,就会导致内存的堆积越来越大。根据28法则,除了20%的热点数据之外,剩余的80%的非热点或不怎么重要的数据都在占用内存空间,这时就要使用一种淘汰策略来释放一些内存。Redis中提供了多种内存回收策略,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对 象,释放这些对象占用的空间,那么选择淘汰哪些对象呢?
    在redis.conf 里面有个配置策略 maxmemory-policy ,它有几个可选值:

    noeviction: 默认的策略,即当内存使用达到阈值的时候,所有引起申请内存的命令都会报错;
    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 。
    适用场景: 如果我们的应用对缓存的访问都是相对热点数据,就可以选择这个策略;
    allkeys-random:随机移除某个key。
    适合的场景:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

    从已经设置了过期时间的key中去选择
    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
    volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;适合场景:这种策略使我们可以向Redis提示哪些key更适合被淘汰,可以自己控制 。

    那么怎样保证Redis里面的数据都是热点数据?
    可以使用LRU的淘汰策略,选择最近最少使用的数据全部淘汰掉,剩下的就是经常访问的数据,都是热点数据。

    总结
    实际上Redis实现的LRU并不是可靠的LRU,也就是名义上我们使用LRU算法淘汰内存数据,但是实际上被淘汰的键 并不一定是真正的最少使用的数据,这里就要权衡了,如果需要在所有的数据中搜索符合条件的数 据,那么一定会增加系统的开销,Redis是单线程的,所以耗时的操作会谨慎一些。为了在一定成本内实现相对的 LRU,早期的Redis版本是基于采样的LRU,也就是放弃了从所有数据中搜索解,改为采样空间搜索优解。Redis3.0 版本之后,Redis作者对于基于采样的LRU进行了一些优化,目的是在一定的成本范围内让结果更靠近真实的LRU。

  • 相关阅读:
    Entity Framework 学习高级篇1—改善EF代码的方法(上)
    Entity Framework 学习高级篇2—改善EF代码的方法(下)
    Entity Framework 学习中级篇5—使EF支持Oracle9i
    Window API 之 PostMessage (消息投递)
    从image/xpng谈ContentType(s)
    SQL中使用 N 前缀的原因
    Delphi初浅入门笔记之一 :ObjectPascal基础
    写入DLL文件
    SQL Server 2005和SQL Server 2000中bit类型的区别
    HTML <a> 标签的 target 属性说明
  • 原文地址:https://www.cnblogs.com/williamjie/p/11251177.html
Copyright © 2011-2022 走看看