基于 Redis 和 定时任务 实现最近热点帖子推荐功能

目录

前言

ZSet 存储结构

功能设计


前言

类似于社交软件 or 网站 往往需要向用户 推荐一些 帖子 或者 文章 等。

本篇文章将介绍,如何基于 Redis 的 ZSet Spring的定时任务 实现一个 内容推荐 的功能。

ZSet 存储结构

在介绍项目方案之前,我们先来了解下 ZSet 的 相关存储结构

结构图

我们知道 ZSet 是一个 有序的集合。在 Redis 中,ZSet 的 Value 分为多个 entry

每一个 entry 又分为一个 member (值), 和 score (分),排序规则就是按照 score 顺序排序。

我们可以在 member 中存入对应内容的标识,如 帖子 id

并且 Redis 提供了 score 的原子递增接口,一定程度上保证了 线程安全

ZINCRBY key increment member

JavaAPI

redisTemplate.opsForZSet().incrementScore(key, postId, score);

执行上述命令后,"member1"的分值将进行递增指定分值。如果"member1"不存在,Redis会自动将其添加到有序集合中,并将初始分值设为递增值。

此方案主要在扫出帖子后直接对数据(浏览量、点赞量、评论量)进行运算,如想将推荐功能变为 实时计算 的,可以使用该 API 进行热度变更


ZSet 相关的底层存储结构涉及 跳表、压缩列表、packlist ,在存储的 entry 数量 超过 128 个时,将由 压缩列表 变为 跳表 存储。

功能设计

假设我们以 热门帖子推荐 为例

流程图展示

流程介绍

  1. 首先,我们在每天凌晨先对 前一周 的帖子进行扫描,主要扫出在这一周之内 发布的帖子。
  2. 在扫出指定内容后,对帖子的数据做处理计算。如浏览量、点赞量、评论量
  3. 根据自己规定的算法,对帖子计算出指定权重,并按照 帖子 id memberscore 为计算的权重 存入Redis 中。
  4. ZSet 中,我们的内容已经自动完成排序,接下来只需要取出目标条数。在根据 id 把 相关内容查询出来即可。

这样下来,一个简易的 内容推荐功能就完成了。

很多内容其实也是可以进行修改很拓展的。比如:

  • 扫描的时间可以不限于这一周
  • 使用其他的算法来计算权重

等等

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

durancer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值