面试题答案
一键面试缓存更新策略
- Write - Through策略
- 设计思路:当数据发生变化时,同时更新缓存和数据库。确保缓存与数据库数据的一致性,避免缓存中出现过期数据,从而减少因数据不一致导致的缓存未命中情况。
- 实现步骤:
- 在业务逻辑中,当用户发布新动态、点赞数或评论数发生变化时,先更新数据库相应记录。
- 紧接着更新缓存中对应的用户动态相关数据。例如,使用Redis的SET命令更新缓存中的用户动态信息。
- Write - Back策略
- 设计思路:在数据更新时,只更新缓存,标记缓存为脏数据。在合适的时机(如系统负载较低时)批量将脏数据刷回数据库。这种策略可以减少数据库的直接写入压力,适用于高并发写入场景,但要注意数据一致性问题。
- 实现步骤:
- 当用户动态相关数据更新时,先在缓存中标记该数据为脏数据(可通过设置特定标志位)。
- 启动一个后台线程或定时任务,在系统负载较低时(如凌晨时段),遍历缓存中的脏数据,批量更新到数据库,并清除脏数据标记。
缓存过期策略
- TTL(Time - To - Live)
- 设计思路:为缓存中的每个数据项设置一个过期时间。对于一些不经常变化且更新成本较高的数据,设置较长的TTL;对于变化频繁的数据,设置较短的TTL。这样可以在保证数据新鲜度的同时,避免缓存数据长期占用内存。
- 实现步骤:
- 在将用户基本信息、发布内容等数据写入缓存时,根据数据的更新频率设置相应的TTL。例如,用户基本信息更新频率低,可设置TTL为一天;点赞数、评论数更新频繁,设置TTL为几分钟。
- 使用Redis的SETEX命令(或其他支持设置过期时间的命令)来设置缓存数据及其过期时间。
- LFU(Least Frequently Used)
- 设计思路:淘汰使用频率最低的数据。在社交平台中,对于一些很少被查看的用户动态相关数据(如很久以前发布且很少有人点赞、评论的动态),可以使用LFU策略将其从缓存中移除,为更常用的数据腾出空间。
- 实现步骤:
- 选择支持LFU策略的缓存系统,如Redis在某些版本中支持近似LFU。
- 配置缓存系统的LFU相关参数,如LFU的计数器衰减因子等,以适应社交平台数据访问特点。
缓存架构优化 - 多级缓存
- 设计思路:构建多级缓存,如分为一级缓存(靠近应用层,速度快但容量小,如本地内存缓存)和二级缓存(容量较大但速度稍慢,如分布式缓存Redis)。一级缓存用于存储最常用的热点数据,减少对二级缓存的访问;二级缓存作为一级缓存的补充,存储更多的数据。
- 实现步骤:
- 一级缓存:
- 在应用服务器的本地内存中构建缓存,可使用Guava Cache等工具。
- 当应用请求用户动态数据时,首先从一级缓存中查找。如果命中,直接返回数据;否则,进入二级缓存查找。
- 二级缓存:
- 搭建分布式缓存集群,如Redis集群。
- 当一级缓存未命中时,从二级缓存中查找。若二级缓存命中,将数据加载到一级缓存中,并返回给应用;若二级缓存也未命中,则从数据库查询,将数据同时写入一级和二级缓存。
- 一级缓存: