zoukankan      html  css  js  c++  java
  • memcached总结

    目录

    • 作用
    • 应用场景
    • 工作流程
    • 集群实现方式
    • 特点和原理
    • 删除和cache机制
    • 安装部署

    一、memcached是什么,有什么作用?


        高性能的内存的缓存系统。
        通过在实现规划好的内存空间中临时缓存数据库中的各项数据,来达到减少直接对数据库的直接高并发访问,从而达到提升数据库的访问性能,加网站集群动态应用服务的能力。

        简单说就是通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度和扩展性。


    二、在企业集群架构中应用场景


        A:作为数据库的前端缓存应用  

      a/    完整缓存,静态缓存
            商品信息,事前放到内存里,然后在对外提供访问。预热。用户访问时只读取memched缓存,就不用读数据库。
        b/    热点缓存
            需前端web程序配合,只缓存热点数据,即缓存经常被访问的数据。
            先预热数据库里的基础数据,然后动态更新。所谓动态更新,程序先读取缓存,如果缓存里面没有对应数据,再去读取数据库,然后程序把读到的数据放入缓存。

            1、 电商秒杀,双十一等高并发业务。例如,小米秒杀只获取资格,而不是瞬间秒杀到手商品。只更改用户状态,节省服务器资源。
            2、如果数据更新,同时出发缓存更新,避免给客户过期数据。

        c/    对于持久化存储系统。比如redis,可以替代一部分数据库的存储,一些简单的数据业务,投票,统计,好友统计等

        B:session会话共享存储


    三、在不同企业业务场景中的工作流程



        a   当web程序需要访问后盾数据库获取数据时,会优先访问memcached内存缓存。如果缓存中有对应数据就直接放回给前端及用户;如果没有数据,也就是没有命中,再由程序请求数据库,获取到数据后除了返回给客户,还会把数据放入到memcaced中,以便下次请求被访问。memcached始终是数据库的挡箭牌,从而减轻数据库的压力,提高整个网站的相应速度。
        b   当程序更新、修改、杀出等操作时,会同时发送请求通知memcached已经缓存的数据失效,从而保证缓存的数据和数据库中的一致。
        如果是在高并发场合,除了通知过期缓存失效外,还会通过相关机制,使用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来。这样可以减少数据库的访问压力,提升命中率。


    四、服务分布式集群如何实现?


        memcached集群和普通集群的区别:所有memcached的数据综合才是数据库的综合。
        
        a  程序实现
        程序加载所有memcached的ip列表,通过对key做一致性哈希
        一致性hash,目的是不但保证每个对象只请求一个对应的服务器,而且当节点宕机缓存服务器的更新重新分配比例降到最低。
        b  负载均衡器/代理,如magnet

    1、安装 
    wget http://memagent.googlecode.com/files/magent-0.5.tar.gz  
    tar zxvf magent-0.5.tar.gz  
    /sbin/ldconfig  
    sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile  
    make  
    cp magent /usr/bin/magent  

    2、命令详解

      -h this message
      -u uid
      -g gid
      -p port, default is 11211. (0 to disable tcp support)
      -s ip:port, set memcached server ip and port
      -b ip:port, set backup memcached server ip and port
      -l ip, local bind ip address, default is 0.0.0.0
      -n number, set max connections, default is 4096
      -D do not go to background
      -k use ketama key allocation algorithm
      -f file, unix socket path to listen on. default is off
      -i number, max keep alive connections for one memcached server, default is 20
      -v verbose
    3、启动
    magent -u root -n 51200 -l 192.168.1.2 -p 12000 -s 192.168.1.4:11211 -s 192.168.1.5:11211   

    五、特点和原理

    •         完全基于内存,没有持久性存储的设计,一旦重启,数据丢失
    •         异步I/O模型, 使用libevent模型的事件通知机制
    •         节点之间相互独立
    •         被缓存的数据是以键值对形式存在的
    •         可以设定过期时间,过期后自动删除。是在访问的时候删除,根据时间戳判断
    •         内存分配机制是对特定的内存进行分块,再把多个块分为一组

    六、删除和cache机制

        cache机制是LRU(最近最少用)算法,加上item过期失效。如果内存不够用了,过期的会最先被替换,接着是lru算法算出来的。
        -m可以指定不被删除

    七、安装部署

    1、下载

    wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
    wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

    2、安装
    # tar zxvf libevent-*.tar.gz
    # cd libevent-2.0.21
    # ./configure –prefix=/usr/local/libevent
    # make
    # make install
    #测试是否安装成功
    # ls -al /usr/lib | grep libevent


    # tar zxvf memcached-1.4.15.tar.gz
    # cd memcached-1.4.15

    #这里安装的时候需要制定libevent的安装路径
    #   ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
    # make
    # make install

    #检查是否安装成功
    # ls -al /usr/local/bin/mem*

    3、启动

    /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid

     启动参数说明:
    -d 选项是启动一个守护进程。
    -u root 表示启动memcached的用户为root。
    -m 是分配给Memcache使用的内存数量,单位是MB,默认64MB。
    -M return error on memory exhausted (rather than removing items)。
    -u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。
    -p 是设置Memcache的TCP监听的端口,最好是1024以上的端口。
    -c 选项是最大运行的并发连接数,默认是1024。
    -P 是设置保存Memcache的pid文件。

    4、测试
    [root@localhost /]# telnet 192.168.141.64 12000
    Trying 192.168.141.64...
    Connected to 192.168.141.64 (192.168.141.64).
    Escape character is '^]'.
    set key1 0 60 4
    zhou
    STORED
    get key1
    VALUE key1 0 4
    zhou
    END

    备注:
    参数详细说明
    memcached 1.4.2  
    -p       监听的TCP端口(默认: 11211)  
    -U       监听的UDP端口(默认: 11211, 0表示不监听)  
    -s      用于监听的UNIX套接字路径(禁用网络支持)  
    -a      UNIX套接字访问掩码,八进制数字(默认:0700)  
    -l   监听的IP地址。(默认:INADDR_ANY,所有地址)  
    -d            作为守护进程来运行。  
    -r            最大核心文件限制。  
    -u  设定进程所属用户。(只有root用户可以使用这个参数)  
    -m       单个数据项的最大可用内存,以MB为单位。(默认:64MB)  
    -M            内存用光时报错。(不会删除数据)  
    -c       最大并发连接数。(默认:1024)  
    -k            锁定所有内存页。注意你可以锁定的内存上限。  
                  试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。  
                  (不是前面的 -u  参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)  
    -v            提示信息(在事件循环中打印错误/警告信息。)  
    -vv           详细信息(还打印客户端命令/响应)  
    -vvv          超详细信息(还打印内部状态的变化)  
    -h            打印这个帮助信息并退出。  
    -i            打印memcached和libevent的许可。  
    -P      保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。  
    -f    块大小增长因子。(默认:1.25)  
    -n     分配给key+value+flags的最小空间(默认:48)  
    -L            尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。  
                  为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。  
    -D      使用  作为前缀和ID的分隔符。  
                  这个用于按前缀获得状态报告。默认是":"(冒号)。  
                  如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。  
    -t       使用的线程数(默认:4)  
    -R            每个连接可处理的最大请求数。  
    -C            禁用CAS。  
    -b            设置后台日志队列的长度(默认:1024)  
    -B            绑定协议 - 可能值:ascii,binary,auto(默认)  
    -I            重写每个数据页尺寸。调整数据项最大尺寸。  

  • 相关阅读:
    重拾web开发JavaScript复习
    Linq GroupBy
    Gotchas 31对目标类型为指涉物为常量的指针类型的类型转换的认识误区
    感谢你遇到的问题
    IDisposable模式的一点理解
    感谢你遇到的问题(2)
    .Net通过OutLook发送邮件,附件的名称太长会显示乱码
    深度学习利器之自动微分(1)
    建议转载的发在文章(Aticles)而不是随笔(Posts)内
    Forum,ForumGroup和my forum的汉译
  • 原文地址:https://www.cnblogs.com/xiajie/p/5309718.html
Copyright © 2011-2022 走看看