zoukankan      html  css  js  c++  java
  • redis之作为缓存的使用(二)

    因为redis缓存的大小是远远低于数据库中的数据量,所以如果缓存满了的话,则要选择将缓存中的某些数据淘汰为新的数据腾出空间

    缓存数据的淘汰机制包括两步:第一,根据一定的策略,筛选出对应用访问来说“不重要”的数据;第二,将这些数据从缓存中删除,为新来的数据腾出空间,

    合理的缓存数据淘汰机制还有淘汰策略,能够提高缓存命中率,提升应用访问性能。

    redis淘汰策略:
    noeviction:不进行数据淘汰

    进行数据淘汰:
    在设置了过期时间的数据中进行淘汰:volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis  4.0 后新增)
    因为是对过期时间的数据进行淘汰,所以在键过期,或者缓存容量满了以后,过期键都会被删除

    volatile-ttl 在筛选时:会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。

    volatile-random:针对过期的键随机删除

    LRU:least recently used 最近最少使用  LRU会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据最近最不常用的数据。当缓存满了之后,即链表到达最末端,会删除LRU端的数据,然后将新访问的数据插入在MRU端(链头的位置)

    缺点:需要用链表管理所有的缓存数据,这会带来额外的空间开销。而且,当有数据被访问时,需要在链表上把该数据移动到 MRU 端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。

    redis对于lru算法的优化:

    Redis 中,LRU 算法被做了简化,以减轻数据淘汰对缓存性能的影响。Redis 默认会记录每个数据的最近一次访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录)。然后,Redis 在决定淘汰的数据时,第一次会随机选出 N 个数据,把它们作为一个候选集合。接下来,Redis 会比较这 N 个数据的 lru 字段,把 lru 字段值最小的数据从缓存中淘汰出去。通过maxmemory-samples参数来配置redis随机选出的数据个数。

    记住此时删除的必然是过期的键,如果没有过期的键redis会返回拒绝写入错误

    LFU:

    LFU 策略中会从两个维度来筛选并淘汰数据:一是,数据访问的时效性(访问时间离当前时间的远近)(这一点与lru相同);二是,数据的被访问次数。

    LFU 缓存策略是在 LRU 策略基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用 LFU 策略筛选淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出缓存。如果两个数据的访问次数相同,LFU 策略再比较这两个数据的访问时效性,把访问时间更久的数据淘汰出缓存。

    在所有数据范围内进行淘汰:allkeys-lru、allkeys-random、allkeys-lfu

    allkeys-lru:类比上面的讲解

    allkeys-random:从所有键值对中随机选择并删除数据;

    allkeys-lfu:类似上面所说。

  • 相关阅读:
    框架_爬虫如何应用(爬虫架构设计与实现)
    架构师_设计模式_结构型_代理模式
    7语法基础_CLR核心解析
    架构师_设计模式_结构型_享元模式
    架构师_设计模式_结构型_组合模式
    同源策略、跨域、Same-origin、Cross-origin
    ES(elasticsearch) query DSL 查询语法
    日志框架
    powerdesigner 名称、注释互转
    maven 可运行 jar 包的打包,包含依赖 jar 包
  • 原文地址:https://www.cnblogs.com/foreverlearnxzw/p/13840570.html
Copyright © 2011-2022 走看看