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算法得到的存储数据的节点就会变化, 去新的服务器上去存取数据。

时间: 2024-09-20 10:47:57

memcache构建简单的内存消息队列的相关文章

基于TableStore构建简易海量Topic消息队列

前言 消息队列,通常有两种场景,一种是发布者订阅模式,一种是生产者消费者模式.发布者订阅模式,即发布者生产消息放入队列,多个监听的消费者都会收到同一份消息,也就是每个消费者收到的消息是一样的.生产者消费者模式,生产者生产消息放入队列,多个消费者同时监听队列,谁先抢到消息就会从队列中取走消息,最终每个消息只会有一个消费者拥有. 在大数据时代,传统的生产者消费者队列模式中的Topic数目可能从少量的几个变为海量topic.例如要实现一个全网爬虫抓取任务调度系统,每个大型的门户,SNS都会成为一个to

【转载】消息队列RabbitMQ入门介绍

(一)基本概念       RabbitMQ 是流行的开源消息队列系统,用 erlang 语言开发.我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持.RabbitMQ 是 AMQP(高级消息队列协议)的标准实现.如果不熟悉 AMQP,直接看 RabbitMQ 的文档会比较困难.不过它也只有几个关键概念,这里简单介绍. RabbitMQ 的结构图如下: 几个概念说明: Broker:简单来说就是消息队列服务器实体.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列.Queue:消

大型网站架构系列:消息队列(二) (转)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

PHP memcache实现消息队列实例

现在memcache在服务器缓存应用比较广泛,下面我来介绍memcache实现消息队列等待的一个例子,有需要了解的朋友可参考. memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志.然后通过定时程序将内容落地到文件或者数据库. php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问题,那么可以采取队列. 方便实现队列的轻量级队列服务器是: starling支持memcache协议的轻量级持久化服务器 https://github.co

PHP+memcache实现消息队列案例分享_php实例

memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志.然后通过定时程序将内容落地到文件或者数据库. php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问题,那么可以采取队列.方便实现队列的轻量级队列服务器是:starling支持memcache协议的轻量级持久化服务器https://github.com/starling/starlingBeanstalkd轻量.高效,支持持久化,每秒可处理3000左右的队列http://kr.gi

php Memcache 中实现消息队列_php技巧

对于一个很大的消息队列,频繁进行进行大数据库的序列化 和 反序列化,有太耗费.下面是我用PHP 实现的一个消息队列,只需要在尾部插入一个数据,就操作尾部,不用操作整个消息队列进行读取,与操作.但是,这个消息队列不是线程安全的,我只是尽量的避免了冲突的可能性.如果消息不是非常的密集,比如几秒钟才一个,还是可以考虑这样使用的. 如果你要实现线程安全的,一个建议是通过文件进行锁定,然后进行操作.下面是代码: 复制代码 代码如下: class Memcache_Queue { private $memc

消息队列(一)——消息的简单发送与接收

    背景           开发者经常遇到需要异步执行操作的情况(即过程不等到操作完成就开始).消息队列提供一个中心位置或池,您可以在其中放置或从中提取数据,从而满足了这一要求.一个应用程序能够把消息存放在队列中,然后继续自己的业务,另一个应用程序在运行时再提取这些数据.   简单理解                             感觉这里的消息队列还是一个典型的"buffer"思想:即就像喝水一样,如果有一杯水,我可能就直接喝掉了:但是如果有一壶水,我可能要先把水倒进

RocketMQ 消息队列简单部署

RocketMQ 是alibaba开源的消息队列. 本文使用的是开源版本v3.18 系统: centos6.x最小化安装 需要用到的软件包: jdk-7u67-linux-x64.tar.gz alibaba-rocketmq-3.1.8.tar.gz 开始安装 #tar xvf jdk-7u67-linux-x64.tar.gz -C /opt/ #tar xvf alibaba-rocketmq-3.1.8.tar.gz -C /opt/ #ln -s /opt/jdk1.7.0_67 /o

WCF分布式开发必备知识(1):MSMQ消息队列

学习WCF是不是就不需要学习.Net Remoting.ASMX.WSE和MSMQ了? 这个问题一直是很多开发者关注的问题.按照微软的说法,WCF是微软分布式应用程序开发的集大成者,学习WCF编程,就不需要了解其他的技术.这个说法有一定的道理.WCF的出现确实解决了很多问题,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting.ASMX.WSE和MSMQ.以通信(Communiation)范围而论,它可以跨进程.跨机器.跨子网.企业网乃至于 Internet:可以以