软考2020高级架构师下午案例分析第4题:关于Redis数据类型、持久化、内存淘汰机制

【说明】

​ 某互联网文化发展公司因业务发展,需要建立网上社区平台,为用户提供一个对网络文化产品(如互联网小说、电影、漫画等)进行评论、交流的平台。该平台的部分功能如下:

(a)用户帖子的评论计数器;

(b)支持粉丝列表功能;

(c)支持标签管理;

(d)支持共同好友功能等;

(e)提供排名功能,如当天最热前10名帖子排名、热搜榜前 5 排名等;

(f)用户信息的结构化存储;

(g)提供好友信息的发布/订阅功能。

​ 该系统在性能上需要考虑高性能、高并发,以支持大量用户的同时访问。开发团队经过综合考虑,在数据管理上决定采用 Redis + 数据库(缓存+数据库)的解决方案。

【问题1】

​ Redis 支持丰富的数据类型,并能够提供一些常见功能需求的解决方案。清选择题干描述的(a)~(g)功能选项,填入表 4-1 中(1)~(5)的空白处。

表 4-1 Redis 数据类型与业务功能对照表:

数据类型 存储的值 可实现的业务功能
STRING 字符串、整数或浮点数 (1)
LIST 列表 (2)
SET 无序集合 (3)
HASH 包括键值对的无序散列表 (4)
ZSET 有序集合 (5)

分析:

本问题考察 Redis 数据库缓存产品基本数据类型的常见应用。

(1)STRING 类型:常规的 key/value 缓存应用,常规计数如粉丝数等;

(2)LIST 类型:各类列表应用,如关注列表、好友列表、订阅列表等;

(3)SET 类型:与 LIST 类似,但提供去重操作,也提供集合操作,可实现共同关注、共同喜好、共同好友等功能。

(4)HASH 类型:存储部分变更数据,如用户数据等。

(5)ZSET 类型:类似 SET 但提供自动排序,也可是心啊带权重的队列,如各类排行榜等。

答案:

(1)a

(2)b、g

(3)c、d

(4)f

(5)e

【问题2】

​ 该晚上社区平台需要为用户提供 7*24 小时的不间断服务。同时在系统出现宕机等故障时,能在最短时间内通过重启等方式重新建立服务。为此,开发团队选择了 Redis 持久化支持。Redis 有两种持久化方式,分别是 RDB(Redis DataBase)持久化方式和 AOF(Append Only File)持久化方式。开发团队最终选择了 RDB 方式。

​ 请用 200 字以内的文字,从磁盘更新频率、数据安全、数据一致性、重启性能和数据文件大小五个方面比较两种方式,并简要说明开发团队选择 RDB 的原因。

分析:

本问题考察 Redis 持久化存储的基本概念及应用。

Redis 提供了两种持久化存储的机制,分别是 RDB(Redis DataBase)持久化方式和 AOF(Append Only File)持久化方式。RDB 持久化方式是指在指定的时间间隔内将内存中的数据集快照写入磁盘,是 Redis 默认的持久化方式。AOF 方式是指 Redis 会将每一个收到的写命令都通过 write 函数追加到日志文件中。

答案:

(1)磁盘更新频率:AOF 比 RDB 文件更新频率高;

(2)数据安全:AOF 比 RDB 更安全;

(3)数据一致性:RDB 间隔一段时间存储,可能发生数据丢失和不一致;AOF 通过 append 模式写文件,即使发生服务器宕机,也可通过 redis-check-aop 工具解决数据一致性问题。

(4)重启性能:RDB 性能比 AOF 好;

(5)数据文件大小:AOF 文件比 RDB 文件大。

综合上述五个方面的比较。考虑在系统出现宕机等故障时,需要在最短时间内通过重启等方式重新建立服务,因此开发团队最终选择了 RDB 方式。

【问题3】

​ 缓存中存储当前的热点数据,Redis 为每个 KEY 值都设置了过期时间,以提高缓存命中率。为了清除非热点数据,Redis 选择“定期删除+惰性删除”策略。如果该策略失效,Redis 内存使用率会越来越高,一般应采用内存淘汰机制来解决。

​ 请用 100 字以内的文字简要描述该策略的失效场景,并给出三种内存淘汰机制。

分析:

本问题考察 Redis 使用过程中数据清除相关的概念。

定期删除策略:Redis 默认会每秒进行 10 次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心算法,从过期字典中随机 20 个 key,如果过期的 key 比率超过 1/4,那就会重复上一步骤。

惰性删除:除了定期遍历之外,它还会再客户端访问这个 key 的时候,对 key 的过期时间进行检查,如果过期了就立即删除,不会返回任何东西。

答案:

失效场景:如果“定期删除”没删除 KEY,也没及时去请求 KEY,也就是说“惰性删除”也没生效。这样,Redis 默认的“定期删除+惰性删除”策略就失效了。

对此,可采用内存淘汰机制解决:

(1)从已设置过期时间的数据集中选择最近最少使用的数据淘汰;

(2)从已设置过期时间的数据集中选择将要过期的数据淘汰;

(3)从已设置过期时间的数据集任意选择数据淘汰;

(4)从数据集最近最少使用的数据淘汰;

(5)从数据集任意选择数据淘汰。

整理完毕,完结撒花~

猜你喜欢

转载自blog.csdn.net/qq_33204709/article/details/127838751