Redis应用---Redis实现点赞点踩功能

为什么使用Redis而不是MySQL实现?

Redis 和 MySQL应用场景不同。

  • 从效率来说: 

Redis的数据存放在内存,所以速度快但是会受到内存空间限制。 

MySQL存放在硬盘,在速度上肯定没有Redis快,但是存放的数据量要多的多。

  • 从功能来说: 

Redis是一个K-V数据库,同时还支持List/Hash/Set/Sorted Set等几个简单数据结构,所以只能以这些数据结构为基础实现功能。

Redis性能好,快,并发高,但不能处理逻辑,而且不支持事务,看具体的场合,主要做数据缓存,减少MySQL数据库的压力。最擅长的是结构化数据的cache,计数器场景,轻量级的消息队列,Top排行榜等互联网应用场景。在点赞过后要立即刷新显示在页面,所以推荐使用Redis

Redis几种数据结构的适用场景

  • List: 双向列表,适用于最新列表,关注列表;
  • Set: 适用于无顺序的集合,点赞点踩,抽奖,已读,共同好友;
  • SortedSet : 具有排序加成功能,适用于排行榜,优先队列的实现;
  • Hash:对象属性,不定长属性数;
  • KV : 单一数值,适用于验证码,缓存等实现。

实现思路 

使用Redis的Set数据结构存储数据。

Like和dislike对应不同的key,格式是:LIKE/DISLIKE:entityType:entityID;例如like的一个key:like:1:1234(1代表news业务,1234代表的是指定的newsId);可以通过RedisKeyUtil类中方法获取相应的key值;

public class RedisKeyUtil {
    private static String SPLIT = ":";
    private static String BIZ_LIKE = "LIKE";
    private static String BIZ_DISLIKE = "DISLIKE";

    /**
     * 返回Like的redis key
     * key:业务+参数
     * @param entityId
     * @param entityType
     * @return
     */
    public static String getLikeKey(int entityId, int entityType) {
        return BIZ_LIKE + SPLIT + String.valueOf(entityType) + SPLIT + String.valueOf(entityId);
    }

    public static String getDisLikeKey(int entityId, int entityType) {
        return BIZ_DISLIKE + SPLIT + String.valueOf(entityType) + SPLIT + String.valueOf(entityId);
    }
}
  • 点赞:将当前用户userid作为value,存入到对应like集合当中,同时判断点dislike集合中是否有此id值,有的话就移除; 
  • 点踩:与上面操作相反。
  • 查看用户点赞点踩状态:通过like和dislike对应的key,以及userid,查找userid是否在对应的集合中;

具体实现demo,参考:https://blog.csdn.net/noaman_wgs/article/details/71308036

 

你可能感兴趣的:(数据库)