大佬教程收集整理的这篇文章主要介绍了通用点赞设计与实现_专注的博客,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net
点赞作为一个高频率的操作,如果每次操作都读写数据库会增加数据库的压力,所以采用缓存 + 定时任务来实现。点赞数据是在 redis 中缓存半小时,同时定时任务是每隔 5 分钟执行一次,做持久化存储,这里的缓存时间和任务执行时间可根据项目情况而定。
create table user_like(
id bigint(20) unsigned not null auto_increment comment 'id',
user_id bigint(20) NOT NULL default 0 comment '用户id',
liked_id varchar(21) not null default '' comment '被点赞的id',
liked_status int(11) not null default 0 comment '点赞状态,0未点赞,1已点赞',
liked_type int(11) not null default 0 comment '点赞的类型',
liked_time timestamp not null default '0000-00-00 00:00:00.000000' comment '点赞时间',
is_delete Tinyint not null default '0' comment '是否逻辑删除',
create_time timestamp not null default CURRENT_TIMESTAMP comment '创建时间',
update_time timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
primary key (id),
unique uniq_user_id_liked_id_type(user_id,liked_id,liked_typE),
key idx_liked_id (liked_id),
key idx_create_time (create_timE),
key idx_update_time (update_time)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='用户点赞表';
create table user_like_stat(
id bigint(20) unsigned not null auto_increment comment 'id',
liked_id varchar(21) not null default '' comment '被点赞id',
liked_count int(11) not null default 0 comment '点赞总数量',
is_delete Tinyint not null default '0' comment '是否逻辑删除',
create_time timestamp not null default CURRENT_TIMESTAMP comment '创建时间',
update_time timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
primary key (id),
unique uniq_info_num(liked_id),
key idx_create_time (create_timE),
key idx_update_time (update_time)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='点赞统计表';
整个点赞模块主要采用缓存来完成,所以要选择合适数据结构,我选择 hash 数据结构来实现,应为它可以添加、获取、移除单个键值对,并且可以获取所有键值对。主要缓存两种数据,一种是用户的点赞状态,一种是被点赞 id 的点赞数量。这两种数据分别用两个 key 存储,这两个 key 中都是存储的多个键值对。键值对格式如下: 用户的点赞状态 key-value------>{“被点赞的 id:: 用户 id” : “点赞状态:: 点赞时间:: 点赞类型”} 被点赞 id 的点赞数量 key-value------>{“被点赞 id” : “点赞数量”}
点赞的数据量比较大的情况下,上面的设计会造成单个 key 存储的 value 很大,由于 redis 是单线程运行,如果一次操作的 value 很大,会对整个 redis 的响应时间有影响,所以我们这里在将上面的两个 key 做拆分。固定 key 的数量,每次存取时都先在本地计算出落在了哪个 key 上,这个操作就类似于 redis 分区、分片。有利于降低单次操作的压力,将压力平分到多个 key 上。
//点赞状态key拆分
newHashKey = hashKey +"_"+ (userId% 5);
hset (newHashKey, field, value) ;
hget(newHashKey, field)
//点赞数量key拆分
newHashKey = hashKey +"_"+ Math.abs((hash*(被点赞id)) % 5);
hset (newHashKey, field, value) ;
hget(newHashKey, field)
以下值截取了部分代码, 提供思路。
现在的读取都是用的一个 key,接下来可以优化为把 key 做读写分离。写入和读取分别用不同的 key,这样做可以减少资源的浪费,要不每次跑定时任务都会把已经持久化并且缓存未失效的数据拿出来做一遍查询。
以上就是点赞的一个实现思路,大家有什么更好的方法或者改进的点,欢迎提出来。
以上是大佬教程为你收集整理的通用点赞设计与实现_专注的博客全部内容,希望文章能够帮你解决通用点赞设计与实现_专注的博客所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。