1、MemCached:一个高性能的分布式的内存对象缓存系统

作用

  • 用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来 减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

工作原理

  • 通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格 式的数据,包括图像、视频、文件以及数据库检索的结果等。简单来说   就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

工作流程

  • 检查客户端的请求数据是否在memcached中。如果存在,则直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);
  • 每次更新数据库的同时更新memcached中的数据,保证一致性;
  • 当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换最近未使用的数据。

 

2、CentOS下安装MemCached,分为服务端和客户端

2.1 服务端(这里使用yum方法)

安装:yum install memcached

启动:/usr/bin/memcached -d -l 127.0.0.1 -m 100 -u root

  • -d:守护进程,当从终端窗口退出的时候memcached还会继续运行
  • -l:指定ip地址,这里我们指定本地ip
  • -p:指定端口号,端口号为11211
  • -m:分配内存,这里我分配了100M内存
  • -u:使用哪个用户运行memcached

查看是否启动:ps -ef | grep memcached

  • ps命令是Precess Ststus的缩写,也就是列出当前系统中运行那些进程
  • ps -ef就是显示所有进程,连同命令行
  • ps通常与grep组合使用,查找特定进程

 

2.2客户端(使用lnmp安装的环境,所以用它自带的安装命令)

安装:./addons.sh install memcached

选择:php-memcache或者php-memcached扩展,据说win用memcache,linux用memcached,所以我用的是memcached

简单使用

创建:$memcached = new Memcached();

  • 传入一台或多台服务器
  • 一台
  • $memcached->addServer(‘127.0.0.1’,’11211’);
  • 多台
  • $servers = array(
  • array(‘127.0.0.1’,’11211’),
  • array(‘127.0.0.2’,’11211’)
  • );
  • $memcached->addServers($servers);

查看运行状态

  • print_r($memcached->getVersion());
  • 或者print_r($memcached->getStats());

添加或修改缓存数据

  • add(key,value,expire)
    1. key:加入缓存的key值
    2. value:加入缓存的value值
    3. expire:有效期,单位秒,0代表永久生效
    4. 注意:使用此方法重复赋值不会覆盖前值
  • replace(key,value,expire)。注意:此方法可以覆盖前值
  • set(key,value,expire)
    1. 当key值不存在时,相当于add方法;
    2. 当key值存在时,相当于replace方法;
    3. 常用此方法赋值

删除缓存数据

  • delete(key)。删除key值对应的缓存,用于清除单一缓存
  • flush()。直接清除掉所有的缓存,慎用。

获取缓存数据

  • get(key)。获取key对应的未失效的值

对缓存数据进行加减法

  • increment(key,num)。在key对应的缓存值value有效期内,每刷新一次页面,其值就加num
  • decrement(key,num)。同上

批量处理缓存数据

  • setMulti(array,expire)
    1. array:需要存入缓存的数组,例如:array(‘key1’=>’value1’,’key2’=>’value2’);
    2. expire:有效期,0代表永久
  • getMulti(array)。array:需要获取缓存的key值数组,例如:array(‘key1’,’key2’);
  • deleteMulti(array)。array:需要删除缓存的Key值数组,例如:array(‘key1’,’key2’);

查看操作执行情况

  • getResultCode()。可获取上一操作执行情况返回状态码
  • getResultMessage()。可获取上一操作执行情况返回具体信息

 

利用Memcached UDP反射放大DDoS攻击修复

  • 导致的后果:攻击者可利用该存在风险的Memcached服务器实施大规模的流量攻击,从而导致您的流量费用迅速上,以及对其他用户造成DDoS攻击。
  • 也建议您的Memcached服务使用 TCP 11211端口,禁用UDP 11211端口。
  • Memcached启动时,如无需使用UDP协议,建议添加“-U 0”参数可完全禁用UDP。

欢迎留言