memcache学习引起的问题memcache安装完,java调用代码如下:
memcached for javapackage com.test.memcache;import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;/**
 * 本类用的是java_memcached-release-2.5.1.jar包
 *      下载地址: http://github.com/gwhalin/Memcached-Java-Client/downloads
 *
 * @author Administrator
 *
 */
public class MemcachedTest {
    String[] servers = { "127.0.0.1:11211" };    Integer[] weights = { 3 };
    MemCachedClient mcc = new MemCachedClient();
    // 创建一个实例对象SockIOPool
    SockIOPool pool = SockIOPool.getInstance();    public MemcachedTest() {
        pool.setServers(servers);
        pool.setWeights(weights);        pool.setInitConn(5);
        pool.setMinConn(5);
        pool.setMaxConn(250);
        pool.setMaxIdle(30);        pool.setMaintSleep(30);
        pool.initialize();
    }    public void putObject() {
        for (int i = 1; i < 10; i++) {
            Boolean b = mcc.add("key" + i, "hi, michael" + i); // 如果以前存在,则不去更新
            System.out.println("key" + i + b);
        }
    }    public void replaceObject() {
        Boolean b = mcc.replace("key2", "hi, tom"); // 如果key不存在,则返回flase,更新失败
        System.out.println("update " + b);
    }    public void getObject() {
        Object obj = mcc.get("key2");
        System.out.println(obj);
    }   
    public static void main(String args[]) {
        MemcachedTest tc = new MemcachedTest();
        // tc.putObject();
        // tc.replaceObject();
         tc.getObject();        tc.pool.shutDown();    }我当前生产环境是 linux +mysql +java +tomcat1  是否可以这样理解memcache的功能
memcache也是一个db(全部在内存),装完后我再java里需要吧mysql在线db的部分关键表写入到
这个memcache里面。之后如果数据更新,java 需要同时更新 memcache和 在线db。 如果程序查询
代码仅仅访问memcache2  如果在java代码里实现 把在线db的部分关键表写入到
这个memcache里面

解决方案 »

  1.   

    可以近似理解 
    但一遇到实际问题 发现困难重重 
    当前应用是相当复杂的 10左右的核心表之间 join  子查询实在太多 ,共有200个
    如果全部放到memcache从上面可以看出 memcache实际还是java类似的数据结构如list等,并不一一对应mysql的表
    mysql表的很多精华如主键 唯一索引等高级应用改造到memcache里还是有难度或者好麻烦的所以推   memcache并不是类似mysql的表(他没有类似主键 唯一索引等高级应用  这个当数据更新的时候必须要用到),而是类似java的list之类的数据结构 ??  (这个请确定)
     
      

  2.   

    Memcached里存放有许多巨大的hash表 。 他可以对应mysql的表 
    但是不知道mysql表的很多精华如主键 唯一索引等高级应用改造到memcache里
    java代码如何实现这个?
    参考
     Memcached能缓存什么?
           通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcached快么?
           非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。
           Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及Memcache失效时对数据库的访问速度。Memcached的特点
           Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生
      

  3.   

    memcache并不支持复杂的SQL查询,因此只是一种折中,可以看作是一种分布式的内存key-value超大哈希表。不过,马上有新的方案了,那就是mysql支持的memcache-engine形如:
       1. CREATE TABLE `a` (  
       2.     `a` int(11) NOT NULL DEFAULT '0',  
       3.     `b` int(11) DEFAULT NULL,  
       4.     `c` int(11) DEFAULT NULL,  
       5.     PRIMARY KEY (`a`)  
       6.     ) ENGINE=MEMCACHE DEFAULT CHARSET=latin1  
       7. CONNECTION='localhost:6666\;localhost:6688';  创建表a,存放在分布式memcached server:localhost:6666和localhost:6688当中。然后我们就可以使用标准的SQL语句随意的进行CRUD操作去使用 memcachedb了,这实在是太酷了!有了memcache_engine,我们就可以用SQL去访问memcached,有了 memcachedb,我们就不必担心数据丢失问题,事务恢复问题了,简直是绝配,让memcached真正成为了一个高性能的分布式数据库系统了。一旦该engine正式发布,估计很多人都幸福死了。
      

  4.   

    memcache_engine?/当前版本 发现mysql的 heap表并发性很差  很容易引起死锁memcache_engine是否有好的并发性问题我的当前应用环境复杂 有并发性要求