redis实现点赞

文章介绍了如何在Springboot应用中集成Redis来实现点赞功能,以减轻数据库压力。点赞流程包括存储点赞状态到Redis并同步到MySQL。代码示例展示了如何使用RedisTemplate操作Hash数据结构存储和更新点赞状态。
摘要由CSDN通过智能技术生成

springboot集成redis实现点赞功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、springboot引入redis?

springboot中引入redis,在pom.xml文件中引入redis的包即可。

<!-- redis 缓存操作 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、功能实现

1.点赞流程说明

点赞操作是比较频繁的,而且是比较随意的,数据的变化是比较快的,如果使用关系型数据库的话(例如使用mysql操作),会对数据库产生比较大的压力,所以选择非关系型数据库redis来记录点赞的用户数,为防止数据丢失,可以把数据同步给mysql。
点赞的数据需要哪些呢,包含点赞的文章id(topicId),被点赞的用户(fromUid),点赞的状态。

2.代码实现

代码如下:

public enum LikedStatusEnum {

    LIKE(1, "点赞"),
    UNLIKE(0, "取消点赞/未点赞"),
    ;

    private Integer code;
    private String msg;

    LikedStatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }


    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
public interface RedisService {

    /**
     * 点赞。状态为1
     *
     * @param topicId
     * @param fromUserId
     */
    void saveLiked2Redis(String topicId, String fromUserId);

    /**
     * 取消点赞。将状态改变为0
     *
     * @param topicId
     * @param fromUserId
     */
    void unlikeFromRedis(String topicId, String fromUserId);

}
@Service
public class RedisServiceImpl implements RedisService {

    private RedisTemplate redisTemplate;

    public RedisServiceImpl(RedisTemplate redisTemplate){
        this.redisTemplate = redisTemplate;
    }

    /**
     * 点赞。状态为1
     *
     * @param topicId
     * @param fromUserId
     */
    @Override
    public void saveLiked2Redis(String topicId, String fromUserId) {
        String key = RedisKeyUtils.getLikedKey(topicId, fromUserId);
        //用户点赞,存储的键为:topicId::fromUId,对应的值为 1
        // hash
        redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, LikedStatusEnum.LIKE.getCode());
    }

    /**
     * 取消点赞。将状态改变为0
     *
     * @param topicId
     * @param fromUserId
     */
    @Override
    public void unlikeFromRedis(String topicId, String fromUserId) {
        String key = RedisKeyUtils.getLikedKey(topicId, fromUserId);
        // 用户点赞,存储的键为:topicId::fromUId,对应的值为 0
        redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, LikedStatusEnum.UNLIKE.getCode());
    }
}
public class RedisKeyUtils {

    /**
     * 保存用户点赞数据的key-这里的key在实际项目中应该采用 MAP_USER_LIKED::userId 组合,userId表示被点在的用户id
     */
    public static final String MAP_KEY_USER_LIKED = "MAP_USER_LIKED";

    /**
     * 拼接被点赞的文章id和点赞的人的id作为kek
     *
     * @param topicId likedUserId 被点赞的文章id  == topicId
     * @param fromUid likedPostId 点赞的人的id  == fromUid
     * @return
     */
    public static String getLikedKey(String topicId, String fromUid) {
        StringBuilder builder = new StringBuilder();
        builder.append(topicId);
        builder.append("::");
        builder.append(fromUid);
        return builder.toString();
    }

}




redis中存储数据结构如下图所示,redis采用hash数据结构存储点赞数据,Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
在这里插入图片描述

总结

以上代码就可以实现redis简单的点赞功能,至于查询redis中hash数据代码未贴出,请读者自行实现。
第一次写文章,写的不好的地方,请大家多多担待。谢谢

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值