Memcache 缓存 MYSQL的查询 降低mysql的连接率
使用 Memcache/Redis 缓存 MYSQL的查询和更新 降低mysql的连接率开销
其实大部分的mysql查询 都是可以被短期缓存的
这种在大流量并发的情况下 可以非常有效的降低查询开销
这里介绍2种场景 使用Memcache来缓存
第一种 查询数据
1 2 3 4 5 6 7 8 9 |
$memcache = new Memcache; $memcache->connect('127.0.0.1', 11211) or die ("Could not connect"); $uuid = md5('前缀_'.$value); //作为存储的唯一key $data = $memcache->get($uuid);//查询缓存 if(!$data) { // 没缓存 $data = mysql_query('查询数据库'); $memcache->set($uuid,$data,1800); //设置缓存,这里的1800 = 半小时 3600 = 1小时 } var_dump($data); |
第二种 更新数据
这种固定在更新数字上 例如 帖子 被点击+1 用户访问页数 +1
通常会直接更新mysql 每次+1 都要connection mysql 然后update 操作
小流量当然无所谓 但是大流量的情况 就非常耗费资源了
使用缓存 可以这样做 达到一个量级 在一次性更新 比如点击数缓存已经达到50 就更新一次点击数
这样本来想要connection 50次mysql + update 50次+1 就变为 connection 1次 + update 1次+50
开销当然降低了 对吧
以Redis来做例子 和Memcache/ SSDB / levelDB 都类似 差别不大
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$aid = isset($_GET['aid']) ? trim($_GET['aid']) : 0; $this_click_num = 0; if($aid != 0 AND empty($aid)) { $update_till_num = 100; //达到100才更新一次mysql $r = new Redis(); $r->connect('127.0.0.1',6379); $this_click_num = $r->get('count_xin_newgame:'.$aid); //取当前点击数 $r->set('count_xin_newgame:'.$aid,$this_click_num+1); //当前点击数+1 if($this_click_num >= $update_till_num) { //如果数据超 $update_till_num 定义的 100条 就更新mysql数据库 require_once(dirname(__FILE__)."/db.php"); $db->ExecuteNoneQuery( "UPDATE `addonnewgame` SET `game_num` = game_num + '{$update_till_num}' WHERE `dede_addonnewgame`.`aid` ={$aid};" ); $r->set('count_xin_newgame:'.$aid,0); //更新完成以后 重新将AID的点击数 设置为0 } $r->setTimeout('count_xin_newgame:'.$aid,7*24*60*60); exit($this_click_num); } |