基于memcached的缓存机制

memcached是一套高性能的基于分布式的缓存系统,用于动态Web应用以减轻后台数据服务器的负载。

memcached可以处理并发的网络连接。它在内存中开辟一块空间,然后建立一个Hash表将缓存数据通过键/值存储在Hash表中进行管理。memcached由服务端和客户端两个核心组件组成,服务端先通过计算“键”的Hash值来确定键/值对在服务端所处的位置。当确定键/值对的位置后,客户端就会发送一个查询请求给对应的服务端,让它来查找并返回确切的数据。

在Nginx服务器的标准HTTP模块中有一个ngx_http_memcached_module模块,专门用于处理和memcached相关的配置和功能实现。

memcached_pass

memcached_pass指令用于配置memcached服务器的地址,其语法结构为:

memcached_pass address;

其中,address为memcached服务器的地址,支持IP+端口的地址或者是域名地址。也可以使用upstream指令配置一个memcached服务器组,然后将address配置为upstream的名称

memcached_connect_timeout

memcached_connect_timeout指令用于配置连接memcached服务器的超时时间,其语法结构为:

memcached_connect_timeout time;

其中,time为设置的超时时间,默认为60 s。建议该时间不要超过75s。

memcached_read_timeout

memcached_read_timeout指令配置Nginx服务器向memcached服务器发出两次read请求之间的等待超时时间,如果在该时间内没有进行数据传输,连接将会被关闭。该语法结构为:

memcached_read_timeout time;

其中,time为设置的超时时间,默认为60 s。

memcached_send_timeout

memcached_send_timeout指令配置Nginx服务器向memcached服务器发出两次write请求之间的等待超时时间,如果在该时间内没有进行数据传输,连接将会被关闭。该语法结构为:

memcached_send_timeout time;

其中,time为设置的超时时间,默认为60 s。

memcached_buffer_size

memcached_buffer_size指令用于配置Nginx服务器用于接收memcached服务器响应数据的缓存区大小,其语法结构为:

memcached_buffer_size size;

其中,size为设置的缓存区大小,一般是所在平台的内存页大小的倍数。默认设置为:

memcached_buffer_size 4k|8k;

memcached_next_upstream

memcached_next_upstream指令在配置了一组memcached服务器的情况下使用。服务器组中各memcached服务器的访问规则遵循upstream指令配置的轮询规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一个组内服务器处理。该指令的语法结构为:

memcached_next_upstream status …;

其中,status为设置的memcached服务器返回状态,可以是一个或者多个。这些状态包括:

  • error,在建立连接、向memcached服务器发送请求或者读取响应头时服务器发生连接错误。

  • timeout,在建立连接、向memcached服务器发送请求或者读取响应头时服务器发生连接超时。

  • invalid_header,memcached服务器返回的响应头为空或者无效。

  • not_found,memcached服务器未找到对应的键/值对。

  • off,无法将请求发送给memcached服务器。

在实际配置Nginx服务器使用memcached时,我们需要对Nginx配置的全局变量$memcached_key进行设置。

#其他配置
server {
    location  /  {
#其他配置
      set  $memcached_key "$uri?$args";
      memcached_pass  192.168.1.4:8080;
      error_page  404 502 504 = @fallback;
    }
    location @fallback {
      proxy_pass  http://backend;
    }
#其他配置
}

在该配置中,我们设置$memcached_key变量的值为"$uri?$args",Nginx服务器会根据该值调用Hash算法向memcached服务器发送查询请求如果在请求缓存数据的时候返回的状态代码为404、502或者504时,则将错误进行重定位,重定位后的请求被location @fallback {…}捕获并转向后台服务器请求实际数据。

Last updated