您的位置:首页 > 数据库 > Memcache

Nginx Lua 开发 - Memcached 操作

2019-03-29 11:03 881 查看
版权声明:@潘广宇博客, https://blog.csdn.net/panguangyuu/article/details/88878463

在 Nginx 中访问 Memcached 有两种方式:mem-nginx-module 与 lua-resty-memcached。Openresty 可直接使用这两种方式进行访问。

一、mem-nginx-module

1)简单例子

[code]# mem-nginx-module 使用
location /memnginxmodule {
set $memc_cmd $arg_cmd;
set $memc_key $arg_key;                      # key
# set $memc_value $arg_value;                # value
set $memc_flags $arg_flags;                  # flag , 默认为 0
set $memc_exptime $arg_exptime;              # 过期时间,默认为 0

memc_pass 127.0.0.1:11211;
}

location /memnginxmodule_status {
set $memc_cmd stats;                         # 查看 Memcached stats 信息
memc_pass 127.0.0.1:11211;
}

# $memc_cmd 默认使用根据HTTP请求方法确定操作类型
# GET 请求 , get 操作
# POST 请求 , add 操作
# PUT 请求 , set 操作
# DELETE 请求 , delete 操作

2)标记 Last-Modified

当设置 Last-Modified (最后修改时间)头域,当文件达到一定缓存过期时间,如果请求导的服务器文件没有改变则返回304,此时浏览器就访问本地缓存。

[code]location /mem_modi {
default_type text/html;
set $memc_key $arg_key;
memc_pass 127.0.0.1:11211;
memc_flags_to_last_modified on;                # 设置 flag 为时间戳,并作为Last-Modified的值
}

3)访问 Unix 域套接字服务

[code]# unix socket
location /unixdemo {
set $memc_key $arg_key;
set $memc_cmd get;
memc_pass unix:/tmp/memcached.sock;
}

4)命令

get操作:如果获取成功,返回 200ok,否则返回 404,其他错误将返回 502 (Error / Client Error / Server Error)

set操作:如果设置成功,返回 201ok,否则返回 404,其他错误将返回 502

5)推荐使用连接池

使用 mem-nginx-module 时,推荐使用 HttpUpstreamKeepaliveModule 实现后端 memcached 服务器连接缓存,使用连接池会显著提高访问速度

[code]## 如:

http {
upstream mem_backend {
server 127.0.0.1:11211;
...
}

server {
location /mem_test {
memc_pass mem_backend;
}
}
}

二、lua-resty-memcached

1)基本使用

[code]location /restymem {
content_by_lua '
-- 引入memcached
local memcached = require "resty.memcached"
local mem, err = memcached:new()

if not mem then
ngx.say("fail to instantiate ", err)
return
end

-- 设置超时时间
mem:set_timeout(1000)

-- 连接memcached
local ok, err = mem:connect("127.0.0.1", 11211)
if not ok then
ngx.say("fail to connect ", err)
return
end

-- 清除缓存中的kv、get/set KEY等操作
local ok, err = mem:flush_all()
local ok, err = mem:set("dog", 32)
local res, flags, err = mem:get("dog")

-- 关闭
local ok, err = mem:close()
';
}

2)注意事项:

a、使用本库不能用在 init_by_lua 、set_by_lua 、log_by_lua 、header_filter_by_lua 上下文中

b、resty.mysql 不能存放在模块级的变量中(其他例程会分享),只能存放在局部变量或ngx.ctxtable中

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: