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            重写每个数据页尺寸。调整数据项最大尺寸。  

  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/xiajie/p/5309718.html
Copyright © 2011-2022 走看看