推荐流个性化缓存策略设计:让每个用户刷到的首页都“记得住”

打开一个学习App,首页推荐的课程是不是总让你觉得“懂你”?刚搜过Python入门,下一秒就弹出《零基础爬虫实战》;昨天看了机器学习导论,今天推荐栏里就多了《线性代数可视精讲》。这不是巧合,背后是推荐流个性化缓存策略在悄悄发力。

缓存不是“一刀切”,而是“一人一策”

传统CDN或后端Redis缓存,常把整个推荐列表按请求URL或用户分组统一缓存——比如“学生用户-首页推荐”共用一个key。问题来了:张三爱看算法课,李四专注UI设计,缓存一刷新,两人看到的都是同一份“热榜”,个性化直接打折。

个性化缓存的核心思路很朴素:把“用户特征+上下文”作为缓存key的一部分。比如:

cache_key = f"rec_stream_v2:user_{uid}:tag_{top3_tags}:hour_{hour}:device_{device_type}"

其中 top3_tags 可以是用户近期点击/完播课程打上的标签(如“深度学习、PyTorch、项目实战”),hour 用于支持时间敏感型推荐(比如晚间更倾向推送短时长实操课)。这样,张三和李四哪怕同属“高校学生”分群,缓存key也天然不同,互不干扰。

缓存更新不能等“全量重刷”

用户行为是连续的:刚收藏一门课,马上希望推荐流里出现同类内容。如果缓存TTL设成2小时,那这2小时内他永远看不到实时反馈。折中办法是“双层缓存+事件驱动”:

  • 外层用长效缓存(TTL 60分钟)兜底,保障吞吐;
  • 内层维护一个轻量级用户专属“热点槽”(比如Redis Hash结构),存放最近15分钟内由行为触发的新增推荐项;
  • 每次读取时,先查热点槽,再合并长效缓存结果,去重后返回。

代码逻辑类似:

// 伪代码示意
def get_personalized_feed(uid):
hot_items = redis.hgetall(f"feed_hot:{uid}") // 实时槽
base_feed = cache.get(f"feed_base:{uid}:{gen_cache_sig()}") // 长效缓存
return merge_and_dedup(hot_items, base_feed)

别忘了“冷启动”用户的缓存友好性

新注册用户没行为数据,标签为空,缓存key容易撞成一堆“user_000000:tag_::hour_14:...”,造成缓存雪崩。实际做法是:对无行为用户,用设备指纹+地域+注册渠道生成弱区分度key,并主动预热一批通用高质课程(如《如何高效记笔记》《网课平台使用指南》),避免空缓存穿透到下游推荐模型。

说到底,个性化缓存不是把推荐结果“存下来”那么简单,而是让缓存本身也成为推荐逻辑的一环——它要能感知人、记住变、扛住压,最后让用户感觉:“这页面,真像为我长出来的。”