缓存应对的场景php
一个网页存在不一样区域的内容,不一样区域的更新内容和频率各不相同html
动态计算信息,并根据结果展现不一样的内容,例如登录状态,每一个用户状态不一样,显示不一样mysql
页面级的缓存(静态文件),只提升了读的效率,没有解决写的效率的问题算法
在数据库和动态内容之间创建缓存区,并部署在独立服务器上,用于加速读写操做,这里是使用memcached
来讲明sql
memcached使用了高效的基于key的hash算法来存储数据结构,而且使用了精心设计的内存分配器,使得查询时间复杂度达到O(1),无论存了多少数据,查询出来的时间都不变(看不懂就跳过,其实我也不是特别明白)。数据库
既然是缓存,即对要缓存的数据进行过时时间设置缓存
做为分布式缓存系统,memcached能够运行在独立服务器上,使用TCP Socket来访问服务器
使用了libevent函数库来实现网络并发模型,其中包括epoll,较大并发依然有很好的性能网络
存储复杂内容的时候,使用序列化技术,将要存储的对象进行序列化,取出时,在进行反序列化操做数据结构
<?php $user_ticket = '0sdb129dst1ef021263ff121'; $memcache = memcache_conect('192.168.100.100', 11711); $user = $memcache->get($user_ticket); if ($user !== false) { var_dump($user); //缓存获取的对象,打印出来 exit; } $sql = "select * from users where user_ticket = '{$user_ticket}'"; // 没有缓存对象,从数据库读取 $conn = mysql_connect('localhost', 'root', 'pass','db_user'); $res = mysql_query($sql, $conn); $user = mysql_fetch_array($res, MYSQL_ASSOC); $memcach->add($user_ticket, $user, false, 3600); // 将从数据库读取的内容,缓存起来,下次就从缓存读取 var_dump($user);
<?php $page = 'article_9212f.html'; $memcache = memcache_connect('192.168.100.100', 11711); $count = $memcache->increment($page, 1); if ($count === false) { $memcache->add($page, 1, false, 0); // 第一次,使用新增缓存数据 exit(1); } if ($count == 1000) { // 当缓存数达到1000时,执行一次写入数据库操做 $memcache->set($page, 0, false, 0); // 对1000的缓存项,进行归零操做,便于下个1000的递增 $sql = "update page_view set view_count=view_count + ".$count." where page = '{$page}'"; $conn = mysql_connect('localhost','root','pass','db_user'); mysql_query($sql,$conn); mysql_close($conn); }
memcached的水平扩展代码实现
<?php function memcache_connector($key){ // 多台主机IP $hosts = [ '192.168.100.101', '192.168.100.102', '192.168.100.103', ]; // $key 实现md5加密得到相似“e4u7r3194fj12dfhu1”值 // 只获取前5个字符 // 使用hexdc将前5个字符进行十进制转换 // 得到数值进行“模3”的处理,若是有4台主机,就进行“模4”的处理,依次类推,注意,0表明第一台主机 $host_index = hexdec(substr(md5($key), 0, 5)) % 3; $host = $hosts[$host_index]; return memcache_connect($host, 11711); }