Lua实现Redis操作

574 阅读2分钟

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文件,添加相关指令,如下图:

image.png

开放设置过期时间的指令,步骤如下:

# 修改配置文件
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)
    ';
}

测试效果如下:

image.png