java 基于 MemCache 的队列实现

本文介绍了一种基于Memcache的队列实现方式,通过自定义类`MemCacheQueue`实现了基本的队列操作如添加(push)、获取(poll)及预览(peek)等,并详细展示了如何使用Memcached客户端进行数据的存取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用Memcache 的时候,想有一个类似于队列的功能。
import java.util.Collection;

import com.danga.MemCached.MemCachedClient;

/**
 * 基于MemCache的一个队列实现
 * @author v_tianyongjun
 *
 */
public class MemCacheQueue<T>{
	
	private static final String KEY_SIZE = "_size";
	
	private static final String KEY_OFFSET = "_offset";
	
	private static final String KEY = "_key";
	
	private static final String LOCK = "_lock";
	
	private MemCachedClient mcc ;
	
	private String name ;
	
	public MemCacheQueue(String name , MemCachedClient mcc) {
		this.mcc = mcc ;
		this.name = name ;
		mcc.set( name + KEY_SIZE , 0);
		mcc.set( name + KEY_OFFSET , 0);
	}
	
	/**
	 * 向队列里添加一个元素
	 * @param t
	 */
	public void push(T t){
		lock();
		int size = getSize();
		mcc.set( name + KEY + "_" + size, t);
		mcc.set( name + KEY_SIZE , size + 1 );
		unlock();
	}
	
	public void pushAll(Collection<T> ts){
		lock();
		int _size = ts.size() ;
		int size = getSize();
		int c = 0 ;
		for( T t : ts){
			mcc.set( name + KEY + "_" + (size + c++), t);
		}
		mcc.set( name + KEY_SIZE , size + _size );
		unlock();
	}
	/**
	 * 读取队头
	 * @return
	 */
	public T peek(){
		int offset = getOffset();
		@SuppressWarnings("unchecked")
		T t = (T) mcc.get( name + KEY + "_" + offset );
		return t ;
	}
	
	/**
	 * 读取并删除队头
	 * @return
	 */
	public T poll(){
		lock();
		T t = peek();
		int offset = getOffset();
		mcc.delete( name + KEY + "_" + offset );
		mcc.set( name + KEY_OFFSET , offset + 1 );
		unlock();
		return t;
	}
	
	public void clear(){
		lock();
		int size = getSize();
		int offset = getOffset();
		for( int i = 0 ; i < size ; i++){
			mcc.delete(name + KEY + "_" + ( offset + i ) );
		}
		mcc.delete( name + KEY_SIZE );
		mcc.delete( name + KEY_OFFSET );
		unlock();
	}
	
	/**
	 * @return
	 */
	public int getSize() {
		Integer size = (Integer) mcc.get(name+KEY_SIZE);
		if( size == null ){
			size = 0 ;
		}
		return size;
	}
	
	private int getOffset(){
		Integer off = (Integer) mcc.get(name+KEY_OFFSET);
		if( off == null ){
			off = 0 ;
		}
		return off;
	}
	
	private void lock(){
		while(true){
			Long lock = mcc.addOrDecr(name+LOCK,1);
			if( lock == 1 ) {
				return;
			}
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {}
		}
	}
	
	private void unlock(){
		mcc.delete(name+LOCK);
	}

}

  1.Memcached是什么?   Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcached由Danga Interactive最初为了加速 LiveJournal网站访问速度而开发的,后 来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可 以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库,分布式计算等领域。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。   2.Memcached工作机制   通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。   现在一些.NET开发人员开始放弃ASP.NET内置的缓存机制,转而使用Memcached——一种分布式的内存缓存系统。当运行在单独的Web服务器上,你可以很容易地清除一个已经确认被改变了的缓存。可惜,ASP.NET没有一个很好的方法来支持多服务器。每个服务器上的缓存都对其他缓存的改变一无所知。   ASP.NET允许通过基于文件系统和数据库表的触发器来作废一个缓存。然而,这也存在问题,比如数据库触发器需要使用昂贵的轮询,以及触发器本身冗长的编程。但是,我们还是有其他的选择的。   不像ASP.NET内置的缓存机制,Memcached是一个分布式的缓存系统。任何Web服务器都能更新或删除一个缓存项,并且所有其他的服务器都能在下次访问这些缓存项的时候自动获取到更新的内容。这是通过把这些缓存项存储在一个或者多个缓存服务器上来实现的。每一个缓存项都根据它的关键字的哈希值来分配到一个服务器上。 注:相关组词来源于百度文库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值