最近在做微信的摇一摇跑马活动,实现原理是用户摇动手机,通过ajax往数据库写入数据(小马跑的步数),然后PC端用过ajax每一秒钟从数据库中调取一次数据(小马跑的步数),然后显示在PC屏幕上,这样就会非常频繁的读写数据库,而且小马跑步的数据只要活动结束即可清除,完全没有存入数据库的必要。
这个功能由于不能够做成静态化,那么就只能够动态,用动态的时候会对数据库和服务器压力带来很大的考验。
所以就只能用到缓存数据的方式了。
数据缓存的形式包括:
- 将数据缓存到内存,相信大家这个就会想到了Memcached.memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。
- 用文件来缓存数据.将数据保存到文件中,用key=>value的形式来保存,key指文件名.这个地方必须要保证key的唯一性
设置文件的缓存时间,如果过时了就从数据库中得到数据并保存到文件中,下面是一个文件缓存类:
1、缓存数据
2、得到数据
3、判断缓存数据是否存在
4、删除某个缓存数据
5、清除过时的缓存数据
6、清除所以的缓存数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| <?php class Inc_FileCache{ private $cacheTime = 3600; private $cacheDir = './cache'; private $md5 = true; private $suffix = ".php"; public function __construct($config){ if( is_array( $config ) ){ foreach( $config as $key=>$val ){ $this->$key = $val; } } } public function set($key,$val,$leftTime=null){ $key = $this->md5 ? md5($key) : $key; $leftTime = $leftTime ? $leftTime : $this->cacheTime; !file_exists($this->cacheDir) && mkdir($this->cacheDir,0777); $file = $this->cacheDir.'/'.$key.$this->suffix; $val = serialize($val); @file_put_contents($file,$val) or $this->error(__line__,"文件写入失败"); @chmod($file,0777) or $this->error(__line__,"设定文件权限失败"); @touch($file,time()+$leftTime) or $this->error(__line__,"更改文件时间失败"); } public function get($key){ $this->clear(); if( $this->_isset($key) ){ $key_md5 = $this->md5 ? md5($key) : $key; $file = $this->cacheDir.'/'.$key_md5.$this->suffix; $val = file_get_contents($file); return unserialize($val); } return null; } public function _isset($key){ $key = $this->md5 ? md5($key) : $key; $file = $this->cacheDir.'/'.$key.$this->suffix; if( file_exists($file) ){ if( @filemtime($file) >= time() ){ return true; }else{ @unlink($file); return false; } } return false; } public function _unset($key){ if( $this->_isset($key) ){ $key_md5 = $this->md5 ? md5($key) : $key; $file = $this->cacheDir.'/'.$key_md5.$this->suffix; return @unlink($file); } return false; } public function clear(){ $files = scandir($this->cacheDir); foreach ($files as $val){ if (@filemtime($this->cacheDir."/".$val) < time()){ @unlink($this->cacheDir."/".$val); } } } public function clear_all(){ $files = scandir($this->cacheDir); foreach ($files as $val){ @unlink($this->cacheDir."/".$val); } } private function error($line,$msg){ die("出错文件:".__file__."/n出错行:$line/n错误信息:$msg"); } } ?>
|
在页面中的调用方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php include("./cacheClass.php"); $cacheFile = new Inc_FileCache(array('cacheTime'=>60,'suffix'=>'.php')); $value1 = '缓存成功1'; $value2 = '缓存成功2'; $value3 = '缓存成功3'; $cacheFile->set('key1',$value1); $cacheFile->set('key2',$value2); $cacheFile->set('key3',$value3); echo $cacheFile->get('key3'); ?>
|
对于跑马这种活动,还有一种数据存储方式是:在MySQL中创建一张使用MEMORY引擎的表。MEMORY存储引擎使用保存在内存中的内容来创建表,且默认使用哈希索引,这使得它的响应速度非常快,对创建临时表非常有用。但是,当服务器关闭时,所有存储在MEMORY表里的数据都会丢失。MEMORY表只用于特殊范围,不会用于长期存储数据。