阅读以下关于数据库缓存的叙述,回答问题1至问题3。
【说明】
某互联网文化发展公司因业务发展,需要建立网上社区平台,为用户提供一个对网络文化产品(如互联网小说、电影、漫画等)进行评论、交流的平台。该平台的部分功能如下:
(a)用户帖子的评论计数器;
(b)支持粉丝列表功能;
(c)支持标签管理;
(d)支持共同好友功能等;
(e)提供排名功能,如当天最热前10名帖子排名、热搜榜前5排名等;
(f)用户信息的结构化存储;
(g)提供好友信息的发布/订阅功能。
该系统在性能上需要考虑高性能、高并发,以支持大量用户的同时访问。开发团队经过综合考虑,在数据管理上决定采用Redis+数据库(缓存+数据库)的解决方案。
【问题1】(10分)
Redis支持丰富的数据类型,并能够提供一些常见功能需求的解决方案。请选择题干描述的(a) ~ (g) 功能选项,填入表4-1中(1) ~ (5)的空白处。
【问题2】(7分)
该网上社区平台需要为用户提供7×24小时的不间断服务。同时在系统出现宕机等故障时,能在最短时间内通过重启等方式重新建立服务。为此,开发团队选择了Redis 持久化支持。Redis有两种持久化方式,分别是RDB(Redis DataBase)持久化方式和AOF (Append OnlyFile)持久化方式。开发团队最终选择了RDB方式。请用200字以内的文字,从磁盘更新频率、数据安全、数据一致性、 重启性能和数据文件大小五个方面比较两种方式,并简要说明开发团队选择RDB的原因。
【问题3】(8分)
缓存中存储当前的热点数据,Redis 为每个KEY值都设置了过期时间,以提高缓存命中率。为了清除非热点数据,Redis 选择“定期删除+惰性删除”策略。如果该策略失效,Redis内存使用率会越来越高,一般应采用内存淘汰机制来解决。请用100字以内的文字简要描述该策略的失效场景,并给出三种内存淘汰机制。
【问题1】
(1) (a)
(2) (b)、(g)
(3) (c)、(d)
(4) (f)
(5) (e)
【问题2】
磁盘更新频率:AOF比RDB文件更新频率高。
数据安全:AOF比RDB更安全。
数据一致性: RDB间隔一段时间存储,可能发生数据丢失和不一致;AOF 通过append模式写文件,即使发生服务器宕机,也可通过redis-check-aof 工具解决数据一致性问题。
重启性能:RDB性能比AOF好。
数据文件大小:AOF 文件比RDB文件大。
综合上述五个方面的比较,考虑在系统出现宕机等故障时,需要在最短时间内通过重启等方式重新建立服务,因此开发团队最终选择了RDB方式。
【问题3】
失效场景:如果“定期删除”没删除KEY,也没即时去请求KEY,也就是说“惰性删除”也没生效。这样,Redis 默认的“定期删除+惰性删除”策略就失效了。
对此,可采用内存淘汰机制解决:
(1)从已设置过期时间的数据集最近最少使用的数据淘汰。
(2)从已设置过期时间的数据集将要过期的数据淘汰。
(3)从已设置过期时间的数据集任意选择数据淘汰。
(4)从数据集最近最少使用的数据淘汰。
(5)从数据集任意选择数据淘汰。
【问题1】
【问题2】
Redis中的两种主要持久化机制:RDB(Redis Database)和AOF(Append Only File)。RDB是通过在指定的时间间隔内将内存中的数据集快照写入磁盘来实现持久化的,而AOF则是将每一个写命令都追加到日志文件中。两种方式的比较主要包括:(1)磁盘更新频率:AOF比RDB文件更新频率高。(2)数据安全:AOF比RDB更安全。(3)数据一致性:RDB间隔一段时间存储,可能发生数据丢失和不一致;AOF通过append模式写文件,即使发生服务器宕机,也可通过 redis-check-aof工具解决数据一致性问题。(4)重启性能:RDB性能比AOF好。(5)数据文件大小:AOF文件比RDB文件大。
然后在系统出现宕机等故障时,需要在最短时间内通过重启等方式重新建立服务,重启性能成为选择持久化机制时最需要考虑的因素。在这种情况下,RDB持久化方式确实是一个合适的选择,因为它在重启时能够更快地加载数据,从而更快地恢复服务。
【问题3】
过期策略:即redis针对过期的key使用的清除策略,策略为:定期删除+惰性删除。
1、定期删除:
redis会将每个设置了过期时间的key放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的key。redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如redis存了几十万个key ,每隔100ms就遍历所有的设置过期时间的key的话,就会给CPU带来很大的负载。
2、惰性删除:
所谓惰性策略就是在客户端访问这个key的时候,redis对key的过期时间进行检查,如果过期了就立即删除,不会给你返回任何东西。
定期删除可能会导致很多过期key到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。这就是所谓的惰性删除,即当你主动去查过期的key时,如果发现key过期了,就立即进行删除,不返回任何东西。
由于redis定期删除是随机抽取检查,不可能扫描清除掉所有过期的key并删除,然后一些key由于未被请求,惰性删除也未触发。这样redis的内存占用会越来越高。此时就需要内存淘汰机制。
主要有如下一些策略:
1、volatile-lru:从设置过期时间的数据集中挑选出最近最少使用的数据淘汰。没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。
2、volatile-ttl:除了淘汰机制采用LRU,策略基本上与volatile-lru相似,从设置过期时间的数据集中挑选将要过期的数据淘汰,ttl值越小越优先被淘汰。
3、volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个key。
4、allkeys-lru:从数据集中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key集合,而非过期的key集合。
5、allkeys-random:从数据集中选择任意数据淘汰。
6、no-enviction:禁止驱逐数据,也就是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失,这也是系统默认的一种淘汰策略。