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:类似上面所说。

 

posted @ 2020-10-20 18:33  xzwcomeon  阅读(90)  评论(0编辑  收藏  举报