如何使用redis编写SO帖子?
如何使用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 //获取所有评论