加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

微信亿级在线点赞体系,用Redis怎样实现?

发布时间:2019-12-07 02:56:56 所属栏目:编程 来源:站长网
导读:副问题#e# 点同意果各人都不会生疏,像微信这样的交际产物中都有,但别看成果小,想要做好必要思量的对象还挺多的,如海量数据的漫衍式存储、漫衍式缓存、多 IDC 的数据同等性、会见路由到机房的算法等等。 图片来 Pexels 本文先容大型交际平台点赞体系的设

微信亿级在线点赞体系,用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怎样实现?

操纵 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); 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读