memcache构建简单的内存消息队列
memcache功能太简单了,只能 set get 和delete, 只能保存key-value的数据, 不能保存列表。 当然也可以把一个列表给序列化了之后存进memcache, 但是会存在并发的问题, 每次保存数据(插队或者出队)的时候都要给数据加锁,在高并发的情况下很难保证数据的一致性!
但是memcache 有一个 increment 的操作,为某一个键对应的值进行加1(实际上是加法运算, 默认加1), 这个操作是原子性的, 所以我们可以通过这个来维护一个自增的id来保证数据的唯一。 再加上两个指针来维护起始键值, 这样就构建了一个简单的但相队列!!
上代码:
代码如下 | 复制代码 |
<?php /** * memcache构建的简单内存队列 * * @author: jeffjing */ class memList { private $memcache; // memcache类 private $queKeyPrefix; //数据键前缀 private $startKey; //开始指针键 private $startKey; //结束指针键 public function __construct($key){ $this->queKeyPrefix = "MEMQUE_{$key}_"; $this->startKey = "MEMQUE_SK_{$key}"; $this->endKey = "MEMQUE_EK_{$key}"; } /** * 获取列表 * 先拿到开始结束指针, 然后去拿数据 * * @return array */ public function getList(){ $startP = $this->memcache->get($this->startKey); $endP = $this->memcache->get($this->endKey); empty($startP) && $startP = 0; empty($endP) && $endP = 0; $arr = array(); for($i = $startP ; $i < $endP; ++$i) { $key = $this->queKeyPrefix . $i; $arr[] = $this->memcache->get($key); } return $arr; } /** * 插入队列 * 结束指针后移,拿到一个自增的id * 再把值存到指针指定的位置 * * @return void */ public function in($value){ $index = $this->memcache->increment($this->endKey); $key = $this->queKeyPrefix . $index; $this->memcache->set($key, $value); } /** * 出队 * 很简单, 把开始值取出后开始指针后移 * * @return mixed */ public function out(){ $result = $this->memcache->get($this->startKey); $this->memcache->increment($this->startKey); return $result; } } |
关于memcached的一些事情
内存存储方式(slab allocator)
memcached的数据存储方式为slab allocator即数据分片, 在服务启动的时候先把内存分成不同大小的 chunk, 当有数据过来的时候来存储到一个合适大小的chunk当中
之前版本是直接分配内存, 导致内存碎片 随机查找等问题。。。
数据过期删除机制
memcached在数据过期之后,并不会去删除数据, 但是不能访问过期的数据, 过期数据占用的空间会被重复利用
memcached采用lazy expiration.不会去主动扫描一个数据项是否过期, 而是在数据get的时候判断是否已经过期.
删除的算法是LRU(Least Recently Used) , 优先删除最近使用较少的数据
memcached的分布式机制
虽说memcached是一个分布式的缓存, 但是memcached本身并没有实现任何分布式的机制, 分布式的功能主要是由客户端来实现的。
程序通过addserver增加多个memcahced服务到客户端(memcache扩展), 在存取数据之前,客户端会先通过hash算法得到存储数据的节点, 然后再去存取数据, 当其中一台memcached服务器挂掉或者新增一台memcached服务器, hash算法得到的存储数据的节点就会变化, 去新的服务器上去存取数据。
一、Memcache简介
Memcache(内存,缓存) :是一个高性能的分布式的内存对象缓存系统。通过在内存里维护一个巨大的HashTable。由Memcached来管理这个巨大的HashTable。
二、Memcache 与 Memcached的区别
Memcache是软件名称,Memcached是启动后的进程名称。
三、Memcache工作原理
memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
在没有安装memcache的时候网站工作的原理是:浏览器访问服务器脚本,然后服务器脚本访问数据库,处理后输出给浏览器。
而如果你的服务器安装了memcache的话,在执行了第一次数据库查询后,服务器脚本后把结果集存储到memcached内存缓存中,以后使用的时候就可不必查询数据库而是直接向memcached内存缓存索取,大大提高的效率。
四、安装Memcache服务器
代码如下 | 复制代码 |
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz |
五、Memcached服务器启动时的基本设置
如:Memcahced –d –m 128 –l 192.168.1.111 –p 11211 –u root
下边是Memcahced 部分参数的说明
-p memcached监听的TCP端口
-l 连接的IP地址, 默认是本机
-d 以daemon方式运行,将程序放入后台
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB ,最大好像2G
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
可以批量进行添加上传,简单方便
代码如下 | 复制代码 |
<script type="text/javascript" src="jquery-1.5.1.min.js"></script> <script type="text/javascript" >
createUploadIframe: function(id, uri) } } return jQuery('#' + frameId).get(0);
ajaxFileUpload: function(s) { // The request was completed // Handle the global AJAX counter // Process result jQuery(io).unbind() setTimeout(function() }, 100) xml = null } var form = jQuery('#' + formId); } catch(e) }, uploadHttpData: function( r, type ) { return data; </script> <form id="upform" action="" method="post" enctype="multipart/form-data"> <script type="text/javascript"> |
up_deal.php
代码如下 | 复制代码 |
<?php if(!file_exists('upload')){mkdir('upload');} |
今天要做一个专门用于处理搜索文件的功能,而搜索的文件可能是位于某个目录下的,寻找目录下是否存在该目录,PHP函数当中好像没有专门这样的搜索函数。
文件的操作在 php 中是不可缺少的,而文件的使用频率也是非常高的,比如我们常见的目录管理系统,无数据库留言本等,都用到了文件的操作,而这里的文件指的不仅仅是目录的操作,还有指定文件的操作,比如 txt 文件等。
下面是一个专门用于文件搜索的函数方法,file_search 是方法名,后面有三个参数,$directory 是要搜索的文件所在的目录,比如 “admin/”目录下, $search 是搜索的文件了,$recursive 是判断是否搜索成功的,默认就可以了,如果还需要其它操作,可以在后面进行添加相应参数即可。
例1
代码如下 | 复制代码 |
<?php function file_search($directory, $search, $recursive = TRUE) |
例2
代码如下 | 复制代码 |
<?php //test: |
例3
使用php glob函数查找文件,遍历文件目录
函数说明:array glob ( string $pattern [, int $flags ] )
功能:寻找与模式匹配的文件路径,返回包含匹配文件(目录)的数组(注:被检查的文件必须是服务器系统的,不能用于远程文件)
参数说明:第一个参数:匹配模式;第二个可选参数:
•GLOB_MARK - 在每个返回的项目中加一个斜线
•GLOB_NOSORT - 按照文件在目录中出现的原始顺序返回(不排序)
•GLOB_NOCHECK - 如果没有文件匹配则返回用于搜索的模式
•GLOB_NOESCAPE - 反斜线不转义元字符
•GLOB_BRACE - 扩充 {a,b,c} 来匹配 'a','b' 或 'c'
•GLOB_ONLYDIR - 仅返回与模式匹配的目录项
代码如下 | 复制代码 |
|
例4
代码如下 | 复制代码 |
<?php print_r(listDir('./')); //遍历当前目录 |
例1
PHP代码:
代码如下 | 复制代码 |
<?php @exec("arp -a",$array); //执行arp -a命令,结果放到数组$array中 echo "<pre>"; print_r($array); //打印获取的数组 foreach($array as $value) { if( //匹配结果放到数组$mac_array strpos($value,$_SERVER["REMOTE_ADDR"]) && preg_match("/(:?[0-9a-f]{2}[:-]){5}[0-9a-f]{2}/i",$value,$mac_array) ) { $mac = $mac_array[0]; break; } } echo $mac; //输出客户端MAC ?> |
例2
代码如下 | 复制代码 |
<?php |
获取服务端的逻辑没什么大问题,可能会存在权限问题。
获取客户端的时候,可能会比较慢,arp/nbstat命令执行会比较慢。
代码如下 | 复制代码 |
<script language="JScript" event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for="foo"> |
只适用于IE浏览器,而且会有告警提示
相关文章
- 最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
- 这篇文章主要介绍了浅谈redis key值内存消耗以及性能影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-07
- 这篇文章主要介绍了详解分析MySQL8.0的内存消耗,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...2021-03-23
PHP分布式框架如何使用Memcache同步SESSION教程
本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25- 这篇文章主要介绍了解决使用OpenCV中的imread()内存报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 今天小编就为大家分享一篇解决tensorflow训练时内存持续增加并占满的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-22
- memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志。然后通过定时程序将内容落地到文件或者数据库。php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问...2014-05-31
- 在MySQL中,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时...2015-11-24
- 这篇文章介绍了C#操作内存读写方法的主要实现代码,下面让我们来看看具体的实例实现,有需要的朋友可以参考一下...2020-06-25
- 在本篇文章里小编给大家整理了关于C#托管内存与非托管内存之间的转换的实例以及相关知识点,需要的朋友们学习下。...2020-06-25
- 这篇文章主要介绍了Redis swap空间的使用示例,帮助大家更好的理解和学习使用Redis数据库,感兴趣的朋友可以了解下...2021-03-25
- C# 实现简单打印的实例代码,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了c# 通过内存映射实现文件共享内存的示例代码,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-04-24
- 这篇文章主要介绍了Android内存溢出及内存泄漏原因进行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-06
完美解决TensorFlow和Keras大数据量内存溢出的问题
这篇文章主要介绍了完美解决TensorFlow和Keras大数据量内存溢出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-04- 很多phper不知道如何在Windows下搭建Memcache的开发调试环境,最近个人也在研究Memcache,记录下自己安装搭建的过程。 ...2016-01-27
在Mac OS的PHP环境下安装配置MemCache的全过程解析
这篇文章主要介绍了在Mac OS的PHP环境下安装配置MemCache的全过程解析,MemCache是一套分布式的高速缓存系统,需要的朋友可以参考下...2016-02-18- [ajax介绍] ajax是使用客户端脚本与web服务器交换数据的web应用开发方法。web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用ajax,用户可以创建接近本地...2016-11-25
php memcache和php memcached比较以及问题
php memcache和php memcached是php的memcache分布式的高速缓存系统的两个客户端,php memcache是老客户端,php memcached是功能更加完善的新的代替php memcached的。...2016-11-25- 这篇文章主要介绍了C#最简单的字符串加密解密方法,本文直接给出实例代码,需要的朋友可以参考下...2020-06-25