> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/devops/ngnix/ji-chu-zhi-shi/4.-nginx-fu-wu-qi-de-dai-li-fu-wu/4.7-nginx-fu-wu-qi-de-huan-cun-ji-zhi/ji-yu-memcached-de-huan-cun-ji-zhi.md).

# 基于memcached的缓存机制

{% hint style="info" %} <mark style="color:blue;">**memcached**</mark>是一套高性能的基于分布式的缓存系统，用于动态Web应用以减轻后台数据服务器的负载。

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

在Nginx服务器的<mark style="color:blue;">**标准HTTP模块**</mark>中有一个<mark style="color:blue;">**ngx\_http\_memcached\_module**</mark>模块，专门用于处理和memcached相关的配置和功能实现。

## **memcached\_pass**

<mark style="color:blue;">**memcached\_pass**</mark>指令用于<mark style="color:blue;">**配置memcached服务器的地址**</mark>，其语法结构为：

```nginx
memcached_pass address;
```

其中，<mark style="color:blue;">**address**</mark>为memcached服务器的地址，支持IP+端口的地址或者是域名地址。也**可以使用upstream指令配置一个memcached服务器组，然后将address配置为upstream的名称**。

## memcached\_connect\_timeout

<mark style="color:blue;">**memcached\_connect\_timeout**</mark>指令用于<mark style="color:blue;">**配置连接memcached服务器的超时时间**</mark>，其语法结构为：

```nginx
memcached_connect_timeout time;
```

其中，<mark style="color:blue;">**time**</mark>为设置的超时时间，**默认为60 s**。建议该时间不要超过75s。

## memcached\_read\_timeout

<mark style="color:blue;">**memcached\_read\_timeout**</mark>指令<mark style="color:blue;">**配置Nginx服务器向memcached服务器发出两次read请求之间的等待超时时间，如果在该时间内没有进行数据传输，连接将会被关闭**</mark>。该语法结构为：

```nginx
memcached_read_timeout time;
```

其中，<mark style="color:blue;">**time**</mark>为设置的超时时间，**默认为60 s。**

## memcached\_send\_timeout

<mark style="color:blue;">**memcached\_send\_timeout**</mark>指令<mark style="color:blue;">**配置Nginx服务器向memcached服务器发出两次write请求之间的等待超时时间，如果在该时间内没有进行数据传输，连接将会被关闭**</mark>。该语法结构为：

```nginx
memcached_send_timeout time;
```

其中，<mark style="color:blue;">**time**</mark>为设置的超时时间，**默认为60 s。**

## memcached\_buffer\_size

<mark style="color:blue;">**memcached\_buffer\_size**</mark>指令用于<mark style="color:blue;">**配置Nginx服务器用于接收memcached服务器响应数据的缓存区大小**</mark>，其语法结构为：

```nginx
memcached_buffer_size size;
```

其中，<mark style="color:blue;">**size**</mark>为设置的缓存区大小，一般是所在平台的内存页大小的倍数。默认设置为：

```nginx
memcached_buffer_size 4k|8k;
```

## memcached\_next\_upstream

<mark style="color:blue;">**memcached\_next\_upstream**</mark>指令**在配置了一组memcached服务器的情况下使用**。服务器组中各memcached服务器的访问规则遵循upstream指令配置的轮询规则，同时可以<mark style="color:blue;">**使用该指令配置在发生哪些异常情况时，将请求顺次交由下一个组内服务器处理**</mark>。该指令的语法结构为：

```nginx
memcached_next_upstream status …;
```

其中，<mark style="color:blue;">**status**</mark>为设置的memcached服务器返回状态，可以是一个或者多个。这些状态包括：

* **error**，在建立连接、向memcached服务器发送请求或者读取响应头时服务器发生连接错误。
* **timeout**，在建立连接、向memcached服务器发送请求或者读取响应头时服务器发生连接超时。
* **invalid\_header**，memcached服务器返回的响应头为空或者无效。
* **not\_found**，memcached服务器未找到对应的键/值对。
* **off**，无法将请求发送给memcached服务器。

{% hint style="warning" %} <mark style="color:orange;">**在实际配置Nginx服务器使用memcached时，我们需要对Nginx配置的全局变量$memcached\_key进行设置。**</mark>

```nginx
… #其他配置
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;
    }
    …                        #其他配置
}
```

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