Memcached实施心得

         说到Memcached,大家都不会陌生,前阵子在项目中搭建了一套集群环境,上线运行至今,通过memcache-top监控调优,各指标表现相对平稳,优异,加上之前在负责交易平台时积累的Memcached实施经验,便整理写下了此文,如果有不准确的,欢迎拍砖~

  • memcached是怎么工作的?
  • memcached内存管理的机制是?
  • memcached最大的优势是什么?
  • memcached和MySQL的query cache相比,有什么优缺点?
  • memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?
  • memcached的cache机制是怎样的?
  • memcached如何实现冗余机制?
  • memcached如何处理容错的? 
  • memcached中item怎么批量导入导出?
  • 但是我确实需要把memcached中的item都dump出来,确实需要把数据load到memcached中,怎么办?
  • memcached是如何做身份验证的?
  • 如何使用memcached的多线程是什么?如何使用它们?
  • memcached能接受的key的最大长度是多少?(250bytes)
  • memcached对item的过期时间有什么限制?(为什么有30天的限制?)
  • memcached最大能存储多大的单个item?(1M byte)
  • 为什么单个item的大小被限制在1M byte之内?
  • 什么是binary协议?它值得关注吗?
  • memcached是如何分配内存的?为什么不用malloc/free!?究竟为什么使用slab呢?
  • memcached能保证数据存储的原子性吗?
  • memcached如何处理大量并发访问并存在cache过期的情况?
  • memcached client中要关闭Nagle算法吗?

  memcached是怎么工作的?

  Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多<key,value>对的哈希表。通过key,可以存储或查询任意的数据。

  客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。

  举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C:
  Client 1想把数据"bar"以key "foo"存储。Client 1首先参考节点列表(A, B, C),计算key "foo"的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key "foo"把数据"bar"存储进去。  Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。
  于是,经过相同的哈希计算(阶段一),Client 2计算出key "foo"在memcached B上,然后它直接请求memcached B,得到数据"bar"。

    从实现的角度看,memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。可以参考A
Story of Caching
 ,这篇文章简单解释了客户端与memcached是如何交互的。

memcached内存管理的机制是

  Memcached内存管理采取预分配、分组管理的方式(规避内存碎片)。分组管理就是按照chunk的大小分类slab。下面解释一下memcached的内存预分配过程。

                                  

  

 

  向memcached添加一个item时候,memcached首先会根据item的大小,来选择最合适的slab class:例如item的大小为190字节,class 3的chunk大小为176字节显然不合适,class 4的chunk大小为224字节,大于190字节,因此该item将放在class
4中(显然这里34字节的浪费是不可避免的),计算好所要放入的chunk之后,memcached会去检查该类大小的chunk还有没有空闲的,如果没有,将会申请1M(1个slab)的空间并划分为该种类chunk。例如我们第一次向memcached中放入一个190字节的item时,memcached会产生一个slab class 4(也叫一个page),并会用去一个chunk,剩余4680个chunk供下次有适合大小item时使用,当我们用完这所有的4681个chunk之后,下次再有一个在160~200字节之间的item添加进来时,memcached会再次产生一个class
4的slab(这样就存在了2个pages)。

  Slab是一个内存块,它是memcached一次申请内存的最小单位。在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab。Slab的大小固定为1M(1048576 Byte),一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体、一对key和value。如代码所示:

/**
    * Structure for storing items within memcached.
   */
