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

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

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

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;

$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;
    }
}

转载于:https://www.cnblogs.com/Alight/p/3549132.html

PHP下用Memcache 实现消息队列相关推荐

  1. PHP memcache实现消息队列实例

    现在,memcache于server缓存广泛应用.下面我来介绍一下memcache消息队列中等待的样本实现,有需要了解的朋友可以参考. memche消息队列原则key上做文章.后消息或者日志. 然后通 ...

  2. 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议

    前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比. 详细介绍 RabbitMQ 在 ...

  3. 消息队列服务器 轻量,PHP的轻量消息队列php-resque使用说明

    消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操 ...

  4. 弃用消息队列!这个新一代消息系统,腾讯、华为都用疯了?

    在 SOA 架构盛行的今天,无论大数据工程师还是开发工程师,利用消息中间件实现可靠的消息传输是一门必修课. 消息队列中间件的使用并不复杂,但消息队列的选型一直是个难点.比如: 不同业务场景下该如何选型 ...

  5. 如何使用消息队列解决分布式事物?

    作者:孤独烟 来自:打杂的ZRJ 引言 这篇说说分布式事务的问题.企业现在的架构都由传统的架构转向了微服务架构,如下图所示: 那么,都不可避免的会遇到跨数据库调用的,分布式事务问题! 目前,业内解决分 ...

  6. redis实现轮询算法_用redis实现支持优先级的消息队列

    为什么需要消息队列 系统中引入消息队列机制是对系统一个非常大的改善.例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中.你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样 ...

  7. rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...

    概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...

  8. 高并发架构系列:MQ消息队列的12点核心原理总结

    2019独角兽企业重金招聘Python工程师标准>>> 消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终 ...

  9. [Linux]消息队列

    我们知道进程间通信的方法有多种,主要有管道,消息队列,信号量,共享内存,socket等.之前介绍过管道,今天再介绍一个新的概念–消息队列. 消息队列:将一个进程到另一个进程之间发送数据块的方式.这些发 ...

最新文章

  1. Spring Cloud源码分析(二)Ribbon(续)
  2. 【JS第28期】继承-借用构造函数
  3. UOJ #579. 树上的颜色
  4. R语言与非参数检验之单样本位置检验
  5. 计算机教师专业发展规划,信息技术教师成长规划_信息技术教师专业成长浅谈...
  6. 02-普通轮播图-上下滚动
  7. ear的英语怎么念_Dog是“狗”,ear是“耳朵”,Dog ear真不是“狗耳朵”
  8. 神经网络填充(padding)
  9. Atitit 翻页功能的解决方案与版本历史 v4 r49
  10. 类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z...
  11. msdn系统镜像下载
  12. MySQL可视化管理工具之SQLyog的简介以及使用方法
  13. 普林斯顿微积分读本篇十五:积分方法
  14. openg和VS2010的环境配置
  15. SPSS在农业生产中的应用
  16. 2021 年公众号苏生不惑百篇原创文章整理
  17. C++11\14\17\20 新特性整理
  18. 基于SSM的婚纱影楼系统
  19. 猿创征文|云原生|kubernetes学习之多账户管理--权限精细化分配放啊(两种方式-sa和用户)
  20. 2021年软考考核方式

热门文章

  1. FCGF论文阅读笔记
  2. 从Ubuntu 14 04 LTS版升级到Ubuntu 16 04 LTS
  3. [git 基础] 生成patch 和 打patch 的实例
  4. 管壁式换热器cad图纸_民勤图纸管板加工加工
  5. php memcache 类库,php操作Memcache的一个类库的方法(代码)
  6. 创建一个守护进程来监听服务进程的异常状态_用 C# 来守护 Python 进程
  7. map分组后取前10个_java中list里面存放map,根据map中的某两个个字段进行排序
  8. apt ubuntu 指定ipv4_怎么在ubuntu安装python
  9. mysql error1045 yes_MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)问题的解决...
  10. oracle into bl,5_Oracle_Admin_Oracle的启动模式和关闭