• Memcached 介绍及部署


    Memcached 简介

    MC介绍

    memcached 是一个自由开源,高性能,分布式内存对象存储系统
    基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)
    它是一个简洁的key-value存储系统f

    分为服务端和客户端两部分
    1.服务端:memcached
    2.客户端:memcache

    使用目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

    MC特性

    1. C/S模式架构:由C语言编写,总共2000多行代码。
      协议简单:使用的是基于文本行的协议,能通过telnet/nc直接操作Memcached服务存取数据。
    1. 支持epoll/kqueue异步I/O模型:使用libevent作为事件处理通知机制。
    2. Key/value键值对数据类型
    3. 纯内存缓存,效率高
    4. 支持分布式集群
    5. 多进程

    MC企业应用场景

    1.完整缓存(容易)

    例如:京东的商品分类,就可以事先放在Memcached里,然后在对外提供数据访问,这个被称之为“数据预热”

    2.热点缓存(难)

    热点缓存一般是用于由用户更新的商品,例如淘宝的卖家,当卖家新增商品后,淘宝网的程序就会把商品写入数据库,然后读取写入的数据,把这部分数据,放入 Memcached中,下一次访问这个商品的请求直接从Memcached中取走了。

    3.作为集群节点的session会话共享存储

    MC数据存储机制

    需要被缓存的数据以key/value键值对的形式保存在服务器端预分配的内存区中,每个被缓存的数据都有唯一的标识key,操作Memcached中的数据就是通过这个唯一标识的key进行的。

    MC内存管理机制

    Memcached采用了如下机制:
    1.采用slab内存分配机制
    2.采用LRU对象清除机制
    3.采用hash机制快速检索item

    memcached是利用Slab Allocation机制来分配和管理内存的,提前将大内存分配大小为1MB若干个slab,然后针对每个slab再进行小对象填充,这个小对象称为chunk,避免大量重复的初始化和清理,减轻了内存管理器的负担。

    Slab Allocation内存分配的原理是按照预先规定的大小,将分配给Memcached服务的内存预先分割成特定长度的内存块(chunk),再把尺寸相同的内存块(chunk)分成组(chunks slab class),这些内存块不会释放,可以重复利用,

    小结:

    1. Mc的早期内存管理机制为malloc(动态内存分配)
    1. malloc(动态内存分配)产生内存碎片,导致操作系统性能急剧下降。
    2. lab内存分配机制可以解决内存碎片的问题
    3. Memcached服务的内存预先分割成特定长度的内存块,称为chunk,用于缓存数据的内存空间或内存块,相当于磁盘的block,只不过磁盘的每一个block都是相等的,而chunk只有在同一个Slab Class内才是相等的。
    4. Slab Class指特定大小(1MB)的包含多个chunk的集合或组,一个Memcached包含多个Slab Class,每个Slab Class包含多个相同大小的chunk。
    5. Slab机制也有缺点,例如,Chunk的空间会有浪费(通过调优因子以及大小接近的数据放入一个MC实例)

    MC过期机制

    1. 不主动检测item对象是否过期,而是在get时才会检查item对象是否过期以及是否应该删除。
    1. 当删除item对象时,一般不释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候可以直接使用。
    2. 当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除。
    3. 数据存入可以设定过期时间,但是数据过期后不会被立即删除,而是在get时检查item对象是否过期以及是否应该删除。
    4. 如果不希望系统使用LRU算法清除数据,可以用使用-M参数。

    Memcached 部署

    MC安装

    1.系统环境

    [root@cache01 ~]# cat /etc/redhat-release
    CentOS Linux release 7.4.1708 (Core)
    [root@cache01 ~]# uname -r
    3.10.0-693.el7.x86_64
    

    2.安装MC
    Memcached的安装比较简单,支持Memcached的平台常见的有Linux,FreeBSD,Solaris,Windows。

    //1.安装libevent及连接Memcached工具nc
    cd /server/tools/
    yum -y install libevent libevent-devel
    
    
    //2.编译的方式安装
    wget http://www.memcached.org/files/memcached-1.5.12.tar.gz
    tar xf memcached-1.5.12.tar.gz
    cd memcached-1.5.12/
    ./configure
    make
    make install
    cd ../
    

    提示:yum安装的memcached版本略低,但是不影响使用,如果想要安装更高版本的则需要编译安装
    yum install memcached -y

    MC服务基本管理

    1.启动Memcached

    //1.命令行方式启动Memcached
    [root@cache01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 #启动第一个mc实例
    
    //2.检查启动结果
    [root@cache01 ~]# ps -ef | grep memcached | grep -v grep
    root       2071      1  0 13:52 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192
    

    2.启动多实例memcached

    //启动多一个11212端口的MC实例
    [root@cache01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192
    [root@cache01 ~]# ps -ef | grep memcached | grep -v grep
    root       2071      1  0 13:52 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192
    root       2086      1  0 13:53 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192
    

    3.加入开机自启动

    //把上述两个实例的启动命令放入/etc/rc.local,以便下次开机可以自启动。
    [root@cache01 ~]# tail -2 /etc/rc.local
    memcached -m 16m -p 11211 -d -u root -c 8192
    memcached -m 16m -p 11212 -d -u root -c 8192
    

    MC启动命令参数

    #进程与连接设置:
    -d	以守护进程(daemon)方式运行服务
    -u	指定运行Memcached的用户,如果当前用户为root,需要使用此参数指定用户
    -l	指定Memcached进程监听的服务器IP地址,可以不设置此参数
    -p(小写)指定Memcached服务监听TCP端口号。默认为11211
    -P(大写)设置保存Memcached的pid文件($$),保存PID到指定文件
    
    #内存相关设置:
    -m	指定Memcached服务可以缓存数据的最大内存,默认为64MB
    -M	Memcached服务内存不够时禁止LRU,如果内存满了会报错
    -n	为key+value——flags分配的最小内存空间,默认为48字节
    -f	chunk size增长因子,默认为1.25
    -L	启用大内存页,可以降低内存浪费,改进性能
    
    #并发连接设置:
    -c	最大的并发连接数,默认是1024
    -t	线程数,默认4.由于Memcached采用的是NIO,所以太多线程作用不大
    -R	每个event最大请求数,默认是20
    -C	禁用CAS(可以禁止版本计数,减少开销)
    
    #测试参数:
    -v		打印较少的errors/warnings
    -vv	打印非常多调试信息和错误输出到控制台
    -vvv	打印极多的调试信息和错误输出,也打印内部状态转变
    
    #其他选项可通过在命令行输入“memcached -h”命令来显示。
    

    MC基本操作

    向Memcached中添加数据时,注意添加的数据一般为键值对的形式,例如:key1-->values1,key2-->values2

    1.安装工具
    mc数据插入可以使用交互式的方式,工具有nc和telnet

    yum instasll nc  telnet -y
    

    2.通过printf配合nc向Memcached中写入数据

    //向memcached写入数据
    [root@cache01 ~]# printf "set key1 0 0 6
    jason
    " | nc 127.0.0.1 11211
    STORED      #出现STORED表示成功添加key1及对应的数据
    [root@cache01 ~]# printf "replace  key1 0 0 7
    xmh
    " | nc 127.0.0.1 11211 
    STORED  #replace 更新数据
    
    //如果set命令的字节是6,那么后面就要6个字符(字节)。否则插入数据就会不成功
    [root@cache01 ~]# printf "set key1 0 0 4
    benet
    " | nc 127.0.0.1 11211
    CLIENT_ERROR bad data chunk
    ERROR
    
    //通过printf配置nc从Memcached中读取数据
    [root@cache01 ~]# printf "get key1
    " | nc 127.0.0.1 11211
    VALUE key1 0 5
    benet       #这就是读取到的key1对应额值
    
    //通过printf配合nc从Memcached中删除数据
    [root@cache01 ~]# printf "delete key1
    " | nc 127.0.0.1 11211
    DELETED
    [root@cache01 ~]# printf "get key1
    " | nc 127.0.0.1 11211
    END
    

    3.通过telnet命令写入数据时

    [root@cache01 ~]# telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set user01 0 0 7  #写入数据,创建key,长度等
    jason12 #数据长度要和value一致
    STORED
    get user01    #浏览数据
    VALUE user01 0 7
    jason12
    END
    delete user01  #删除数据,删除的是key
    DELETED
    get user01   #再次浏览数据,数据被删除       
    END
    quit       #quit退出
    Connection closed by foreign host.
    

    Memcached命令解释

    1. set 设置数据
    2. get 获取数据
    3. delete 删除数据
    4. replace 更新数据

    操作MC相关命令的语法
    以下为操作Memcached的相关命令基本语法:

                 set                 key1         0            0              6                
              benet        
    
    <command name><key><flags><exptime><bytes><datablock><string><datablock>
    
    command     # 命令参数(set、get、delete、replace)
    key                 # key 用于查找缓存值,要求小于250字符,不包含空格和控制字段
    flags              #  用户端用来表示数据格式数值,如json、xml、压缩等
    exptime        # 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
    bytes            # 在缓存中存储的字节数
    datablock    # 文本行,以
    结尾
    string           # 键值对应的缓存内容
    

    4.关闭MC
    单实例关闭Memcached:

    killall memcached或pkill memcached
    

    当启动了多个实例Memcached,使用killall或pkill方式就会同时关闭这些实例!因此最好在启动时增加-P参数指定固定的pid文件,这样便于管理不同的实例。

    //启动多实例MC指定PID文件
    [root@cache01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid
    [root@cache01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid
    [root@cache01 ~]# ps -ef | grep memcached | grep -v grep
    root       1486      1  0 11:14 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid
    root       1493      1  0 11:14 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid
    
    //此时,即可通过kill命令指定pid文件,来关闭Memcached
    [root@cache01 ~]# kill `cat /var/run/11211.pid`
    
  • 相关阅读:
    Accoridion折叠面板
    mui列表系列
    按照中文首字母排序查询表数据
    五分位算法
    springmvc添加拦截器
    springmvc添加定时任务
    通过后台解决跨域调用接口问题
    eclipse搭建ssm框架
    Java 将图片转成base64,传到前台展示
    用mysql存储过程代替递归查询
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12359813.html
Copyright © 2020-2023  润新知