Redis实用技巧之点赞系统设计
Redis中的存储结构如下图所示:
public function likeByRedis($reviewId, $fromUserId){
$redis=…//获取Redis连接
$redisKey=review:.$reviewId;
$redis->sadd(reviewindex,$redisKey); //将此评论加入索引
if($this->is_like_exists($reviewId,$fromUserId)){ //数据库中存在
if($redis->sismember($redisKey,$unlikeSetMember)){
$redis->srem($redisKey,$unlikeSetMember);
}else{
$redis->sadd($redisKey,$unlikeSetMember);
}
}elseif($redis->sismember($redisKey,$likeSetMember)){ //redis中存在,那么取消之
$redis->srem($redisKey,$likeSetMember);
$redis->srem($redisKey,$unlikeSetMember);
$redis->sadd($redisKey,$likeSetMember);
}
}
def process(self):
redisClient = #连接Redis
likesInfo=redisClient.smembers(reviewindex)
likeOperation=[]
unlikeOperation=[]
for item in likesInfo:
reviewID=0
try:
reviewIndexInfo=item.split(:)
reviewID=reviewIndexInfo[1]
except e:
pass
if reviewID!=0:
reviewDetail=redisClient.smembers(item)
for likeDetail in reviewDetail:
try:
operationInfo=likeDetail.split(:)
#使用元祖模式而不使用对象模式 方便批量无区分的快速插入数据库
likeOperation.append((reviewID,reviewInfo[user_id],operationInfo[0]))
else: #取消赞
unlikeOperation.append((reviewID,reviewInfo[user_id],operationInfo[0]))
except Exception,e:
pass
redisClient.delete(item)
redisClient.delete(reviewindex)
# 数据库同步
likeDAO=LikesDAO()
likeDAO.persistLikeInfo(likeOperation,LikesDAO.LIKE_OPERATION)
likeDAO.persistLikeInfo(unlikeOperation,LikesDAO.UNLINE_OPERATION)
# 推送通知给用户
