微信亿级在线点赞体系,用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); (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |