新浪微博「点赞功能」数据库如何设计的?
对于第一个问题,设计一个schema->(messageID,likedCount),记录每条微博的点赞数。messageID是微博的编号,likedCount是该微博的点赞人数。但是这里有两个问题需要解决,第一是并发,第二是数据量。
每条微博都有可能有很多人同时点赞,为了保证点赞人数精确就需要保证likedCount++是原子操作,这个可以由应用程序来实现,也可以用redis的事务来实现(如果redis有事务机制或者自增功能的话),但是我觉得为了性能考虑,也可以不用实现原子操作,具体原因就不展开了。
每天都上亿可能更多的微博内容产生,这样就会有上亿个新的(messageID,likedCount)生成,这样的数据量是比较大的,单机数据库比较难提供高效的服务,所以需要采取sharding的功能(有时候也叫分表分库),可能根据messageID把这些schema分散到十个或者更多的shards上(据说,sina微博有600个节点,如何三个节点组成一个shard,就有200个shards),这样每个shard处理的请求就只有原来的十分之一,从而就能提高服务的性能。
关于点赞人列表的设计,一般来说,可能想到的schema是(messageID,userID),但是这样的设计有一个小问题,就是有些大发的微博可能会得到几十万的点赞,这样就会产生几十万个条数据,这样数据有点多,读取起来可能也慢。所以可以用这样一个schema(messageID,partID,userIDs),让一个messageID对于多个userID,同时比对应太多的userID,所以加入一个新的partID,一个part存1000个userID,这样几十万个点赞,只需要存几百条数据。这样做还有一个好处,用户点击查看点赞人时的,一般都不是完全显示所有点赞人,而是一批一批显示,这样可以一次只读一条数据,就可显示一批点赞用户信息。
按步骤设计。
1、首先打开抖音,进入主页面。
2、其次点击中间设计作品,在题目栏编辑#抖音夏日光合季话题。
3、然后进行发表,即可设计太阳点赞图标。
数据库设计
先准备两张表,pic表保存的是图片信息,包括图片对应的名称、路径以及图片“赞”总数,pic_ip则记录用户点击赞后的IP数据。
CREATE TABLE IF NOT EXISTS `pic` (`id` int(11) NOT NULL AUTO_INCREMENT,
`pic_name` varchar(60) NOT NULL,
`pic_url` varchar(60) NOT NULL,
`love` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE IF NOT EXISTS `pic_ip` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pic_id` int(11) NOT NULL,
`ip` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
index.php
在index.php中,我们通过PHP读取pic表中的图片信息并展示出来,结合CSS,提升页面展示效果。
<?phpinclude_once("connect.php")
$sql = mysql_query("select * from pic")
while($row=mysql_fetch_array($sql)){
$pic_id = $row['id']
$pic_name = $row['pic_name']
$pic_url = $row['pic_url']
$love = $row['love']
?>
<li><img src="images/<?php echo $pic_url?>" alt="<?php echo $pic_name?>"><p><a href="#"
title="赞" rel="<?php echo $pic_id?>"><?php echo $love?></a></p></li>
<?php }?>
CSS中,我们将定义鼠标滑向和离开红心按钮的动态效果,并定位按钮的位置。
.list{width:760px margin:20px auto}.list li{float:left width:360px height:280px margin:10px position:relative}
.list li p{position:absolute top:0 left:0 width:360px height:24px line-height:24px
background:#000 opacity:.8filter:alpha(opacity=80)}
.list li p a{padding-left:30px height:24px background:url(images/heart.png) no-repeat
4px -1pxcolor:#fff font-weight:bold font-size:14px}
.list li p a:hover{background-position:4px -25pxtext-decoration:none}
jQuery代码
当用户点击自己喜欢的图片上的红心按钮时,向后台love.php发送ajax请求,请求响应成功后,更新原有的数值
$(function(){$("p a").click(function(){
var love = $(this)
var id = love.attr("rel") //对应id
love.fadeOut(300) //渐隐效果
$.ajax({
type:"POST",
url:"love.php",
data:"id="+id,
cache:false, //不缓存此页面
success:function(data){
love.html(data)
love.fadeIn(300) //渐显效果
}
})
return false
})
})
love.php
后台love.php接收前端的ajax请求,根据提交的图片id值,查找IP表中是否已有该用户ip的点击记录,如果有则告诉用户已“赞过了”,反之,则进行一下操作:
1、更新图片表中对应的图片love字段值,将数值加1。
2、将该用户IP信息写入到pic_ip表中,用以防止用户重复点击。
3、获取更新后的赞值,即赞该图片的用户总数,并将该总数输出给前端页面。
include_once("connect.php") //连接数据库
$ip = get_client_ip() //获取用户IP
$id = $_POST['id']
if(!isset($id) || empty($id)) exit
$ip_sql=mysql_query("select ip from pic_ip where pic_id='$id' and ip='$ip'")
$count=mysql_num_rows($ip_sql)
if($count==0){ //如果没有记录
$sql = "update pic set love=love+1 where id='$id'" //更新数据
mysql_query( $sql)
$sql_in = "insert into pic_ip (pic_id,ip) values ('$id','$ip')" //写入数据
mysql_query( $sql_in)
$result = mysql_query("select love from pic where id='$id'")
$row = mysql_fetch_array($result)
$love = $row['love'] //获取赞数值
echo $love
}else{
echo "赞过了.."
}
我上传的附件中 数据库SQL 你可以直接建立test 数据库UTF8编码的,然后把SQL文件导入进去。修改一下connect.php中数据库的连接信息即可。
事实上,许多知名产品中的点赞按钮每一个像素和颜色的更换都十分慎重,因为它不仅仅影响上亿人次的浏览观感。还可能事关产品的品牌和价值。
豆瓣、网易云音乐、京东、今日头条,不同类型的产品中都有点赞功能的存在。在进行点赞功能设计时,常见的产品场景是对用户评论的点赞。但其实点赞不仅能够应用在评论,电商平台中的商品、服务、活动;音乐产品中的歌曲、歌单、主播、知识社交产品中的书、影评、小组,都能够使用点赞功能释放用户的正向情感。
点赞功能设计中,用户的每一次点赞,涉及的详细需求包括:
点赞用户身份: 点赞行为产生时,产品要识别点赞人的身份。因此,用户在点击点赞按钮时,产品需要检查用户是否登陆,仅当用户登陆时,点赞行为才能顺利完成同时产品记录点赞用户身份。
点赞对象: 用户为产品中的什么点赞?这是产品经理尤其要考虑的问题。像前面所说,一个产品,能够设计被点赞的对象很多,但什么时侯需要设计点赞功能,并非多多益善。
点赞时间: 用户点赞时间的记录
取消点赞: 点赞功能是否要做很双向,即可以点赞,也可以取消点赞。不但如此,如果必要,点赞功能还可以加入更多的限制,如:一篇文章一个用户只能点赞一次,一篇文章一个用户在一天内只能点赞一点等等。
可是,点赞功能设计也有不少普遍存在的问题:
产品评论中的点赞数量,是评论排名的主要依据,这样的规则虽然让最受欢迎的评论排在了显眼的位置。但同时,也导致了另一个问题:热门的评论在曝光度高的位置占位很久”,这对于新的评论无疑是不公平的,新评论由于缺少时间积累而缺少展示空间,由此被慢慢覆盖。
现在,有很多排序算法在尝试解决这个问题,在排序算法中加入时间衰减因子,随着时间的推移,降低头部权重。
同时,很多产品的“热门评论”,在以热度排序时,加入综合互动因子:点赞、评论、转发,影响排名的热度权重也是从“点赞、评论、转发”多个因子中计算的综合得分
但必须看到的是,大部分产品还都是仅用点赞数进行排序的,如公众号留言排序是以文章作者回复内容被点赞数排序。
这是因为还有很多设计上的差异,如有些点赞对象不存在其它互动因子,如转发、评论。如果遇到这些类似的问题,排序算法则从时间维度入手,对点赞对象定时进行提权,如查看1天中的点赞表现是否更好。
除了在排序算法上进行点赞设计优化,在产品设计中,加入均衡设计内容,也能够弱化时效性问题。
在热门内容展示的同时,开辟最新内容的主题区域。也可以解决新的点赞对象缺少展示空间被慢慢覆盖的问题。
另外,用户点赞时,对于点赞对象是否会有都喜欢,但喜欢程度不同的状态?例如一篇文章的评论,2、5、8条我我都喜欢,但第2条最喜欢,5、8条一般。用点赞无法表达,用户可能选择突出重点,仅点赞第2条评论,也有可能不分轻重3条都点赞。但无论怎样,产品都无法更深层的了解用户的喜好。
2013年,Facebook在修改点赞功能按钮时,在web版本的Facebook页面上开始测试 星级打分功能 。
点赞与星级打分,都表达了用户对某样事件的看法。点“赞”功能对用户的情感表达有限制,而五星打分评级功能可以给用户更多选择。
对于用户来说,星级打分允许更细腻的情感表达,在用户行为结果呈现上,表述更准确。实际上,点“赞”是一个模糊性的情感表达。用户在点击“点赞”按钮时,可能表达的情绪有认同、怜悯、团结、感兴趣、支持等多种情绪。点“赞”数量只能表明对象被关注的数量多少,但不代表公众的普遍情感。
相对而言,五星打分评级功能更加简单、易操作,在产品需要获取高度整合的情感表达,以及深层的用户信息量展现时。同时也能够解决产品需要用户更清晰表达态度时的效果实现。
如果看完文章有收获,请给我点个 赞 吧~
goods(赞数)应该在新闻表里
goods表只要存id
news_id(新闻id)
user_id(用户id)
发sql查是否已点赞的时候where条件判断news_id
和
user_id
select
count(1)
from
Goods
where
news_id=?
and
user_id=?
值大于0就代表已点赞
只等于0就插入点赞的数据
说起空间动态、微博的点赞效果,网上也是很泛滥,各种实现与效果一大堆。而详细实现的部分,讲述的也是参差不齐,另一方面估计也有很多大侠也不屑。
界面设计中的小元素可以使用这个格式,比如运营按钮动画,点赞图标动画等,资源不会太大。
视频号增加点赞量的方法技巧
第1:设计标志性封面
封面的作用不可小觑,封面和标题决定了50%的推荐流量。那什么是好的封面?归纳起来就是“有用+有美”。
微信搜索热搜传媒
美丑视频封面对比
①色彩:有统一的色调,视觉感受强烈,辨识度高,让人耳目一新,记忆深刻。
②字体:标题字号较大,主题突出,色彩搭配和谐,让人一眼就能了解视频主题。
③修饰:右上角有修饰元素,从视觉上画面协调柔和,同时又强调个人品牌。
④图像:人物居中,占领视觉中心,强势输出IP形象。
总结一下:这种封面既能让人快速获取信息(标题概括),又在整体观感上富有美学享受,让账号至少拥有“有用+有美”2种特质。从封面就能感受到够,够用心,很容易产生关注的冲动。
第2:引导点赞
想要吸引大家点赞转发,可以采用两种方式:
种是口播的方式, 可以结合自己的视频内容,在视频中提醒用户记得点赞收藏。当然这种引导方式的前提是你的视频号内容是对用户很实用的技巧和知识。那么除了这种方式之外,还可以使用这些引导语,比如“如果你赞同的话,欢迎转发评论哦!”“喜欢就双击屏幕点赞吧!”等这类引导语。
第二种是图文的方式, 要学会设置点赞的诱因。比如在视频恰当位置加上“点赞查看更多内容”“点赞是一种爱的体现”等话术,或者在视频的后一帧字幕加一句引导语,如“欢迎点赞”。
第3:巧用关系链
视频号就相当于公开版的朋友圈。我们每个人都有朋友圈,但朋友圈能覆盖的好友数是有上限的。但是视频号不一样,只要用户点赞了我的内容,他的好友就能看到,他的好友点赞之后,他的好友的好友又能看到,这种传播裂变一旦形成,带来的流量非常可怕。因此要学会用好自己的朋友圈,把发布的视频同步发到朋友圈或转发给自己的朋友,让朋友帮忙点赞。
那怎么才能让你的微信好友能更多地为你的视频点赞?这里我们先思考一个问题,就是你朋友圈里的好友,哪些人为你点赞的概率更高?
是那些你仰慕的、仰仗的,总是能够帮助你的人点赞的可能性大,还是那些仰慕和仰仗你,经常有事儿求你帮忙的人,为你点赞的可能性大?这个答案显而易见。所以我们想要提升自己的点赞量,可以尽可能添加你能带给他们帮助或者是层阶低于你的人。
那怎么去添加?拿脚本之家来举例,我们平台有很多小伙伴们基本上都是社群运营的高手,他们都有建立自己的专属社群,有的还不止一个。这些社群里的人其实就可以是他们需要添加的人。那如果没有属于自己的社群怎么办?想办法加入社群,并且能够应用自己的优势在社群里去帮助别人,为他人助力,用利他思维来做这件事,你收获的才是真正能为你带来点赞量和点赞率双向提升的好友。
除了添加好友之外,还有一个动作就是“减”。减哪些人呢?就是那些不知道什么时候添加的,平时也不怎么沟通都已经忘了对方是谁的人。这样的人已经处于深度休眠状态,很难被激活,也就是我们传说中的僵尸好友,这个时候,你就可以选择从好友列表当中删除掉了。因为这一方面可以减少好友基数提升点赞率,另一方面也能给那些真正点赞概率高的人腾出好友位。
第4:分享有认同感的内容
一个好的观点的视频,更能点燃他人内心分享的火花。怎么判断一个视频是否具有好的观点?在回答这个问题之前,我们先来看一下短视频内容的大致分类,其实所有的内容不外乎以下几种:
1.技术类的内容
这类内容主要是分享各种小技巧,比如美食的制作、衣服的穿搭、化妆品的使用,还有各种工作软件的使用等等。这些都非常容易被点赞和收藏。
2.知识类的内容
这类内容主要以各种读书和拆书类自媒体,或者是有一定影响力的培训师、学者为主。或者是提炼一本书的精华,或者是分享一种感悟,或者是普及某个行业里的尝试。这类内容相比实用类的内容不会那么立竿见影,但是能够起到开拓视野、增长见识的作用。
3.励志类的内容
这类内容以故事和金句为主。多是搜罗一些名人名言或者是当下一些大咖的金句,然后配上自己拍摄的画面,有的甚至只有一个背景图加上音乐和字幕。这类内容因为金句和好的故事自带直达人心的效果,也能收获不少的评论和点赞。
4.展示类的内容
这类内容拍摄者的目的在于展示,或展示某项技能,或展示一种生活方式,甚至展示才艺、身材和颜值。比如一些手艺人,他们会拍摄自己制作工艺品的内容,当然,目的不是为了教会别人,而是为了让你看着好玩儿。比如,海边的人拍摄赶海生活,大山深处的人拍摄山居生活,甚至普通的农村家庭拍摄自己的农家生活,这都是一种展示。
5.表演类的内容
虽然上面的几类内容都有一定的表演成分,但还不能算是表演类的内容。我们说的表演类的内容指的是,具有明显夸张故事情节和剧本痕迹的内容,这些内容的拍摄者多是一个团队,他们需要更多的场景和道具。
6.猎奇博出位的内容
这类内容主要是利用人们的猎奇心理,拍出各种出位的内容来博取大家的眼球。比如,号称什么都能吃、什么都敢吃、多少都能够吃得下的各路吃播比如,各种充满危险和恶趣味的内容,号称集齐多少个赞就做一件出格的事儿。这样的账号因为利用了人们强烈的好奇心和喜欢起哄的心理,也可以获得较高的关注度。
7.广告类内容
广告类内容指的是那些在果园里拍水果,顺便讲个果农卖水果不容易的故事在工厂里拍产品,顺便讲一个生意不景气出口产品转内销的故事或者是拍着某款产品使用效果,然后直接销售的内容。这类内容大家一看就知道是怎么一回事儿,这种概率是非常低的。他们更看重的是内容的传达率,是不是马上变现并不重要,重要的是你看到了,你知道了这个信息。
在这些类别中,前三个类型的内容在视频号平台上占据了相对高的比例。这也从侧面说明这三个类型的内容是真正适合视频号这个平台的,而且你仔细研究就会发现,它们都有一个共同的特征就是“有用”。“有用”这两个字就是我们进行视频号内容创作的大原则,所以不管你从垂类上怎么分,户外也好,美食也好,判断一个视频好坏的标注就是“有用”。
技术类的内容为用户提供的是一种价值,励志类的内容为用户提供的是一种价值观,我们认同一句话,认同一种观点,认同一个故事,其实就是认同它们所阐述的价值观。而知识类的内容为用户所提供的则既有价值又有价值观。因此,任何时候,对别人“有用”才是我们做好视频号,让别人能够为你点赞的底层逻辑。