Redis高并发点赞

1、redis高并发点赞就是保护数据库进行的操作
原理:就是将点赞数和点赞用户先存入redis中(防止大量用户数据对数据库的操作),通过定时任务在将数据取出来。
操作:
1、先将前端的数据存入redis中
Redis高并发点赞_第1张图片

源代码:
/**
 * 获取前端点赞文章的id
 */
@PreAuthorize("@ss.hasPermi('system:article:click')")
@GetMapping(value = "/click/{aidd}")
public AjaxResult click(@PathVariable("aidd") Long aidd)
{
    String aid=aidd.toString();     //将前端传过来的数据转化为String类型,可以不转化
                                    // (因为我接收前端值为Long类型而clickarticle方法接收的是String类型所以给需要转换)
    String uid=SecurityUtils.getLoginUser().getUser().getUserId().toString();   //获取登录用户id
    if(dzArticleService.clickarticle(aid,uid)){
       return toAjax(1);      //存储redis成功返回1
    }else {
       return toAjax(0);      //存储redis失败返回0
    }
}

2、定义一个将文章id和用户id存储进redis的方法(我的返回值类型为布尔型,大家根据自己的需求进行定义)
Redis高并发点赞_第2张图片
源代码:

public boolean clickarticle(String aid,String uid); //定义一个方法

3、重写定义的方法,进行实体操作存储
Redis高并发点赞_第3张图片

源代码:

@Autowired
private DzArticleMapper dzArticleMapper;

@Autowired
private RedisTemplate redisTemplate;
//key命名规范 项目名称
private  static final String PRIVATE_HASH_KEY="dzclick";        //给存储的redis定义一个名称(自己需求定义)

/**
 *将点赞存储进redis
 */
@Override
public boolean clickarticle(String aid,String uid){
    redisTemplate.opsForSet().add(PRIVATE_HASH_KEY,aid);   
    redisTemplate.opsForSet().add(aid,uid);
    return true;
}

4、进行存储redis操作记录/点赞用户和点赞文章
Redis高并发点赞_第4张图片
Redis高并发点赞_第5张图片

源代码:

public class DzSupportServiceImpl implements IDzSupportService
{
    @Autowired
    private DzSupportMapper dzSupportMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private DzArticleServiceImpl dzArticleService;
    //key命名规范 项目名称
    private  static final String PRIVATE_HASH_KEY="dzclick";

    /**
     * 新增存储点赞用户和点赞文章
     * 
     * @param dzSupport 存储点赞用户和点赞文章
     * @return 结果
     */
    @Override
    public int insertDzSupport(DzSupport dzSupport)
    {
        return dzSupportMapper.insertDzSupport(dzSupport);
    }
    @Override
    public int insertDzSupport()
    {
        DzSupport dzSupport=new DzSupport();
        Set<String> aid=redisTemplate.opsForSet().members(PRIVATE_HASH_KEY);  //获取所有新闻点赞的aid
        if(CollectionUtils.isEmpty(aid)){
            return 0;
        }
        for (String sid:aid) {
            if (redisTemplate.opsForSet().members(sid) == null) {
                continue;
            }
            Set<String> uids = redisTemplate.opsForSet().members(sid);   //获取点赞用户uid列表
            if (CollectionUtils.isEmpty(uids)) {
                continue;
            }
            for (String uid : uids) {
                dzSupport.setUid(Long.parseLong(uid));      //存入记录中存储用户点赞id
                dzSupport.setTid(Long.parseLong(sid));      //存入记录中存储点赞文章id
                dzSupportMapper.insertDzSupport(dzSupport);     //将记录存入该表中

            }
            DzArticle dzArticle = dzArticleService.selectDzArticleById(Long.parseLong(sid));
            Long count= redisTemplate.opsForSet().size(sid).intValue()+dzArticle.getNumber(); //计算总数
            dzArticle.setNumber(count);     //更新数据库点赞数量
            //如果消除下面的注释需要更爱DzArticleController中的click方法中对数据的加一操作
            dzArticleService.updateDzArticle(dzArticle);      //DzArticleController中的click方法进行对数据库的加一操作所以加一不存入redis缓存否则就会重复加点击的次数
            redisTemplate.delete(sid);  //删除缓存
        }
        redisTemplate.delete(PRIVATE_HASH_KEY); //删除缓存
        return 1;
    }
 }

5、启动定时任务进行:redis缓存中的点赞数和redis中的操作记录存入数据库中
Redis高并发点赞_第6张图片
上图中的RyTask是我的定时文件,调用步骤四的 DzSupportServiceImpl 文件中的insertDzSupport()无参构造方法,便将redis中的缓存存入数据库了。
6、前端调用定时任务即可
Redis高并发点赞_第7张图片
7、最后一步就是现实点赞数量(点赞数量 = redis缓存中的点赞数量 + 数据库中的点赞数量)将数据返回给前端,然后前端每点一次页面也会更新一次
Redis高并发点赞_第8张图片
源代码:

@Override
public List<DzArticle> selectDzArticleList(DzArticle dzArticle)
{
    List<DzArticle> list = dzArticleMapper.selectDzArticleList(dzArticle); //查询数据库库中的数据
    //点赞数量=数据库中的点赞数(data.getNumber())+redis缓存中的点赞数(redisTemplate.opsForSet().size(data.getAid()+"").intValue())
    for (DzArticle data:list){
        data.setNumber(data.getNumber()+redisTemplate.opsForSet().size(data.getAid()+"").intValue());
    }
    return list;
}

你可能感兴趣的:(Redis,redis)