• Memcache使用


    Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。这时就该memcached大显身手了。memcached一般的使用目的是,通过缓存数据库查询的结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。它是一个基于内存的"键值对"存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。

    其工作流程图为

    优点特征:

    协议简单:使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上            保存数据、取得数据。

     

    内置内存存储方式

    为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

    memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。 在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。

    Slab Allocator的基本原理是按照预先规定的大小, 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合)。各个尺寸的chunk大小是通过其增长因子(growth factor)来决定的,默认增长因子为1.25。下一个尺寸的chunk大小=之前一个chunk大小*增长因子。如下图所示:

    而且,slab allocator还有重复使用已分配的内存的目的。 也就是说,分配到的内存不会释放,而是重复利用。不过由于slab Allocator分配的是特定长度的chunk,因此,当缓存的数据没有chunk长度大时,仍然会造成空间浪费

     

    memcached尽管是"分布式"缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现

    Memcached的设计哲学

    Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:

    1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列    化数据即可。存储项由"键、过期时间、可选的标志及数据"四个部分组成;

    2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项    至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服    务端负责接收、存储数据,并负责数据项的超时过期;

    3. 各服务器间彼此无视:不在服务器间进行数据同步;

    4. O(1)的执行效率

    5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事    先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,    只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理    缓存,而仅是当get命令到达时检查其时长;

    使用telnet命令测试memcached的使用

    Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状等。

    查看memcached的内部状态信息

    首先是要telnet连接到memcached,然后再输入stats可以获取其memcached    各种信息:

     

    # telnet 127.0.0.1 11211

    stats

    STAT pid 143........

    使用add命令添加数据

    add命令语法格式:

    add keyname flag timeout datasize

    如:

    add mykey 0 10 12

    Hello world!

     

    使用get命令获取指定key所对应的数据

    get命令语法格式为:

    get keyname

    如:get mykey

    VALUE mykey 0 12

    Hello world!

    memcached的常用选项说明

    -l <ip_addr>:指定进程监听的地址;

    -d: 以服务模式运行;

    -u <username>:以指定的用户身份运行memcached进程;

    -m <num>:用于缓存数据的最大内存空间,单位为MB,默认为64MB;

    -c <num>:最大支持的并发连接数,默认为1024;

    -p <num>: 指定监听的TCP端口,默认为11211;

    -U <num>:指定监听的UDP端口,默认为11211,0表示关闭UDP端口;

    -t <threads>:用于处理入站请求的最大线程数,仅在memcached编译时开启了支    持线程才有效;

    -f <num>:设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因    子;

    -M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;

    -n: 指定最小的slab chunk大小;单位是字节;

    分布式Memcache缓存集群调度算法

    1. 取模计算hash,简单但是添加、移除mc服务器时,缓存会重新组合,影响命中率
    2. 一致性hash:主机的可分布在0-2^32任意一个节点,key值经过hash来确定要访问数据的区域。这种方式能够很好解决增加或删除mc节点带来缓存重组的问题

    memcache的数据操作

    格式<command name> <key> <flags> <exptime> <bytes>

    参数

    <command name>    操作命令:set/add/replace

    <key>            缓存的键值

    <flags>            客户机使用它存储关于键值对的额外信息

    <exptime>        缓存过期时间 单位为秒 0 表示永远存储

    <bytes>            缓存值的字节数

    get 命令 获取一个键或多个键的值 多个键以空格分开

    添加add、set

    替换replace,数据必须存在

    删除命令 delete

    stats 显示memcachd状态

    flush_all 清空所有项目            #数据并没有真正删除

    append后续追加、prepend前面插入命令

    python操作memcached

     

    在python中使用memcache,需要先安装memcached的python client,这里列出了很多,你可以选择一个来安装。yum install python-memcached.noarch -y
    import memcache
    mc = memcache.Client(['192.168.0.1:11211'], debug=0)
    写入缓存:
    mc.set("key", "value")
    第三个参数默认为0,也就是数据永不超时。
    如果这样设置:mc.set("key", "value", 1) 表示一秒后超时
    读取缓存
    value = mc.get("key")
    print value
    删除缓存
    mc.delete("key")
    自增和自减
    mc.set("key", "1")
    mc.incr("key")
    mc.decr("key")
    状态:
    mc.get_stats()

    memcache监控

    使用memcache.php、memadmin

    也可使用脚本来监控,一方面stat状态echo stats | nc 127.0.0.1 11211,另一方面进程保证alive。

    pid

    memcache服务器的进程ID

    uptime

    服务器已经运行的秒数

    time

    服务器当前的unix时间戳

    version

    memcache版本

    pointer_size

    当前OS的指针大小(32位系统一般是32bit)

    rusage_user

    进程的累计用户时间

    rusage_system

    进程的累计系统时间

    curr_items

    服务器当前存储的items数量

    total_items

    从服务器启动以后存储的items总数量

    bytes

    当前服务器存储items占用的字节数

    curr_connections

    当前打开着的连接数

    total_connections

    从服务器启动以后曾经打开过的连接数

    connection_structures

    服务器分配的连接构造数

    cmd_get

    get命令(获取)总请求次数

    cmd_set

    set命令(保存)总请求次数

    get_hits

    总命中次数

    get_misses

    总未命中次数

    evictions

    为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items),分配内存不足

    bytes_read

    总读取字节数(请求字节数)

    bytes_written

    总发送字节数(结果字节数)

    limit_maxbytes

    分配给memcache的内存大小(字节)

    threads

    当前线程数

    使用mc注意的一些问题

    考虑当多个MC服务器宕机,数据未命中增多,从而导致的穿透的问题,在这种情况下,可以临时考虑封掉一些请求,防止后端进一步恶化。另外后期可以把缓存的数据写两份

    注意剔除数evictions,高的话,可能内存不足 ;

  • 相关阅读:
    Vue 项目启动抛出 Error/ No PostCSS Config found in
    js sort排序
    layui table合计但是未计算的解决
    vue项目echarts画布删除历史数据重新渲染数据
    layui 数据返回但是table表格未渲染出来的问题
    Spring Boot实践——AOP实现
    IntelliJ IDEA—IDEA2018.1激活方式
    Spring Boot实践——统一异常处理
    Spring Boot实践——Filter实现
    Spring Boot实践——三种拦截器的创建
  • 原文地址:https://www.cnblogs.com/wxl-dede/p/5136679.html
Copyright © 2020-2023  润新知