typedef struct _stritem {
    struct _stritem *next;
    struct _stritem *prev;
    struct _stritem *h_next;    /* hash chain next */
    rel_time_t      time;       /* least recent access */
    rel_time_t      exptime;    /* expire time */
    int             nbytes;     /* size of data */
    unsigned short  refcount;
    uint8_t         nsuffix;    /* length of flags-and-length string */
    uint8_t         it_flags;   /* ITEM_* above */
    uint8_t         slabs_clsid;/* which slab class we're in */
    uint8_t         nkey;       /* key length, w/terminating null and padding */
    /* this odd type prevents type-punning issues when we do
     * the little shuffle to save space when not using CAS. */
    union {
        uint64_t cas;
        char end;
    } data[];
    /* if it_flags & ITEM_CAS we have 8 bytes CAS */
    /* then null-terminated key */
    /* then " flags length\r\n" (no terminating null) */
    /* then data with terminating \r\n (no terminating null; it's binary!) */
} item;  

  虽然在同一个slab中chunk的大小相等的,但是在不同的slab中chunk的大小并不一定相等,在memcached中按照chunk的大小不同,可以把slab分为很多种类(class)。在启动memcached的时候可以通过-vv来查看slab的种类:

 从上图可以看到,memcached把slab分为38类(class1~class38),在class 1中,chunk的大小为104字节,由于一个slab的大小是固定的1048576字节(1M),因此在class1中最多可以有10082个chunk:

       10082×104 + 48 = 1048576

 在class1中,剩余的48字节因为不够一个chunk的大小,因此会被浪费掉。

 生产环境呢中我们可以调优的参数的参数有-f(slab分配增量因子,默认围1.25)、-n(chunk最小分配数,默认48字节),在memcached的实际运行中,我们还需要观察我们的数据特征,合理的调节f,n的值,使我们的内存得到充分的利用减少浪费。

memcached最大的优势是什么?

  Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。

  基于memcached的基本原则,可以相当轻松地构建出不同类型的缓存架构。

memcached和MySQL的query cache相比,有什么优缺点?

  把memcached引入应用中,还是需要不少工作量的。MySQL有个使用方便的query cache,可以自动地缓存SQL查询的结果,被缓存的SQL查询可以被反复地快速执行。Memcached与之相比,怎么样呢?MySQL的query cache是集中式的,连接到该query
cache的MySQL服务器都会受益。

  • 当您修改表时,MySQL的query cache会立刻被刷新(flush)。存储一个memcached item只需要很少的时间,但是当写操作很频繁时,MySQL的query cache会经常让所有缓存数据都失效。
  • 在多核CPU上,MySQL的query cache会遇到扩展问题(scalability issues)。在多核CPU上,query cache会增加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢。
  • 在MySQL的query cache中,我们是不能存储任意的数据的(只能是SQL查询结果)。而利用memcached,我们可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到memcached中。而query cache是SQL语句级别的,不可能做到这一点。在小的网站中,query
    cache会有所帮助,但随着网站规模的增加,query cache的弊将大于利。
  • query cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了memcached,只要您有空闲的内存,都可以用来增加memcached集群的规模,然后您就可以缓存更多的数据。

memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?

  首先,local cache有许多与上面(query cache)相同的问题。local cache能够利用的内存容量受到(单台)服务器空闲内存空间的限制。不过,local cache有一点比memcached和query cache都要好,那就是它不但可以存储任意的数据,而且没有网络存取的延迟。

  • local cache的数据查询更快。考虑把highly common的数据放在local cache中吧。如果每个页面都需要加载一些数量较少的数据,考虑把它们放在local cached吧。
  • local cache缺少集体失效(group invalidation)的特性。在memcached集群中,删除或更新一个key会让所有的观察者觉察到。但是在local cache中, 我们只能通知所有的服务器刷新cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。
  • local cache面临着严重的内存限制,这一点上面已经提到。

memcached的cache机制是怎样的?

  Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久Which is forever, or some time in the future。如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。

memcached如何实现冗余机制? 
  不实现!我们对这个问题感到很惊讶。Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个memcached节点失去了所有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于memcached来保证一切!如果您担心节点失效会大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少丢失一个节点的影响),热备节点(在其他节点down了的时候接管IP),等等。目前,业界有一些现成的解决方案,如: pecl-memcache,repcached,memagent等等。

