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

posted on 2016-03-23 09:38  xj_aha  阅读(580)  评论(0编辑  收藏  举报

导航