如何使用redis编写SO帖子?

6 浏览
0 Comments

如何使用redis编写SO帖子?

我在思考如何使用Redis实现Stack Overflow。其中最困难的部分是如何处理评论,并且以一种不需要循环获取每个评论的赞数的方式。我决定修改二进制块。UVComment的处理比较复杂。

每次我考虑使用散列时,最终都会使用集合或列表。我对Redis还不太熟悉,所以如果我犯错了也不会感到惊讶。这个设计合理吗?

创建帖子/问题(回答相同,只是在标记中设置一个标志并且标签为空)

postId=incr postCount

MULTI

rpush p:postId bin[IsQuestion,authorId,title,body,tags,datetimestamp]

foreach tag in tags

sadd tags:tag postId

EXEC

更新帖子/问题

WATCH p:postId  //不希望在此期间出现新的修订版本
old=lrange p:postId -1 -1 //当前版本,现在是旧版本
MULTI
rpush p:postId bin[IsQuestion,authorId,title,body,tags,datetimestamp] //新的修订版本
foreach tag in old.tags
    srem tags:tag postId
foreach tag in tags
    sadd tags:tag postId
EXEC

点赞/踩帖子

//点赞

sadd pUV:postId user

srem pDV:postId user

//踩

sadd pDV:postId user

srem pUV:postId user

//取消赞/踩

srem pUV:postId user

srem pDV:postId user

评论:

commentId=incr commentCount

multi

SET comment_post:commentId postId //以便在标记评论时使用。我们需要知道它在数据库中的位置

RPUSH post_comment:postId bin[authorId,text,HasBeenEdited,datetimestamp,commentId, UVCount]

exec

评论点赞

watch commentUV:commentId

res=SISMEMBER commentUV:commentId userId

if res>0 //已经点赞

unwatch

return

watch post_comment:postId

lrange post_comment:postId 0 -1 //然后找出与我们的commentId匹配的索引

//修改UVCount

MULTI

lset post_comment:postId targetIndex modifiedData

sadd commentUV:commentId userId

EXEC

获取帖子逻辑

lrange p:postId -1 -1 //当前修订版本
scard pUV:postId
scard pDV:postId
comments=lrange post_comment:postId 0 -1 //获取所有评论

0