这篇干货,适用中小型网站浏览更新频繁,减少mysql服务器(鸭梨),减少服务器io的一种绝佳方案。
平常在工作,开发中设计或做数据统计的时候,习惯把浏览量放在资源表中,一般小网站做法是访问一次更新一次资源浏览量:比如blog系统,访问blog详情页时,blog浏览量增加1,就会做一次数据update,这样的后果是,频繁更新数据库,造成数据库链接过多 + 服务器IQ读写频繁,网站浏览量稍大点服务器就容易宕机。.seedpaddy.com
看图说话,浏览量更新流程图.seedpaddy.com
结合上图,解析下流程图:
1.资源浏览量,比如blog详情页的浏览量 views = mysql(数据表的浏览量) + memcache(浏览量) 每次访客访问blog详情页,浏览量就会+1,使用浏览延迟更新,仅更新memcache中的浏览量,并把浏览量缓存的key hash到array中(这很重要),当memcache中的浏览量达到某一值,比如100时,做一次update mysql数据的浏览量,并即时把memcache的浏览量设置为0。
2.由于资源浏览量部分保存在memcache中,重启memcache,或者其他原因,浏览量会丢失,需要额外开发一个定时任务更新缓存的浏览量到mysql中;
3.故,图中浏览量定时任务(比如凌晨3点)更新memcache缓存到数据库中,这时(第一点hash的key就显得特别重要),定时任务就变成了遍历hash数组,每一个hash 的value就是一组浏览量缓存Key的集合,再遍历这些浏览量的key 获取某资源的浏览量,update到mysql,在更新前及时设置这个浏览量缓存为0,以便新的浏览量更新到缓存不受定时任务影响。
看懂此浏览图,请先阅读文章末尾中文章。.seedpaddy.com
特别是hash数组,与其中奥妙。
额外知识:测试,memcache value可存储多少Key . 用于缓存浏览量更新 结合浏览量,得到 hash 数组。
require(ROOT_PATH . 'public/lib/db/memcacheServer.class.php'); $mc = memcacheServer::getInstance($configMemcache); //系统 win7系统,memcache 默认配置,若把value值设置为2m,存储key会更多 //memcache 版本 1.4.4-14-g9c660c0 //Notice: MemcachePool::set(): Server 127.0.0.1 (tcp 11211, udp 0) //failed with: SERVER_ERROR object too large for cache (3) //测试输出,数组中能够存放 220000 key $key = 0; for($i=1; $i<10000000; $i++){ $arr[] = 'mkey_baidu_google_seedpaddy_' . $i; if($i % 10000 == 0) { $key++; $mc->set('mkey_'.$key,$arr); $getMem = $mc->get('mkey_'.$key); if($getMem == false) { echo $key."======={$i}<br/>"; break; } echo $key."<br/>"; ob_flush(); flush(); } } $ckey = 'mkey_' . ($key - 1); $getMems = $mc->get($ckey); echo "<pre>"; print_r($getMems); exit;
详情,关于memcacheServer.class.php 类库,相关观念等请参阅:
PHP 链接 Memcache 安装与概念理解
PHP 链接 Memcached 集群封装类库