php教程 php手册 memcache构建简单的内存消息队列

memcache构建简单的内存消息队列

May 25, 2016 pm 04:40 PM

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);
    }
    /** 
     * 出队
     *    很简单, 把开始值取出后开始指针后移
     * //开源代码phprm.com
     * @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算法得到的存储数据的节点就会变化,去新的服务器上去存取数据.                                        


本文链接:

收藏随意^^请保留教程地址.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)