`
pcajax
  • 浏览: 2157275 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Memcache 中实现消息队列

阅读更多

 

    Memcache 一般用于缓存服务。但是很多时候,比如一个消息广播系统,需要一个消息队列。直接从数据库取消息,负载往往不行。如果将整个消息队列用一个key缓存到memcache里面,

对于一个很大的消息队列,频繁进行进行大数据库的序列化 和 反序列化,有太耗费。下面是我用PHP 实现的一个消息队列,只需要在尾部插入一个数据,就操作尾部,不用操作整个消息队列进行读取,与操作。但是,这个消息队列不是线程安全的,我只是尽量的避免了冲突的可能性。如果消息不是非常的密集,比如几秒钟才一个,还是可以考虑这样使用的。

    如果你要实现线程安全的,一个建议是通过文件进行锁定,然后进行操作。下面是代码:

 

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->class Memcache_Queue
{
    
private $memcache;

    
private $name;

    
private $prefix;

    
function __construct($maxSize, $name, $memcache, $prefix = "__memcache_queue__")
    {
        
if ($memcache == null) {
            
throw new Exception("memcache object is null, new the object first.");
        }
        
$this->memcache = $memcache;
        
$this->name = $name;
        
$this->prefix = $prefix;

<script type="text/javascript"><!-- google_ad_client = "pub-6770445892601887"; /* 468x60, 创建于 09-11-19 */ google_ad_slot = "4437639877"; google_ad_width = 468; google_ad_height = 60; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>         
$this->maxSize = $maxSize;
        
$this->front = 0;
        
$this->real = 0;
        
$this->size = 0;
    }

    
function __get($name)
    {
        
return $this->get($name);
    }

    
function __set($name, $value
    {
        
$this->add($name, $value);
        
return $this;
    }

    
function isEmpty() 
    {
        
return $this->size == 0;
    }

    
function isFull()
    {
        
return $this->size == $this->maxSize;
    }

    
function enQueue($data)
    {
        
if ($this->isFull()) {
            
throw new Exception("Queue is Full");
        }
        
$this->increment("size");
        
$this->set($this->real, $data);
        
$this->set("real", ($this->real + 1% $this->maxSize);
        
return $this;
    }

    
function deQueue()
    {
        
if ($this->isEmpty()) {
            
throw new Exception("Queue is Empty");
        }
        
$this->decrement("size");
        
$this->delete($this->front);
        
$this->set("front", ($this->front + 1% $this->maxSize);
        
return $this;
    }

    
function getTop()
    {
        
return $this->get($this->front);
    }

    
function getAll()
    {
        
return $this->getPage();
    }

    
function getPage($offset = 0, $limit = 0)
    {
        
if ($this->isEmpty() || $this->size < $offset) {
            
return null;
        }
        
$keys[] = $this->getKeyByPos(($this->front + $offset% $this->maxSize);
        
$num = 1;
        
for ($pos = ($this->front + $offset + 1% $this->maxSize; $pos != $this->real; $pos = ($pos + 1% $this->maxSize) 
        {
             
$keys[] = $this->getKeyByPos($pos);
             
$num++;
             
if ($limit > 0 && $limit == $num) {
                 
break;
             }
        }
        
return array_values($this->memcache->get($keys));
    }

    
function makeEmpty()
    {
        
$keys = $this->getAllKeys();
        
foreach ($keys as $value) {
            
$this->delete($value);
        }
        
$this->delete("real");
        
$this->delete("front");
        
$this->delete("size");
        
$this->delete("maxSize");
    }

    
private function getAllKeys()
    {
        
if ($this->isEmpty()) 
        {
            
return array();
        }
        
$keys[] = $this->getKeyByPos($this->front);
        
for ($pos = ($this->front + 1% $this->maxSize; $pos != $this->real; $pos = ($pos + 1% $this->maxSize) 
        {
            
$keys[] = $this->getKeyByPos($pos);
        }
        
return $keys;
    }

    
private function add($pos, $data
    {
        
$this->memcache->add($this->getKeyByPos($pos), $data);
        
return $this;
    }

    
private function increment($pos)
    {
        
return $this->memcache->increment($this->getKeyByPos($pos));
    }

    
private function decrement($pos
    {
        
$this->memcache->decrement($this->getKeyByPos($pos));
    }

    
private function set($pos, $data
    {
        
$this->memcache->set($this->getKeyByPos($pos), $data);
        
return $this;
    }

    
private function get($pos)
    {
        
return $this->memcache->get($this->getKeyByPos($pos));
    }

    
private function delete($pos)
    {
        
return $this->memcache->delete($this->getKeyByPos($pos));
    }

    
private function getKeyByPos($pos)
    {
        
return $this->prefix . $this->name . $pos;
    }
}
分享到:
评论

相关推荐

    php Memcache 中实现消息队列

    总的来说,使用PHP和Memcache实现消息队列是一种巧妙的方法,尤其适用于消息不太密集且对线程安全性要求不高的场景。然而,为了在高并发和多线程环境中保证系统的稳定性和可靠性,开发者需要考虑实现更复杂的同步...

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

    标题《PHP+memcache实现消息队列案例分享》以及描述《现在memcache在服务器缓存应用比较广泛,下面我来介绍memcache实现消息队列等待的一个例子,有需要了解的朋友可参考。》指出了文章的核心内容,即是关于如何使用...

    php的memcache类分享(memcache队列)

    类中提到了增加了反向读取功能,这意味着用户可以以与常规FIFO相反的顺序来读取队列中的元素,这增加了队列使用上的灵活性。 6. 关于锁机制: memcacheQueue类内部通过锁机制(lock key)来保证队列操作的原子性,...

    PHP实现的memcache环形队列类实例

    描述提到的“基于memcache实现环形队列的方法”意味着这个PHP类是借助memcache这一内存对象缓存系统来存储和操作队列中的数据。memcache是一个广泛使用的分布式内存缓存系统,能够提高Web应用的性能,通过将数据存储...

    PHP消息中间件----消息队列: MEMCACHEQ相关插件.rar

    通过这些插件,开发者可以轻松地将PHP应用接入到MEMCACHEQ消息队列中,从而实现高效的数据管理和处理。 描述中的"PHP结合memcacheq消息队列解决并发问题"进一步强调了MEMCACHEQ在处理并发场景中的作用。在高并发...

    详解Redis用链表实现消息队列

    个人认为redis消息队列有一个好处,就是可以实现分布式和共享,就和memcache作为mysql的缓存和mysql自带的缓存一样。 链表实现消息队列 Redis链表支持前后插入以及前后取出,所以如果往尾部插入元素,往头部取出...

    MemCache和Redis缓存介绍

    4. **适用场景**:由于其丰富的数据结构和持久化功能,Redis常用于缓存、消息队列、计数器、社交网络、实时统计等多种场景,尤其在需要复杂数据操作和数据持久化的应用中更为适用。 **对比与选择** MemCache和...

    memcache,mencached,php5.3.8,redis2.4,sphinx-1.0.4.tgz

    Redis作为内存数据结构存储,通常用于缓存、消息队列以及实现复杂的数据结构操作。在PHP中,有专门的Redis扩展允许开发者方便地与Redis进行交互,提高应用性能。 **Sphinx 1.0.4** 是一个开源的全文搜索引擎,它...

    PHP基于Redis消息队列实现发布微博的方法

    通过这种方式,我们可以有效地缓解MySQL数据库的并发压力,因为所有的写操作都先暂存于Redis队列中,然后在后台线程中慢慢处理。这种方法特别适用于高并发场景,例如抢购活动、实时评论发布等。 此外,文章中还提到...

    用PHP写的基于Memcache的Queue实现代码

    本文将详细介绍一个使用PHP编写的基于Memcache的队列(Queue)实现。队列是一种先进先出(FIFO...此外,由于Memcache是内存存储,如果服务器重启,队列中的数据将会丢失,因此在实际应用中可能需要考虑持久化存储方案。

    php memcache redis.dll

    Redis是一个开源的、支持网络的、键值对存储系统,常用于实现数据缓存、消息队列等。PHP的`php_redis.dll`扩展是与Redis通信的桥梁,它同样需要被放入PHP的`ext`目录,并在`php.ini`中启用,添加“`extension=...

    phpstudy php7.012 nts memcache.dll redis.dll扩展带说明

    使用Redis来处理会话存储、发布订阅消息或者作为队列系统。合理地利用这两种数据存储技术,可以有效优化网站性能,提高用户体验。 总结一下,这个压缩包提供的`php7-redis-memcache`资源是为了帮助开发者在PHPStudy...

    Memcache 在PHP中的使用技巧

    - Memcache在消息队列中的应用:可以利用Memcache作为临时存储,实现消息的暂存和传递。 以上是对“Memcache在PHP中的使用技巧”这一主题的详细说明,涵盖了基本操作和实际应用场景,以及相关的扩展知识。

    队列在编程中的实际应用(php)

    Ruby语言中的Starling是一个轻量级的持久化服务器,它支持MemCache协议,使得创建网络访问队列变得异常简单。Starling对于创建多点和多台机器间的异步工作进程具有重要意义,因为它可以处理大量的队列消息并保持服务...

    PHP4.3 mongo memcache solr redis.dll扩展包.zip 以及配置方法

    它的高速性能和丰富的数据结构使得在PHP4.3中使用redis.dll扩展可以大大提高应用性能,特别是在处理实时数据和实现分布式队列时。 配置这些扩展通常涉及以下步骤: 1. 下载扩展:找到适用于PHP4.3的mongo、...

Global site tag (gtag.js) - Google Analytics