为什么使用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