php&redis实现视频点赞
这篇文章总结了我在项目中实现视频点赞的方法
缓存 vs 数据库?
首先按照传统思路会在数据库里面建个字段放点赞数量,但是仔细一想,访问数据量一大,频繁对一个字段访问,肯定会造成数据库堵塞,访问接口超时,严重的时候服务器会报404,这要是出现在线上,老板肯定会叼你一顿。闲话少说。
在一些特殊的场景下,传统的关系型数据库很可能无法满足我们的需求。比如,在访问量较大的情况下,数据库很可能会宕机或者访问速度非常慢。这对用户来说是不能容忍的。因此就有了非关系型数据库,如 Redis 作为缓存,将数据放到内存中,实现数据的快速获取。下面我们就来看看如何使用 Redis 缓存实现视频点赞功能。
php实现视频点赞
在配置文件中把redis作为缓存,这是实现后面的前提,切记改为redis!!!
- php引入redis
- 使用redis命令实现点赞
Redis 可以存储键与 5 种不同数据结构类型之间的映射,这 5 种数据结构类型分别为 String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
先来看一下他们的特点:
string(字符串),采用键值对的方式存储,不适合点赞
list(列表),按照顺序排序,通常用在秒杀方面
set(集合),是string类型的无序集合,可以将用户记录进去
zset(有序集合),是string类型的有序集合,用在排名方面,
为什么我们要用集合呢,因为他们的关系是一对多,一个视频id对应多个点赞用户,并且是无序的,也就不需要排序,所以我们用视频id作为key,集合里面放点赞用户的id,实现点赞。用字符串存视频播放数据
实现部分
//SISMEMBER方法主要用来判断用户在不在集合里面
$click = Cache::SISMEMBER('video'.'_'.$data['vid'],$data['uid']);
if($has_click){
//当用户取消点赞时,将用户从集合里面移除
$has = Cache::SREM('video.'_'.$data['vid'],$data['uid']);
if($has){
return success('取消成功');
}else{
return fail('失败');
}
}else{
//加入用户收藏列表
Cache::append('video'.'_'.$data['vid'],$data['uid']);
//视频播放次数加一
Cache::INCR('play_'.$data['vid'].$data['uid']);
//还可以用队列放到数据中
return success('收藏成功');
}
总结
举一反三,很多场景下的业务,都需要用到redis,比如签到,排名,点赞,收藏,一些重要的数据可以放到数据库里面,不重要的数据放到缓存里面,减少数据库的开销.
更多推荐
php&&redis实现视频点赞
发布评论