memcached如何处理容错的?

  不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:

  • 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。
  • 把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上。
  • 启动热备节点,接管失效节点所占用的IP。这样可以防止哈希紊乱(hashing chaos)。
  • 如果希望添加和移除节点,而不影响原先的哈希结果,可以使用一致性哈希算法(consistent hashing)。您可以百度一下一致性哈希算法。支持一致性哈希的客户端已经很成熟,而且被广泛使用。去尝试一下吧!
  • 两次哈希(reshing)。当客户端存取数据时,如果发现一个节点down了,就再做一次哈希(哈希算法与前一次不同),重新选择另一个节点(需要注意的时,客户端并没有把down的节点从节点列表中移除,下次还是有可能先哈希到它)。如果某个节点时好时坏,两次哈希的方法就有风险了,好的节点和坏的节点上都可能存在脏数据(stale
    data)。

memcached中item怎么批量导入导出?

  您不应该这样做!Memcached是一个非阻塞的服务器。任何可能导致memcached暂停或瞬时拒绝服务的操作都应该值得深思熟虑。向memcached中批量导入数据往往不是您真正想要的!想象看,如果缓存数据在导出导入之间发生了变化,您就需要处理脏数据了;如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?

  因此,批量导出导入数据并不像您想象中的那么有用。不过在一个场景倒是很有用。如果您有大量的从不变化的数据,并且希望缓存很快热(warm)起来,批量导入缓存数据是很有帮助的。虽然这个场景并不典型,但却经常发生,因此我们会考虑在将来实现批量导出导入的功能。

  Steven Grimm,一如既往地,,在邮件列表中给出了另一个很好的例子:http://lists.danga.com/pipermail/memcached/2007-July/004802.html 。

但是我确实需要把memcached中的item批量导出导入,怎么办??

  好吧好吧。如果您需要批量导出导入,最可能的原因一般是重新生成缓存数据需要消耗很长的时间,或者数据库坏了让您饱受痛苦。

  如果一个memcached节点down了让您很痛苦,那么您还会陷入其他很多麻烦。您的系统太脆弱了。您需要做一些优化工作。比如处理"惊群"问题(比如 memcached节点都失效了,反复的查询让您的数据库不堪重负...这个问题在FAQ的其他提到过),或者优化不好的查询。记住,Memcached
并不是您逃避优化查询的借口。

  如果您的麻烦仅仅是重新生成缓存数据需要消耗很长时间(15秒到超过5分钟),您可以考虑重新使用数据库。这里给出一些提示:

  • 使用MogileFS(或者CouchDB等类似的软件)在存储item。把item计算出来并dump到磁盘上。MogileFS可以很方便地覆写item,并提供快速地访问。您甚至可以把MogileFS中的item缓存在memcached中,这样可以加快读取速度。 MogileFS+Memcached的组合可以加快缓存不命中时的响应速度,提高网站的可用性。
  • 重新使用MySQL。MySQL的InnoDB主键查询的速度非常快。如果大部分缓存数据都可以放到VARCHAR字段中,那么主键查询的性能将更好。从memcached中按key查询几乎等价于MySQL的主键查询:将key 哈希到64-bit的整数,然后将数据存储到MySQL中。您可以把原始(不做哈希)的key存储都普通的字段中,然后建立二级索引来加快查询...key被动地失效,批量删除失效的key,等等。

  上面的方法都可以引入memcached,在重启memcached的时候仍然提供很好的性能。由于您不需要当心"hot"的item被memcached LRU算法突然淘汰,用户再也不用花几分钟来等待重新生成缓存数据(当缓存数据突然从内存中消失时),因此上面的方法可以全面提高性能。

  关于这些方法的细节,详见博客:http://dormando.livejournal.com/495593.html 。

