源地址:http://kb.cnblogs.com/page/42731/

仔细学习了下,以下是记录的笔记备忘内容。

一、memcached是什么?
    memcached是高性能的分布式内存缓存服务器。
    一般使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度、提高可扩展性

memcached的特征:
        1. 协议简单
        2. 基于libevent的事件处理
        3. 内置内存存储方式
        4. memcached不互相通信的分布式

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

基于libevent的事件处理
            libevent是一个程序库,它将linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。
            memcached使用这个libevent库,因此在linux、BSD等操作系统上发挥高性能。

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

memcached不互相通信的分布式
            各个memcahced不会互相通信已共享信息,如何进行分布式,是由客户端来实现的

memcached安装
        在安装memcahced之前,首先要安装libevent库

            # tar xf libevent-2.0.-stable.tar.gz
# cd libevent-2.0.
# ./configure --prefix=/usr/local/libevent
# make && make install # echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf
# ldconfig # tar xf memcached-1.4..tar.gz
# cd memcached-1.4.
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
# make && make install

memcached 编译安装时,启动脚本:

#!/bin/bash
#
# Init file for memcached
#
# chkconfig: -
# description: Distributed memory caching daemon
#
# processname: memcached
# config: /etc/sysconfig/memcached . /etc/rc.d/init.d/functions ## Default variables
PORT=""
USER="memcached"
MAXCONN=""
CACHESIZE=""
OPTIONS="" RETVAL=
prog="/usr/local/memcached/bin/memcached"
desc="Distributed memory caching"
lockfile="/var/lock/subsys/memcached" start() {
echo -n $"Starting $desc (memcached): "
daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS
RETVAL=$?
[ $RETVAL -eq ] && success && touch $lockfile || failure
echo
return $RETVAL
} stop() {
echo -n $"Shutting down $desc (memcached): "
killproc $prog
RETVAL=$?
[ $RETVAL -eq ] && success && rm -f $lockfile || failure
echo
return $RETVAL
} restart() {
stop
start
} reload() {
echo -n $"Reloading $desc ($prog): "
killproc $prog -HUP
RETVAL=$?
[ $RETVAL -eq ] && success || failure
echo
return $RETVAL
} case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e $lockfile ] && restart
RETVAL=$?
;;
reload)
reload
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=
esac exit $RETVAL
            主配置文件:/etc/sysconfig/memcached
PORT="" # memcached端口
USER="memcached" # 启动用户
MAXCONN="" # 最大连接数
CACHESIZE="" # 内存缓存空间大小,单位:M
OPTIONS="" # 其他选项
memcached客户端连接
telnet ip:port 保存数据

向memcached保存数据的方法有:
            add、replace、set
            my $add = $memcached->add( '键', '值', '期限' );
            my $replace = $memcached->replace( '键', '值', '期限' );
            my $set = $memcached->set( '键', '值', '期限' );            
        向memcached保存数据时可以指定期限(秒)。不指定期限memcached按照LRU算法保存数据。上面三个方法的区别:
            add:         仅当存储空间中不存在键相同的数据时才保存
            replace:     仅当存储空间中存在键相同的数据时才保存
            set:        与add和replace不同,无论何时都保存

获取数据

获取数据使用get 和 get_multi 方法
        一次获取多条数据时使用get_multi,可以非同步的同时取得多个键值,速度要比循环调用get快数十倍
            my $val = $memcached->get('键');
            my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');

删除数据

删除数据使用delete方法

$memcached->delete('键', '阻塞时间(秒)');

删除第一个参数指定键的数据,第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。此功能可以用于防止缓存数据的不完整。注意:set函数忽视该阻塞,照常保存数据增一和减一操作

二、memcahced的内存存储机制

slab Allocation机制:整理内存以便重复使用
        slab allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定的块,以完全解决内存碎片问题。
        slab Allocation 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)
        slab allocator 能重复使用已分配的内存目的。也就是说,分配到的内存不会释放,而且重复利用。

slab Allocation的主要术语
        Page: 内存分配给slab的内存空间,默认是1MB,分配给slab之后根据slab的大小切分成chunk,一个page为4kb
        Chunk:用于缓存记录的内存空间
        slab class:特定大小chunk的组

在slab中缓存数据的原理:
        memcached根据收到数据的大小,选择最适合数据大小的slab,memcached中保存着slab内空闲的chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

slab Allocator的缺点:
        slab allocator 分配的是特定长度的内存因此无法有效利用分配的内存。例如:将100字节的数据缓存到128字节上,剩余的28字节就浪费掉了。

使用Growth Factor进行调优

memcached在启动时指定Growth Factor因子(选项-f),就可以在某种程度上控制slab之间的差异,默认是1.25

设置命令:memcached -f 2 -vv

查看memcahced的内部状态

# telnet 127.0.0.1 11211
    stats

查看slabs的使用状况
    # memcached-tool 127.0.0.1
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      96B        30s       1       1      no        0        0    0

