设置多大的缓存容量
- 如果把所有要访问的数据都放入缓存,性价比很低。
- 一方面,1TB内存价格大概3.5万元,而1TB磁盘价格大约1000元;另一方面,数据的访问都是有局部性的。80%的请求可能只访问了20%的数据,所以把所有数据放入内存,并没有必要。
- 实际应用中的数据访问是局部性的,以蓝线为例,80%的请求访问了20%的数据。然而当用户个性化数据较多时,可能表现为红线。
- 所以容量设置需要根据数据实际访问特征和成本开销来考虑。建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/98b0d295424476ec8574ab244c836a80.png)
- 使用如下命令设置缓存大小:
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 后新增)三种。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/42cd856063de6f25439b8802601a6e58.png)
- 默认情况下,
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 规则进行筛选。