Lua实现Redis操作
要在Lua里面实现Redis集群操作,需要第三方库的支持lua-resty-redis-cluster。
我们需要安装lua-resty-redis-cluster,下载地址:github.com/cuiweixie/l…,下载该文件配置后即可实现Redis集群操作。
# 安装环境
yum install -y lua-devel
# 上传资料中的lua-resty-redis-cluster-master.zip到服务器的 /root目录下
# 解压
cd /root
unzip lua-resty-redis-cluster-master.zip
# 拷贝redis_slot.c:
cp /root/lua-resty-redis-cluster-master/lib/redis_slot.c /usr/local/openresty/lualib/
# 拷贝rediscluster.lua:
cp /root/lua-resty-redis-cluster-master/lib/resty/rediscluster.lua /usr/local/openresty/lualib/resty/
# 编译
cd /usr/local/openresty/lualib
gcc redis_slot.c -fPIC -shared -o libredis_slot.so
lua-resty-redis-cluster中有部分redis指令并未开放,我们可以手动修改,开放相关指令,我们这里开放过期指令,因为后面会用到该指令。
注意:需要修改/usr/local/openresty/lualib/resty/rediscluster.lua文件,添加相关指令,如下图:
开放设置过期时间的指令,步骤如下:
# 修改配置文件
vi /usr/local/openresty/lualib/resty/rediscluster.lua
# 进入指定的行数
:90
# 插入空行
o
# 在空行中添加指令,设置过期时间的指令如下:(注意""和,都不能少)
"expire",
# 按 Esc 进入一般模式,保存退出
:wq
4.3.2.2 操作Redis集群实现
以后别的地方也有可能会用到redis,我们可以写个工具类redis-cluster.lua,实现redis的操作,这里主要实现了根据key获取缓存数据、根据key设置缓存过期时间、根据key从hash类型中获取数据、往hash类型中添加数据,代码如下:
--redis连接配置
local config = {
name = "test",
serv_list = {
{ip="47.110.58.254", port = 7001},
{ip="47.110.58.254", port = 7002},
{ip="47.110.58.254", port = 7003},
{ip="47.110.58.254", port = 7004},
{ip="47.110.58.254", port = 7005},
{ip="47.110.58.254", port = 7006},
},
idle_timeout = 1000,
pool_size = 10000,
}
--引入redis集群配置
local redis_cluster = require "resty.rediscluster"
--定义一个对象
local lredis = {}
--根据key查询
function lredis.get(key)
--创建链接
local red = redis_cluster:new(config)
red:init_pipeline()
--根据key获取数据
red:get(key)
local rresult = red:commit_pipeline()
--关闭链接
red:close()
return rresult
end
--添加带过期的数据
function lredis.setexp(key,value,time)
--创建链接
local red = redis_cluster:new(config)
red:init_pipeline()
--添加key,同时设置过期时间
red:set(key,value)
red:expire(key,time)
local rresult = red:commit_pipeline()
--关闭链接
red:close()
end
--根据key查询hash
function lredis.hget(key1,key2)
--创建链接
local red = redis_cluster:new(config)
red:init_pipeline()
--根据key获取数据
red:hmget(key1,key2)
local rresult = red:commit_pipeline()
--关闭链接
red:close()
return rresult[1]
end
--hash数据添加
function lredis.hset(key1,key2,value)
--创建链接
local red = redis_cluster:new(config)
red:init_pipeline()
--添加hash数据
red:hmset(key1,key2,value)
local rresult = red:commit_pipeline()
--关闭链接
red:close()
return rresult
end
--hash中指定的key自增
function lredis.hincrby(key1,key2,value)
--创建链接
local red = redis_cluster:new(config)
red:init_pipeline()
--添加hash数据
red:hincrby(key1,key2,value)
local rresult = red:commit_pipeline()
--关闭链接
red:close()
return rresult[1]
end
return lredis
我们接着来测试一次集群操作,修改nginx.conf,配置一个location节点,如下:
#redis
location /test/redis {
content_by_lua '
ngx.header.content_type="application/json;charset=utf8"
--引入redis
local rredis = require "redis-cluster"
--从redis中查询hash类型数据
local sku = rredis.hget("SKU_S1235433012716498944","num")[1]
ngx.say(sku)
';
}
测试效果如下: