场景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);
}
其他待续…………