Openresty连接redis集群爬坑操作

4,387 阅读4分钟
背景:首先说一下项目背景,我们公司有两条业务线,一条是免费小说,另一条就是广告,我们在免费小说中会内嵌一些广告,通过广告来获取收益。那么我负责开发的是广告SSP系统,老大和我说,我们的广告检索、曝光、点击日活大概是百万吧。然后我们一商量决定使用Openresty来提供广告的web服务。

 

Openresty简介: OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。由中国人章亦春发起,提供了很多高质量的第三方模块。

这里链接一个Openresty官网:[OpenResty® - 中文官方站]。

 还有一个最佳实践: [OpenResty 最佳实践]。

 张开涛的博客:[跟我学OpenResty(Nginx+Lua)]。


开始爬坑经历 :从上面的一些资料中我都没有找到lua如何连接redis集群,本人也是刚接触lua,所以自己去写一个连接redis集群的工具类也不现实,因此在网上疯狂百度,终于我找到了一篇文章:[lua连接redis集群 ],它告诉我需要从github地址:https://github.com/cuiweixie/lua-resty-redis-cluster 下载lua-resty-redis-cluster模块,只需要用到包中2个文件rediscluster.lua和redis_slot.c。而 .c文件无法在nginx配置文件中引入,需要编译成.so文件,编译命令: gcc SOURCE_FILES -fPIC -shared -o TARGET 。

 因此我就按照它说的下载之后开始编译。


坑一 :我一开始在本机电脑windows上搭了一个openresty环境,于是我在windows上编译,发现报错:gcc 命令不可以使用。不知道是不是要安装啥,然后我就在Linux上装了一个环境,开始在Linux上编译。


 坑二:我把redis_slot.c文件放在openresty安装目录下的lualib下(我考虑到编译需要lua的脚本)当我开始编译的时候发现报错说是:fatal error:lua.h:No such file or directory


因为在redis_slot.c文件中include了lua.h文件,当前目录确实没有lua.h 文件 然后我在 openresty目录下找到lua.h文件所在地(具体址:/usr/local/openresty/luajit/include/luajit-2.1)里面就有这种文件了


然后我继续编译 发现依旧报上面那个错:fatal error:lua.h:No such file or directory
然后百度发现: #include 用<>包含的文件直接到系统指定的目录下查找该文件,不是在当前目录找这个文件,而系统制定的默认目录为/usr/include/ 下。
于是把lua.h文件以及改目录下的其他.h文件拷贝到 /usr/include下解决问题。

命令:cp *.h /usr/include/


坑三:编译好了之后生成一个.so文件了,环境算可以了,然后开始跑一下连接redis集群,发现报错:


大体意思就是在rediscluster.lua文件中第134行报错,访问了一个nil值(空值)。

我打开rediscluster.lua查看源代码:


原来是访问了配置集群的配置,config.serv_list报了一个nil值。
而我定义的配置是


原来config表中的key是serv_list,这个key是不能随意替换的,这个一定要记住,看一下人家的代码。解决办法把 redis_cluster_server 换成 serv_list。

再一次看网上那个列子:


注意这个config表里面有两个key,一个是name,一个是serv_list。这两个key一定要有,而且名字不能变,因为源码中就是这么用的。

终于经过几个坑,lua可以连接redis集群并可以操作redis集群了。

接下来继续爬坑。。。


坑四:然后好景不长,业务中我需要给redis的key设置过期时间,我企图使用expire命令,然后运行时报错了,说是expire是一个nil值。再一次打开 rediscluster.lua


发现好多命令都是置灰的,也就是这些命令是不支持的。没办法继续找找看有没有其他的集群工具类吧,谁让我是lua菜鸟呢。

之后还真找到了另一个工具:github.com/steve0511/r…

然后它是支持所有的命令的,作者说是在上面那个工具的基础上开发的。

到此lua连接redis集群的坑陆续爬完。