面试题答案
一键面试数据结构选择
- 哈希(Hash)结构:适用于存储单条复杂数据记录。例如在电商商品详情场景中,商品详情涉及多个字段如价格、库存、描述等。将商品ID作为哈希的键,各个字段作为哈希的域(field)和值(value)存储。这样可以快速定位和获取商品的特定信息,减少内存占用。以一个手机商品为例,键为“product:123”,域“price”对应值“3999”,“stock”对应值“100”等。
- 有序集合(Sorted Set):当需要根据某个分数(score)进行排序和范围查询时使用。比如在一个文章排行榜场景中,以文章ID作为成员(member),文章的阅读量作为分数(score)。可以通过阅读量快速获取热门文章排行,如获取阅读量前10的文章。同时能根据阅读量范围查询特定区间的文章。
缓存分层设计
- 前端缓存(Browser Cache):对于一些不经常变化且实时性要求稍低的数据,如网站的静态资源(CSS、JS、图片等),可利用浏览器缓存。这大大减轻了后端服务器和Redis的压力。例如新闻网站的logo图片,长期不变化,浏览器第一次请求后缓存,后续用户访问直接从本地加载。
- 本地缓存(Local Cache):在应用服务器层面设置本地缓存,如使用Guava Cache。对于一些频繁访问且相对稳定的数据,应用服务器可先从本地缓存获取。例如在一个用户信息展示页面,用户基本信息(如用户名、头像等)变化频率低,应用服务器首次从Redis获取后缓存到本地,后续相同请求直接从本地缓存返回。当数据发生变化时,及时更新本地缓存和Redis。
- Redis缓存:作为核心缓存层,存储热点数据。在多表关联查询场景下,例如电商订单统计,将订单相关聚合数据缓存。可以按照时间维度(如按天、周、月)进行缓存,将每天的订单总金额、订单数量等聚合数据缓存到Redis。对于实时性要求高的数据,通过合理设置缓存更新机制保证数据一致性。
失效策略优化
- 定期删除(Periodic Deletion):结合业务特点,定期删除过期数据。例如在促销活动场景中,活动有明确的开始和结束时间。在活动开始前,将活动相关数据缓存到Redis,并设置过期时间为活动结束时间。Redis定期检查并删除过期的活动数据,避免无效数据占用内存。
- 惰性删除(Lazy Deletion):当访问数据时,发现数据已过期则删除。适用于一些访问频率较低的缓存数据。比如在一个低频查询的历史订单统计场景中,当用户查询多年前的订单统计数据时,若发现缓存数据过期,删除并重新查询MySQL生成新的缓存数据。
- 主动更新:对于实时性要求极高的数据,当MySQL数据发生变化时,主动更新Redis缓存。比如在股票交易系统中,股票价格实时变动,当数据库中股票价格更新后,立即更新Redis中的缓存价格数据,保证前端展示的价格始终是最新的。
通过以上从数据结构选择、缓存分层设计、失效策略优化等多个维度的优化,可以在复杂业务场景中有效提升成本效益,在保证实时性的同时合理利用资源,降低整体成本。