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)

# 推送通知给用户

经验分享 程序员 微信小程序 职场和发展