问题分析
问题一:要求日志最好入库;但是,直接入库mysql确实扛不住,批量入库没有问题,done。【批量入库和直接入库性能差异】
问题二:批量入库就需要有高并发的消息队列,决定采用redis list 仿真实现,而且方便回滚。
问题三:日志量毕竟大,保存最近30条足矣,决定用php写个离线统计和清理脚本。
一、设计数据库表和存储
考虑到log系统对数据库的性能更多一些,稳定性和安全性没有那么高,存储引擎自然是只支持select insert 没有索引的archive。如果确实有update需求,也可以采用myISAM。
考虑到log是实时记录的所有数据,数量可能巨大,主键采用bigint,自增即可。
考虑到log系统以写为主,统计采用离线计算,字段均不要出现索引,因为一方面可能会影响插入数据效率,另外读时候会造成死锁,影响写数据。
二、redis存储数据形成消息队列
/**
* 使用队列生成reids测试数据
* 成功:执行 RPUSH操作后,返回列表的长度:8
*/
public function createRedisList($listKey = ‘message01‘)
{
$redis = RedisInstance::MasterInstance();
$redis->select(1);
$message =[
‘type‘ => ‘say‘,
‘userId‘ => $redis->incr(‘user_id‘),
‘userName‘ => ‘Tinywan‘ . mt_rand(100, 9999), //是否正在录像
‘userImage‘ => ‘/res/pub/user-default-w.png‘, //是否正在录像
‘openId‘ => ‘openId‘ . mt_rand(100000, 9999999999999999),
‘roomId‘ => ‘openId‘ . mt_rand(30, 50),
‘createTime‘ => date(‘Y-m-d H:i:s‘, time()),
‘content‘ => $redis->incr(‘content‘) //当前是否正在打流状态
];
$rPushResul = $redis->rPush($listKey, json_encode($message)); //执行成功后返回当前列表的长度 9
return $rPushResul;
}
三、读取redis消息队列里面的数据,批量入库
第一种思路:
/**
* 消息Redis方法保存到Mysql数据库
* @param string $liveKey
*/
public function RedisSaveToMysql($lis