Redis:数据淘汰机制

设置多大的缓存容量

  • 如果把所有要访问的数据都放入缓存,性价比很低。
  • 一方面,1TB内存价格大概3.5万元,而1TB磁盘价格大约1000元;另一方面,数据的访问都是有局部性的。80%的请求可能只访问了20%的数据,所以把所有数据放入内存,并没有必要。
  • 实际应用中的数据访问是局部性的,以蓝线为例,80%的请求访问了20%的数据。然而当用户个性化数据较多时,可能表现为红线。
  • 所以容量设置需要根据数据实际访问特征和成本开销来考虑。建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。
    在这里插入图片描述
  • 使用如下命令设置缓存大小:
10.138.45.247:8379> CONFIG SET maxmemory 4GB
OK
10.138.45.247:8379> CONFIG GET maxmemory
1) "maxmemory"
2) "4294967296"

淘汰机制

  • 为了保证性价比,缓存的空间容量必然要小于数据库的数据总量。即便如此,随着业务发展要缓存的数据越来越多,有限的缓存空间不可避免会被写满。
  • 这个问题涉及到缓存系统的一个重要机制,即缓存数据的淘汰机制
  • 淘汰机制包括两步:
    • 根据一定策略,筛选出对应用访问来说不重要的数据
    • 将这些数据从缓存中删除,为新来的数据腾出空间。
  • Redis 4.0之前提供了6种淘汰策略,4.0之后又提供了2种淘汰策略。除去noeviction策略不会进行数据淘汰外,其他7种策略都会进行淘汰
  • 会进行数据淘汰的7种策略:
    • 在设置了过期时间的数据中进行淘汰,包括 volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis 4.0 后新增)四种。
    • 在所有数据范围内进行淘汰,包括 allkeys-lru、allkeys-random、allkeys-lfu(Redis 4.0 后新增)三种。
      在这里插入图片描述
  • 默认情况下,Redis 在使用的内存空间超过 maxmemory 值时,并不会淘汰数据,也就是设定的 noeviction 策略(3.0版本前默认volatile-ttl)。对应到 Redis 缓存,也就是指,一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。
  • volatile- 开头的淘汰策略。它们筛选的候选数据范围,被限制在已经设置了过期时间的键值对上。也正因为此,即使缓存没有写满,这些数据如果过期了,也会被删除。当然如果内存不够了,即使key的过期时间还未到,也会按照策略被选出来淘汰掉`。
    • volatile-ttl 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
    • volatile-random 在设置了过期时间的键值对中,进行随机删除。
    • volatile-lru 会使用 LRU 算法筛选设置了过期时间的键值对。
    • volatile-lfu 会使用 LFU 算法选择设置了过期时间的键值对,它是在 LRU 算法的基础上,同时考虑了数据的访问时效性和数据的访问次数,可以看作是对淘汰策略的优化。
  • allkeys开头的淘汰策略的备选淘汰数据范围,扩大到了所有键值对。如果一个键值对被删除策略选中了,即使它的过期时间还没到,也需要被删除。当然,如果它的过期时间到了但未被策略选中,同样也会被删除。
    • allkeys-random 策略,从所有键值对中随机选择并删除数据;
    • allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。
    • allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。
  • 使用如下命令设置和查看淘汰策略:
10.138.45.247:8379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
10.138.45.247:8379> config set maxmemory-policy volatile-lru
OK
10.138.45.247:8379> config get maxmemory-policy
1) "maxmemory-policy"
2) "volatile-lru"

建议

  • 优先使用 allkeys-lru 策略。这样,可以充分利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能。如果业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略
  • 如果业务中有置顶的需求,比如置顶新闻、置顶视频,可以使用 volatile-lru 策略,同时不给这些置顶数据设置过期时间。这样一来,这些需要置顶的数据一直不会被删除,而其他数据会在过期时根据 LRU 规则进行筛选。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值