基于redis的收藏服务的设计思考

背景

一个收藏服务该如何设计,来满足基本的业务的需求

用户收藏/取消一个视频,文章
用户查看收藏视频列表,文章列表,按照时间排序,支持翻页
用户看具体一个/多个视频,文章,检查是否被收藏
用户查看收藏视频列表,文章列表总数

对象

上面提到的文章,视频,就是实体类型,抽象为ObjectType
文章有文章id,如article id,视频有视频id,如video id
上面提到的用户,即UserId

设计

里面的排序方式可以以redis的有序集合为例,满足排序等场景的要求
这里直接列举出来

收藏: zadd
方式: ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
参数:
-- KEY:{userId}_{objectType}
-- SCORE1:time.now()
-- VALUE1: objectId
说明:score传时间值, 满足后续按时间排序

取消收藏: zrem
方式:ZREM key member [member ...]
参数:
-- KEY:{userId}_{objectType}
-- member: objectId

是否收藏: ZSCORE
方式: ZSCORE key member
参数:
-- key:{userId}_{objectType}
-- member:{objectId}
说明:满足看是否收藏不同类型的对象id,是否收藏视频A1,是否收藏文章B2

收藏列表,带时间排序: ZREMRANGEBYSCORE
方式:ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
参数:
-- key:{userId}_{objectType}
-- min: time(0)
-- max: time.now()
-- offset:0
-- count: maxInt
说明:满足按收藏类型按时间新老(time.now() - > time(0))排序

收藏数: ZCARD
方式:ZCARD KEY_NAME
参数:
-- key:{userId}_{objectType}
说明:收藏某一个类型实体的数量

可以看到,上面的redis有序集合已经满足了我们最简单的需求

拓展思考

假设再有其他的场景

一个视频总共被多少人收藏过,被哪些人收藏过
两个人共同收藏的视频列表,视频总数

等等延伸开的实体与关系之间的量化表达,分析,如何来实现
基本的redis实现也不能完全cover,可以用到其他方式

比如图数据库,可以理解为一堆点和边的处理,参照refer
点即为同构或者异构的实体类型,
边理解为两两之前的关系(可单向,双向),可以用来表示收藏,关注等动作关系
可以基于此做进一步分析,比如二度人脉,等等
这里不展开介绍,后面看了再说

refer

redis有序集合
图数据库

你可能感兴趣的:(基于redis的收藏服务的设计思考)