各项含义:
          #             slab class编号
          Item_Size     chunk大小
          Max_age        LRU内最旧的记录的生存时间
          Pages        分配给Slab的页数
          Count        slab内的记录数
          Full?        Slab内是否含有空闲chunk

这部分不是特别完全,后期补充,这个脚本对调优非常方便。

三、memcached的删除机制

memcached在数据删除方面有效利用资源,数据不会真正从memcached中消失

lazy Expiration
        memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被成为lazy(惰性) expiration,因此memcached不会在过期监视上耗费cpu时间

LRU: 从缓存中有效删除数据的原理
        当memcached的内存空间不足时,就从最近未使用的记录中搜索,并将其空间分配给新的记录。新的记录覆盖掉使用最少的chunk
        # memcached -M 禁止LRU,一般情况下是非常推荐使用LRU

四、memcached的分布式算法

memcached的分布式
        memcached的分布式是由客户端程序库来实现的,这种分布式是memcached最大的特点。

set方法:
            首先向memcached中添加'tokyo' 将'tokyo'传给客户端程序库后,客户端实现的算法就会根据'键'来决定保存数据的memcached服务器。

get方法:
            获取时也要将要获取的键“tokyo”传递给函数库。 函数库通过与数据保存时相同的算法,根据“键”选择服务器。 使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。 只要数据没有因为某些原因被删除,就能获得保存的值。

Cache::Memcached的分布式方法
        hash-type主要有两种方法:
            1. 取模法:这种算法不适用于memcached分布式,当一台memcached服务器故障,将会造成所有memcached缓存失效。
            2. 一致性hash算法:首先求出memcached服务器的哈希值,并将其配置到1-2^32的圆上,然后用同样的方法求出存储数据的键的哈希值,并映射到圆上,然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。

【 学习笔记 】memcached基础知识的更多相关文章

  1. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  2. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  3. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  4. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  5. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  6. .net学习笔记---xml基础知识

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  7. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...

  8. Scala学习笔记--正则表达式基础知识、如何在scala内使用

    正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...

  9. (C/C++学习笔记) 一. 基础知识

    一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...

  10. C#学习笔记(基础知识回顾)之枚举

    一:枚举的含义 枚举是用户定义的整数类型.在声明一个枚举时,要指定该枚举的示例可以包含的一组可接受的值.还可以给值指定易于记忆的名称.个人理解就是为一组整数值赋予意义. 二:枚举的优势 2.1:枚举可 ...

随机推荐

  1. [转载] python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  2. 软件工程项目组Z.XML会议记录 2013/11/20

    软件工程项目组Z.XML会议记录 [例会时间]2013年11月20日星期三21:00-22:00 [例会形式]小组讨论 [例会地点]学生公寓3号楼会客厅 [例会主持]李孟 [会议记录]李孟 会议整体流 ...

  3. 使用ZSetOperations(有序)操作redis

    方法 c参数 s说明 Boolean add(K key, V value, double score); K key:集合key V value:key对应的值 double score:分数  向 ...

  4. 详细解析@Resource和@Autowired的区别 , 以及@Qualifier的作用

    (41)  (0) 首先 . @Resource是javax.annotation 包中的注解类 , 是jdk中封装的 . @AutoWired是spring的中注解,依赖于spring上下文. 相同 ...

  5. TCP的挥手协议和握手协议2

    三次握手协议:三次握手协议的主要过程是交互彼此之间的初始序列号,如果没有确认的ACK帧可以么?肯定是可以的 client A -------> server B client A 发送了自己的初 ...

  6. ASP.NET页面之间传值Session(2)

    想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽. 优点:1.使用简单,不仅能传递简单数据类型,还能传递对象. 2 ...

  7. 有用的Java注解

    好处: 能够读懂别人的代码,特别是框架相关的代码: 让编程更加简洁,代码更加清晰. 使用自定义注解解决问题!! Java1.5版本引入. Java中的常见注解 @Override:告诉使用者及编译器, ...

  8. [UOJ #52]【UR #4】元旦激光炮

    题目大意:交互题,给你三个有序数组,长度分别为$n\_a,n\_b,n\_c$,都不超过$10^5$.三个函数$get\_a(i),get\_b(i),get\_c(i)$,分别返回$a_i,b_i, ...

  9. [洛谷P3946] ことりのおやつ(小鸟的点心)

    题目大意:最短路,第$i$个点原有积雪$h_i$,极限雪高$l_i$(即雪超过极限雪高就不可以行走),每秒降雪$q$,ことり速度为$1m/s$,若时间大于$g$,则输出$wtnap wa kotori ...

  10. 周记【距gdoi:91天】

    这星期挺没状态的.听蔡大神讲组合游戏,然后欢乐得以为自己懂了,然后看到题目就懵了,然后就各种乱各种走神……但是某大神们(kpm和child)疯狂地切题.然后又颓废了两个晚上后决定滚回去文化课(oi没状 ...