设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > MySql教程 > 正文

微信亿级在线点赞系统,用Redis如何实现?(2)

发布时间:2019-12-06 01:43 所属栏目:115 来源:站长网
导读:点赞数据在 Redis 中的存储格式 用 Redis 存储两种数据: 一种是记录点赞人、被点赞人、点赞状态的数据。 另一种是每个用户被点赞了多少次,做个简单的计数。 由于需要记录点赞人和被点赞人,还有点赞状态(点赞、取

微信亿级在线点赞系统,用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); 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读