memcached是如何做身份验证的? 
  没有身份认证机制!memcached是运行在应用下层的软件(身份验证应该是应用上层的职责)。memcached的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,memcached可以很快地创建新连接,服务器端也无需任何配置。

  如果您希望限制访问,您可以使用防火墙,或者让memcached监听unix domain socket。

memcached的多线程是什么?如何使用它们? 

  线程就是定律(threads rule)!在Steven Grimm和Facebook的努力下,memcached 1.2及更高版本拥有了多线程模式。多线程模式允许memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据。memcached使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个memcached实例,这种方式能够更有效地处理multi
gets。

  如果您的系统负载并不重,也许您不需要启用多线程工作模式。如果您在运行一个拥有大规模硬件的、庞大的网站,您将会看到多线程的好处。

  更多信息请参见:http://code.sixapart.com/svn/memcached/trunk/server/doc/threads.txt

  简单地总结一下:命令解析(memcached在这里花了大部分时间)可以运行在多线程模式下。memcached内部对数据的操作是基于很多全局锁的(因此这部分工作不是多线程的)。未来对多线程模式的改进,将移除大量的全局锁,提高memcached在负载极高的场景下的性能。

memcached能接受的key的最大长度是多少? 

  key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持"key的前缀"或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key,因为可以节省内存和带宽。工程上,我们经常这么干:

  /**
     * @param cacheDomain
     * @param valueId
     * @param version
     * @see http://en.wikipedia.org/wiki/SHA-2
     * @return
     */
    public static String getKey(CacheDomain cacheDomain, String valueId, int version) {
        String key = cacheDomain.getValue() + SPLIT + valueId + SPLIT + version;
        final byte[] bytes = key.getBytes();
        if (bytes.length > 250) {
            key = DigestUtils.sha256Hex(key);
        }
        return key;
    }

memcached对item的过期时间有什么限制? 

  过期时间最大可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。

memcached最大能存储多大的单个item? 
  1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。

为什么单个item的大小被限制在1M byte之内? 

  啊...这是一个大家经常问的问题!

  简单的回答:因为内存分配器的算法就是这样的。

  详细的回答:Memcached的内存存储引擎(引擎将来可插拔...),使用slabs来管理内存。内存被分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。

  如果最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B ...

  slab中chunk越大,它和前面的slab之间的间隙就越大。因此,最大值越大,内存利用率越低。Memcached必须为每个slab预先分配内存,因此如果设置了较小的因子和较大的最大值,会需要更多的内存。

  还有其他原因使得您不要这样向memcached中存取很大的数据...不要尝试把巨大的网页放到mencached中。把这样大的数据结构load和unpack到内存中需要花费很长的时间,从而导致您的网站性能反而不好。

  如果您确实需要存储大于1MB的数据,你可以修改slabs.c:POWER_BLOCK的值,然后重新编译memcached;或者使用低效的malloc/free。其他的建议包括数据库、MogileFS等。

什么是二进制协议,我该关注吗?

  关于二进制最好的信息当然是二进制协议规范:http://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol 。

  二进制协议尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的CPU时间。
根据Facebook的测试,解析ASCII协议是memcached中消耗CPU时间最多的环节。所以,我们为什么不改进ASCII协议呢?

  在这个邮件列表的thread中可以找到一些旧的信息:http://lists.danga.com/pipermail/memcached/2007-July/004636.html 。

memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs? 

  实际上,这是一个编译时选项。默认会使用内部的slab分配器。您确实确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。如果您不同意,当然可以使用malloc!只是不要在邮件列表中抱怨啊:)

  slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。Steven Grimm正在这方面已经做出了有效的改进。

  邮件列表中有一些关于slab的改进(power of n 还是 power of 2)和权衡方案:http://lists.danga.com/pipermail/memcached/2006-May/002163.htmlhttp://lists.danga.com/pipermail/memcached/2007-March/003753.html 。

  如果您想使用malloc/free,看看它们工作地怎么样,您可以在构建过程中定义USE_SYSTEM_MALLOC。这个特性没有经过很好的测试,所以太不可能得到开发者的支持。

  更多信息:http://code.sixapart.com/svn/memcached/trunk/server/doc/memory_management.txt 。

