我是靠谱客的博主 灵巧诺言,最近开发中收集的这篇文章主要介绍如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)分析vo类时间工具类控制器接口业务层实现方法,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 分析
- vo类
- 时间工具类
- 控制器接口
- 业务层实现方法
- 抽出来的方法–通过此文章id找到对应的vo对象
- 抽出来的方法–存放vo对象进redis中
- 前提须知(一)阅读量+1和(二)收藏量+1
- 以上2篇文章内容,使用的vo对象为同一个
分析
- 应用场景,点击点赞按钮,则将点赞数+1,若点赞过则无法进行点赞
- 通过redis操作, key为文章和用户id的拼接,当前用户在此redis中能找到自己对应的key则是点赞过,若无则未点赞 才能使点赞数+1
- 设置redis中的key时效时长为当前时间到当天的最后一秒的间隔(秒)
vo类
时间工具类
- 提供获取当天最后一秒的时间
- 提供获取2个时间的间隔数(秒)
public class DateUtil {
/**
* 获取2个时间的间隔(秒)
* @param d1
* @param d2
* @return
*/
public static long getDateBetween(Date d1, Date d2){
return Math.abs(d1.getTime()-d2.getTime() / 1000);//取绝对值
}
//获取当天最后一秒时间
public static Date getEndDate(Date date){
if (date == null){
return null;
}
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY,23);
c.set(Calendar.MINUTE,59);
c.set(Calendar.SECOND,59);
return c.getTime();
}
}
控制器接口
- @RequireLogin 设置此接口必须登录才能访问,具体至登录拦截配置
- 接收文章id和当前用户,返回boolean类型,true为点赞成功,false为失败
@RequireLogin
@PostMapping("/strategyThumbup")
public Object strategyThumbup(Long sid,@UserParam UserInfo userInfo){
boolean b= strategyStatisVORedisService.strategyThumbup(sid,userInfo.getId());
return JsonResult.success(b);
}
业务层实现方法
- 拼接当前文章id和当前用户id作为reids中的key,value值随便设即可
- 若此key不存在redis中,则表示文章并未点赞过,则进行点赞操作,若存在则表明已点赞过,直接返回false给前端,表示点赞失败
点赞业务逻辑如下:
- 通过文章id获取对应的vo类,将此类内的点赞量+1,然后存入redis中即可(前端的点赞量是通过redis中文章id为key对应的vo显示的)
- 将拼接当前文章id和当前用户id作为reids中的key存入redis中,并设置时效时长为当前时间到当天最后一秒的间隔(秒), 也就是过完今天则失效了,第二天可以继续点赞
- 最后返回true 表示点赞成功!
public boolean strategyThumbup(Long sid, Long uid) {
// 拼接key
String key = RedisKeys.STRATEGY_THUMB.join(uid.toString(),sid.toString());
// 判断key是否存在
if (!template.hasKey(key)){
// 不存在,点赞数 +1 , 缓存标记[点赞操作]
StrategyStatisVO vo = this.getStrategyVO(sid);
vo.setThumbsupnum(vo.getThumbsupnum() + 1);
// 更新vo对象
this.setStrategyVo(vo);
Date now = new Date();
// 最后一秒
Date end = DateUtil.getEndDate(now);
// 当前时间到今天最后一秒
Long time = DateUtil.getDateBetween(now,end);
// 缓存标记
template.opsForValue().set(key,"1",time, TimeUnit.SECONDS);
return true;
}
// 存在,不做任何处理[已经顶过]
return false;
}
抽出来的方法–通过此文章id找到对应的vo对象
// 通过攻略文章id获取对应vo
@Override
public StrategyStatisVO getStrategyVO(Long sid) {
// 拼接vo的key
String key = RedisKeys.STRATEGY_STATIS_VO.join(sid.toString());
// 获取vo对象
StrategyStatisVO vo = null;
if (!template.hasKey(key)) {
// 不存在,进行vo对象初始化
Strategy strategy = strategyService.getById(sid);
vo = new StrategyStatisVO();
BeanUtils.copyProperties(strategy, vo);
vo.setStrategyId(strategy.getId());
template.opsForValue().set(key, JSON.toJSONString(vo));
} else {
String voStr = template.opsForValue().get(key);
vo = JSON.parseObject(voStr, StrategyStatisVO.class);
}
return vo;
}
抽出来的方法–存放vo对象进redis中
//将vo 存进redis
@Override
public void setStrategyVo(StrategyStatisVO vo) {
// 拼接vo的key
String key = RedisKeys.STRATEGY_STATIS_VO.join(vo.getStrategyId().toString());
// 更新vo
template.opsForValue().set(key, JSON.toJSONString(vo));
}
最后
以上就是灵巧诺言为你收集整理的如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)分析vo类时间工具类控制器接口业务层实现方法的全部内容,希望文章能够帮你解决如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)分析vo类时间工具类控制器接口业务层实现方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复