memcached

作者: just_me1989 | 来源:发表于2017-03-31 09:22 被阅读0次

    1下载:https://commaster.net/content/installing-memcached-windows

    2安装:解压开文件  里面有memcached.exe

    3打开控制面板,打开服务,可以看到memcached已经在上面可,如果没有启动,则手动启动一下。

    4 Memcached的工作原理

    4.1Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。

    4.2Memcached有两个核心组件组成:服务端(ms)和客户端(mc),在一个memcached的查询中,mc先通过计算key的hash值来 确定kv对所处在的ms位置。当ms确定后,客户端就会发送一个查询请求给对应的ms,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以 memcached交互带给网络的影响是最小化的。

    举例说明:考虑以下这个场景,有三个client分别是c1,c2,c3,还有三个ms分别是s1,s2,s3:

    设置kv对

    c1想设置key=”com”,value=”iQiyi”

    c1拿到server列表,并对key做hash转化,根据hash值确定kv对所存的server位置

    s2被选中了

    c1连接上s2,s2收到请求,把(key=”com”,value=”iQiyi”)存了起来

    获取kv对

    c3想得到key=”com”的value

    c3用相同的hash算法算出hash值,并确定key=”aa”的值存在s2上

    c3连接上s2,并从s2那边得到value=”iQiyi”

    其他任何从c1,c2,c3的想得到key=”com”的值的请求都会发向s2

    5内存分配

    默认情况下,ms是用一个内置的叫“块分配器”的组件来分配内存的。舍弃c++标准的malloc/free的内存分配,而采用块分配器的主要目的 是为了避免内存碎片,否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的)。用了块分配器,ms会轮流的对内存进行大块的分配,并 不断重用。当然由于块的大小各不相同,当数据大小和块大小不太相符的情况下,还是有可能导致内存的浪费。

    同时,ms对key和data都有相应的限制,key的长度不能超过250字节,data也不能超过块大小的限制 --- 1MB。

    因为 mc所使用的hash算法,并不会考虑到每个ms的内存大小。理论上mc会分配概率上等量的kv对给每个ms,这样如果每个ms的内存都不太一样,那可能 会导致内存使用率的降低。所以一种替代的解决方案是,根据每个ms的内存大小,找出他们的最大公约数,然后在每个ms上开n个容量=最大公约数的 instance,这样就等于拥有了多个容量大小一样的子ms,从而提供整体的内存使用率。

    6缓存策略

    当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用),以及每个kv对的有效时限。Kv对存储有效时限是在mc端由app设置并作为参数传给ms的。

    同时ms采用是偷懒替代法,ms不会开额外的进程来实时监测过时的kv对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。

    相关文章

      网友评论

          本文标题:memcached

          本文链接:https://www.haomeiwen.com/subject/nymrottx.html