memcache java

首先记录一下用到的主要代码

 protected static MemCachedClient mcc = new MemCachedClient();
     	static{
	       // 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。这里应该设置为多个不同的服务,我这里将两个服务设置为一样的,大家不要向我学习,呵呵。
	        String[] servers =
	                {
	                        "115.28.190.73:11211",
	                        "115.28.190.73:11211",
	                };
	        // 设置服务器权重	
	        Integer[] weights = {3, 2};
	        // 创建一个Socked连接池实例
	        SockIOPool pool = SockIOPool.getInstance();
	        // 向连接池设置服务器和权重
	        pool.setServers(servers);
	        pool.setWeights(weights);
	        // set some TCP settings
	        // disable nagle
	        // set the read timeout to 3 secs
	        // and don't set a connect timeout
	        pool.setNagle(false);
	        pool.setSocketTO(3000);
	        pool.setSocketConnectTO(0);
	        // initialize the connection pool
	        pool.initialize();
	    }
记录一些memcache讲的比较好 的文章


        memcached

client  web app+memcache client

DB


操作流程如下


1检查客户端的请求数据是否在memcached中,如果有直接返回,不在对数据库操作

2如果检查的数据不在memcached中,就去DB中查找数据,返回给memcached一份 客户端一份

3每次更新数据时同时更新memcached和DB

4当分配给memcached的内存用完时,使用lru算法 最近最少使用策略加上到期失效策略,失效数据会首先替换然后最近最少使用的数据


特征:

所有的有效数据都存储在内存中,存取比硬盘快,当内存满后,通过lru算法,自动删除不使用的缓存,但是没有考虑容灾问题,重启机器后,所有数据会丢失

 

memcached服务器不互相通信,各自独立存取数据,不共享资源。

Memcached的内存算法:
    Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。
    传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。
memcache java_第1张图片

Memcached的缓存策略:
    Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。

Memcached的分布式算法:
    当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。
memcache java_第2张图片

分布式算法(Consistent Hashing):

    选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
余数算法:
    先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
散列算法:
    先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。
memcache java_第3张图片

Memcache的管理与性能监控
可以通过命令行直接管理与监控也可通过nagios,cacti等web软件进行监控
命令行:

 
  
  1. Shell>telnet 127.0.0.1 1211 //如果在启动时指定了IP及端口号,这里要作相应改动
    连接成功后命令 
  2. Stats:统计memcached的各种信息 
  3. Stats reset:重新统计数据 
  4. Stats slabs,显示slabs信息,可以详细看到数据的分段存储情况 
  5. Stats items:显示slab中的item数目 
  6. Stats cachedump 1 0:列出slabs第一段里存的KEY值 
  7. Set|get:保存或获取数据 
  8. STAT evictions 0:表示要腾出新空间给新的item而移动的合法item数目 

其它常用软件使用:

 
  
  1. Shell>./Memcached-tool 127.0.0.1:11211 
  2. Shell>./Memcached-tool 127.0.0.1:11211 display 

Web软件:

 
  
  1. Memcache.php 
  2. Nagios插件 
  3. Cacti模块 



Memcached与redis比较:
memcache java_第4张图片










你可能感兴趣的:(memcache,memcache)