缓存服务器-Memcached

介绍-Memcached

对于c的使用时间并不长,只是觉得有必要记录一下使用的心得。大致功能
- 1.缓存数据在缓存服务器中
- 2.以KEY/value的方式存储在缓存服务器中
- 3.可以设置缓存的值得有效时间
- 4.缓存数据不能持久化
- 5.缓存的数据可以保证多个并发访问操作同一份数据的一致性问题

部署Memcached

在Window系统下,Memcached的安装非常方便,只需从以上给出的地址下载可执行软件然后运行memcached.exe –d install即可完成安装。在Linux等系统下,我们首先需要安装libevent,然后从获取源码,make && make install即可。默认情况下,Memcached的服务器启动程序会安装到/usr/local/bin目录下。在启动Memcached时,我们可以为其配置不同的启动参数。
1)-p Memcached的TCP监听端口,缺省配置为11211;
2)-U Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;
3)-s Memcached监听的UNIX套接字路径;
4)-a 访问UNIX套接字的八进制掩码,缺省配置为0700;
5)-l 监听的服务器IP地址,默认为所有网卡;
6)-d 为Memcached服务器启动守护进程;
7)-r 最大core文件大小;
8)-u 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;
9)-m 分配给Memcached使用的内存数量,单位是MB;
10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;
11)-c 最大并发连数,缺省配置为1024;
12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;
13)-f 用于设置chunk大小的递增因子;
14)-n 最小的chunk大小,缺省配置为48个字节;
15)-t Memcached服务器使用的线程数,缺省配置为4个;
16)-L 尝试使用大内存页;
17)-R 每个事件的最大请求数,缺省配置为20个;
18)-C 禁用CAS,CAS模式会带来8个字节的冗余;

使用方法

(转载自-http://www.oschina.net/code/snippet_250396_9181)
package com.wzpmt;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class MemCachedManager {
    // 创建全局的唯一实例
    protected static MemCachedClient mcc = new MemCachedClient();

    protected static MemCachedManager memCached = new MemCachedManager();

    // 设置与缓存服务器的连接池
    static {
        // 服务器列表和其权重
        String[] servers = { "127.0.0.1:11211" };
        Integer[] weights = { 3 };

        // 获取socke连接池的实例对象
        SockIOPool pool = SockIOPool.getInstance();

        // 设置服务器信息
        pool.setServers( servers );
        pool.setWeights( weights );

        // 设置初始连接数、最小和最大连接数以及最大处理时间
        pool.setInitConn( 5 );
        pool.setMinConn( 5 );
        pool.setMaxConn( 250 );
        pool.setMaxIdle( 1000 * 60 * 60 * 6 );

        // 设置主线程的睡眠时间
        pool.setMaintSleep( 30 );

        // 设置TCP的参数,连接超时等
        pool.setNagle( false );
        pool.setSocketTO( 3000 );
        pool.setSocketConnectTO( 0 );

        // 初始化连接池
        pool.initialize();

        // 压缩设置,超过指定大小(单位为K)的数据都会被压缩
        mcc.setCompressEnable( true );
        mcc.setCompressThreshold( 64 * 1024 );
    }

    /** * 保护型构造方法,不允许实例化! * */
    protected MemCachedManager()
    {

    }

    /** * 获取唯一实例. * @return */
    public static MemCachedManager getInstance()
    {
        return memCached;
    }

    /** * 添加一个指定的值到缓存中. * @param key * @param value * @return */
    public boolean add(String key, Object value)
    {
        return mcc.add(key, value);
    }

    public boolean add(String key, Object value, Date expiry)
    {
        return mcc.add(key, value, expiry);
    }

    public boolean replace(String key, Object value)
    {
        return mcc.replace(key, value);
    }

    public boolean replace(String key, Object value, Date expiry)
    {
        return mcc.replace(key, value, expiry);
    }

    /** * 根据指定的关键字获取对象. * @param key * @return */
    public Object get(String key)
    {
        return mcc.get(key);
    }

    public static void main(String[] args)
    {
        MemCachedManager cache = MemCachedManager.getInstance();
        long startDate=System.currentTimeMillis();
        for (int i = 0; i < 10000*1000; i++) {
            cache.add("test"+i , "中国");
        }
        long endDate=System.currentTimeMillis();

        long nowDate=(endDate-startDate)/1000;
        System.out.println(nowDate);
        System.out.print( " get value : " + cache.get( "test" ));
    }
}

个人总结

使用memcached的好处,不必说,自然是它能有效的缓解数据库的压力。有效的解决数据库的问题。而且是分布式的。能够抗住更多的压力。
而且部署简单,使用方便。
不过就使用中的不便之处讲一下:
1.缓存集合类数据的时候不方便。如果一旦集合类中的数据有一条数据内容发生改变,我们就需要删除这一整个缓存。从新从数据库读取数据再次做缓存。分页缓存也是同样的道理。(所以一般在程序中,只针对单个对象的数据做缓存)。
2.缓存数据变化时,一定要实时的同步删除缓存。所以在代码中,一定要高度保存警惕,要做好记录那些做了缓存,然后找出这些对应的记录的 修改点 和 删除点,在对应的点 做好删除缓存的操作。如果忘记了,那么就糟糕了,用户看到的数据和 数据中的数据不一致,是不是很糟糕的事情。
3.无法持久化的问题,有一次大白天的,缓存服务器机器无缘由的宕机了。然后数据库连接数 瞬间就达到的警告线。重启了缓存服务器之后,也是如此,因为缓存服务器缓存的值是放在缓存中。所以机器重启之后,数据就都丢了,只能再次缓存。

你可能感兴趣的:(memcached,缓存服务器)