redis和 mysql 数据同步的实践

场景1:统计访问数量

    统计页面访问数量是很经常的需求,那么如何把redis和mysql做好配合呢?
    首先通过redis的 incs 增加数量
    HINCRBY pro:counter:ID page_view 1 
    页面实时显示redis中的数据(如果需要排序等操作需要单独处理)
    与此同时把对应的key加入到队列中去
    LPUSH pro:list  ID
    根据数据库需求的及时性确定队列的执行频率
    目前使用的定时任务去更新数据如果频率太高不是特别好,不过目前够用了
    RPOP  pro:list
    读取对应的数据更新到数据库中

场景2:后台修改数据的同步

    比如后台操作了用户的某些属性,如何同步到redis数据中?
    mysql->exe('update user set name="xxx" where id=1 ');
    需要同时更新到redis中,简单粗暴的方式就是直接更新到redis中
    hset pro:userinfo:1 name xxx
    也可以分成两步执行,先更新到数据库中,确认无误后通过刷新缓存重新获取用户的信息

场景3:redis数据的不同步问题

  由于用户的帖子数量和帖子列表的操作不是原子操作,如何做到统一?
  可以通过读取发帖列表的总数获得数据
  ZCARD pro:userpostlist:ID
  但是每次都需要计算,也不符合简单的原则,最好的办法是直接读取用户信息中的帖子总数。
  那我们可以定期修正用户信息的总数!
  用户有操作时候进入队列,固定时间内操作一次即可

  if(! $redis->exist('pro:userrsync:ID')){
           $num = $redis->zcard('pro:userpostlist:ID');
           $redis->hset('pro:userinfo:ID','post_nums',$num);
           $redis->set('pro:userrsync:ID',1,36000);
  } 

其他待续…………

    原文作者:daos
    原文地址: https://www.jianshu.com/p/85acf9e79f04
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