memcached是原子的吗? 
  当然!好吧,让我们来明确一下:
  所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有bug:)
  命令序列不是原子的。如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他进程set的item。

  memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。

  通常,基于memcached中item的值来修改item,是一件棘手的事情。除非您很清楚自己在做什么,否则请不要做这样的事情。

memcached如何处理大量并发访问并存在cache过期的情况? 

       在大并发的场合,当cache失效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。这时我们可以采取类似于网络上面的拥塞控制算法思路(CSMA/CD),简单一点,就是在load db之前先add一个mutex
key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下:

if (memcache.get(key) == null) {
    // 1 min timeout to avoid mutex holder crash
    if (memcache.add(key_mutex, 1 * 60 * 1000) == true) {
        value = db.get(key);
        memcache.set(key, value);
        memcache.delete(key_mutex);
    } else {
        sleep(50);
        retry();
    }
}

       有sleep的地方就应该得到大家的注意,一旦这点sleep时间堵塞住了所有客户端,那就得另想良策了,别急,是时候Gearman登场了,当需要更新Cache的时候,我们不再直接查询数据库,而是把任务抛给Gearman来处理,当并发量比较大的时候,Gearman内部的优化可以保证相同的请求只查询一次后端数据库。

memcached client中要关闭Nagle算法吗?

      等等,什么是Nagle算法?

      TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能地利用网络带宽,TCP总是希望尽可能地发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
      Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段 。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
        Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释): 
      (1)如果包长度达到MSS,则允许发送;
      (2)如果该包含有FIN,则允许发送;
      (3)设置了TCP_NODELAY选项,则允许发送;
      (4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送; 
      (5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

       那么,了解了原理,就可以根据你缓存的数据大小进行合理判断了(MSS的定义见:http://en.wikipedia.org/wiki/Maximum_segment_size),不过目前主流的client如Xmemcached,spymemcached默认都禁掉了该算法。

时间: 2024-09-19 04:51:05

Memcached实施心得的相关文章

分布式缓存系统Memcached学习心得

分布式缓存系统Memcached学习心得 Posted on 2009-01-14 11:34 linFen 阅读(3458) 评论(1) 编辑 收藏 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法. Memcached是什么? Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.  Memcached能缓存什么?    

家庭网络布线实施心得

了解家庭网络布线还是非常有用的, 于是我研究了一下家庭网络布线时的原则与注意事项,在这里拿出来和大家分享一下,希望 对大家有用.不少用户在家通过自建代理服务器.集线器.交换机.路由器等设备组网冲浪.多数家庭计算机网络所需的终端和网络设备并不多,加之网络结构简单,可能忽略了计算机网络布线. 对使用无线网络的Fans来说,暂可不用考虑网络布线. 但是,出于对经济性.兼容性和传输速度多方面因素的考虑,有线网络还算是比较灵活.安全的.下面我来讲讲家庭网络布线的经验. 家庭网络布线时的原则 1.综合布线

浅谈公司核心业务数据表的重构——结合Memcache分析缓存策略与系统数据交互

 接着上一篇的预告,本文将结合本人近来的一些思考,谈谈对于企业核心业务数据的重构,配合Memcached构思对现有架构上的一些改造.本文观点纯属一家之言,可能受制于眼界之窄,业务之浅,欢迎各位共同探讨,也欢迎拍砖! Background 公司从事GPRS车载终端产品的研发.作为配合,软件这块主要开发车辆管理信息系统,以提供对装有终端车辆的全面服务. 说到这里,我想大家应该明白,这里最核心的就是--车辆.大部分的功能几乎都是围绕着车辆在展开.给购买车机终端的厂家,提供对车辆的有效管理和控制,是系统

由工信部信息化推进司指导

会议的首日政府领导以及信息化专家以"转型之道 融合之路"为主题,对中国制造业的两化深度融合之路进行了阐述和分析.工信部信息化推进司徐愈司长对大会进行了开幕致辞, 进一步强调了推进工业化与信息化深度融合的重要性,并指出了两化深度融合的重点方向. 华中科技大学校长李培根院士针对2013-2014中国制造业与信息化十大热点就行了剖析,他详细解读了包括深化改革为民营企业迎来发展新契机:推进信息消费,驱动中国经济增长:装备制造业突破高端,打造大国重器等2013-2014年中国制造业十大热点以及包

功夫在诗外 优质原创是这样炼成的

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 无论基于用户体验还是更多的考虑到搜索引擎优化,原创内容所起到的作用都至关重要.互联网本身也是建立在内容之上的,所有取胜互联网营销,能写会写善于原创不可或缺.如果说网站建设及优化存在核心竞争力概念的话,那么内容原创就极具竞争力,就是核心竞争力.这些观点笔者在文章<网站建设与优化的核心竞争力就是原创>中已有明确阐述.透过搜索引擎所表现

明星回归话剧舞台明星版话剧引发产业升级

<开心麻花>舞台上,明星何炅.谢娜.林依轮.周晓鸥.瞿颖轮番逗你玩儿:<陪我看电视>延续了赖声川的明星号召力,林依轮.张静初.张信哲.史可--连程前也"甘伏"于一台串场的电视机.在影视明星回归话剧舞台的热浪背后,又隐伏着什么样的商机呢? 梅婷邀约"桃花"史可加盟话剧 据上海话剧艺术中心版<我爱桃花>导演何念介绍,是梅婷自己主动要出演这部戏.从个人角度,梅婷跟何念都是南京人,也是好朋友,看了剧本之后梅婷特别兴奋,主动请缨,还跟邹静之

Hadoop不是万能的 要明确场景扬长避短

叶琪表示,Hadoop不是万能的,不能解决所有http://www.aliyun.com/zixun/aggregation/14294.html">的大数据需求,自身还有安全.实时性.SQL能力等诸多缺陷,一定明确需求和使用场景,用其长弃其短.在培训中他会分享Haodop系统的规划设计.建设.运维在电信行业的实施. -什么原因吸引你钻研Hadoop技术? 在Hadoop的世界里能遇到各种系统最底层最复杂的技术问题,这是最吸引我长期钻研的最大动力.我的职业生涯经历过几个不同类型的产品,但大

第三届中国信息化与工业化融合发展高峰论坛在北京成功召开

2014年3月13日-14日,由工信部信息化推进司指导,e-works主办的"2014(第三届)中国信息化与工业化融合发展高峰论坛"在北京成功召开.本次论坛邀请了工信部领导.制造业专家和经济学家.知名制造企业CEO.CIO.主流咨询服务机构的咨询专家,共同讨论新时代下我国工业企业如何从宏观经济政策.产业转型.创新管理和两化融合等方面实现深化改革与创新的发展之路,实现产业化.服务化和信息化发展的策略和方法,绘制我国现代工业转型发展的宏伟蓝图. 会议的首日政府领导以及信息化专家以"

2014中国工业与信息化融合发展论坛在京举行

摘要: 2014年3月13日-14日,由工信部信息化推进司指导,e-works主办的2014(第三届)中国信息化与工业化融合发展高峰论坛在北京成功召开.本次论坛邀请了工信部领导.制造业专家和经济学家. 2014年3月13日-14日,由工信部信息化推进司指导,e-works主办的"2014(第三届)中国信息化与工业化融合发展高峰论坛"在北京成功召开.本次论坛邀请了工信部领导.制造业专家和经济学家.知名制造企业CEO.CIO.主流咨询服务机构的咨询专家,共同讨论新时代下我国工业企业如何从宏