微信亿级在线点赞系统,用Redis如何实现?
点赞数据在 Redis 中的存储格式 用 Redis 存储两种数据: 一种是记录点赞人、被点赞人、点赞状态的数据。 另一种是每个用户被点赞了多少次,做个简单的计数。 由于需要记录点赞人和被点赞人,还有点赞状态(点赞、取消点赞),还要固定时间间隔取出 Redis 中所有点赞数据,分析了下 Redis 数据格式中 Hash 最合适。 因为 Hash 里的数据都是存在一个键里,可以通过这个键很方便的把所有的点赞数据都取出。 这个键里面的数据还可以存成键值对的形式,方便存入点赞人、被点赞人和点赞状态。 设点赞人的 id 为 likedPostId,被点赞人的 id 为 likedUserId ,点赞时状态为 1,取消点赞状态为 0。 将点赞人 id 和被点赞人 id 作为键,两个 id 中间用 :: 隔开,点赞状态作为值。 所以如果用户点赞,存储的键为:likedUserId::likedPostId,对应的值为 1 。 取消点赞,存储的键为:likedUserId::likedPostId,对应的值为 0 。取数据时把键用 :: 切开就得到了两个id,也很方便。 在可视化工具 RDM 中看到的是这样子: 操作 Redis 将具体操作方法封装到了 RedisService 接口里: ①RedisService.java import com.solo.coderiver.user.dataobject.UserLike; import com.solo.coderiver.user.dto.LikedCountDTO;
import java.util.List;
public interface RedisService {
/** * 点赞。状态为1 * @param likedUserId * @param likedPostId */ void saveLiked2Redis(String likedUserId, String likedPostId);
/** * 取消点赞。将状态改变为0 * @param likedUserId * @param likedPostId */ void unlikeFromRedis(String likedUserId, String likedPostId);
/** * 从Redis中删除一条点赞数据 * @param likedUserId * @param likedPostId */ void deleteLikedFromRedis(String likedUserId, String likedPostId);
/** * 该用户的点赞数加1 * @param likedUserId */ void incrementLikedCount(String likedUserId);
/** * 该用户的点赞数减1 * @param likedUserId */ void decrementLikedCount(String likedUserId);
/** * 获取Redis中存储的所有点赞数据 * @return */ List<UserLike> getLikedDataFromRedis();
/** * 获取Redis中存储的所有点赞数量 * @return */ List<LikedCountDTO> getLikedCountFromRedis();
} ②实现类 RedisServiceImpl.java import com.solo.coderiver.user.dataobject.UserLike; import com.solo.coderiver.user.dto.LikedCountDTO; import com.solo.coderiver.user.enums.LikedStatusEnum; import com.solo.coderiver.user.service.LikedService; import com.solo.coderiver.user.service.RedisService; import com.solo.coderiver.user.utils.RedisKeyUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ScanOptions; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.List; import java.util.Map;
@Service @Slf4j public class RedisServiceImpl implements RedisService {
@Autowired RedisTemplate redisTemplate;
@Autowired LikedService likedService;
@Override public void saveLiked2Redis(String likedUserId, String likedPostId) { String key = RedisKeyUtils.getLikedKey(likedUserId, likedPostId); (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |