openResty的Redis模块踩坑记录

news2024/11/25 0:23:01

OpenResty提供了操作Redis的模块,我们只要引入该模块就能直接使用。说是这样说,但是实践起来好像并不太顺利。

1.设置了密码的redis,lua业务逻辑中需要添加身份认证代码

网上很多资料、文章似乎都是没有设置redis密码,说来也奇怪,哈哈!如果你的redis设置了密码,而lua业务逻辑中却没有加身份认证代码,就会报错。

35200#0: *466 [lua] common.lua:39: read_redis(): Getting key is failed!NOAUTH Authentication required.
2.redis对象的共享问题

这是99%的人都会犯的错误。受Java语言编程的影响,为了更好的复用resty.redis对象,自然而然的会将resty.redis对象的初始化放在lua模块级的变量中供多个请求共享。比如像下面common.lua文件这样:

local redis = require("resty.redis")
local red = redis:new()
red:set_timeouts(1000,1000,1000)

local function read_redis(ip,port,password,key)
  
  local ok,err = red:connect(ip,port)
  if not ok then
     ngx.log(ngx.ERR,"Connecting Redis is failed!",err,",key = ",key)
     return nil
  end

  local res,err = red:auth(password)
  if not res then
     ngx.log(ngx.ERR,"Authentication is failed!",err);
     return nil
  end

  local resp,err = red:get(key)
  if not resp then
     ngx.log(ngx.ERR,"Getting key is failed!",err,",key = ",key)
  end

  if resp==ngx.null then
     resp = nil
     ngx.log(ngx.ERR, "Redis value is null, key = ", key)
  end

  release_redis(red)
  return resp
end

common.lua是封装公共函数的lua模块文件,此时的resty.redis对象会被所有调用read_redis函数的请求所共享。当出现大量请求并发的情况,会有非常多的redis调用失败,而在后台出现大量的bad request错误,导致openResty服务不可用。

35306#0: *504 lua entry thread aborted: runtime error: /usr/local/openresty/lualib/common.lua:30: bad request

官方文档已经明确指出,我们应该始终在函数的局部变量,或ngx.ctx table中初始化resty.redis对象,这些地方对每个请求都有自己的数据副本。

关于resty.redis对象初始化的描述.png

正确的做法是在函数中初始化resty.redis对象。这里的例子中指的是read_redis函数。

local redis = require("resty.redis")

local function read_redis(ip,port,password,key)
   local red = redis:new()
   red:set_timeouts(1000,1000,1000)
   local ok,err = red:connect(ip,port)
   if not ok then
      ngx.log(ngx.ERR,"Connecting Redis is failed!",err,",key = ",key)
      return nil
   end

   local res,err = red:auth(password)
   if not res then
      ngx.log(ngx.ERR,"Authentication is failed!",err);
      return nil
   end

   local resp,err = red:get(key)
   if not resp then
      ngx.log(ngx.ERR,"Getting key is failed!",err,",key = ",key)
   end

   if resp==ngx.null then
      resp = nil
      ngx.log(ngx.ERR, "Redis value is null, key = ", key)
   end

   release_redis(red)
   return resp
end
3.注意lua-resty-redis的版本

由于小编的上述代码中使用了set_timeouts函数,导致后台一直报错。

35829#0: *523 attempt to send data on a closed socket: u:0000000000000000, c:0000000000000000,

查阅了很多资料,最终发现set_timeouts函数是V0.28版本才加进来的。要想查看自己的lua-resty-redis的版本,可以打开lualib下的redis.lua文件查看,具体路径:

/usr/local/openresty/lualib/resty/redis.lua

你将会看到它的版本号。

lua-resty-redis的版本.png

解决方案:用set_timeout函数替代set_timeouts函数,即可解决。

red:set_timeout(1000)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS区域滤镜

思路 简单一点的&#xff0c;像素点X坐标小于图宽1/3和大于2/3的点变灰&#xff0c;中间的点不变。 复杂的暂时不会搞。 原图 处理后 <html> <style> #canvas { width:100%; } </style> <body> <input id"file" type"file" …

python中的生成器(generator)

一、生成器 生成器是 Python 中非常有用的一种数据类型&#xff0c;它可以让你在 Python 中更加高效地处理大量数据。生成器可以让你一次生成一个值&#xff0c;而不是一次生成一个序列&#xff0c;这样可以节省内存并提高性能 二、实现generator的两种方式 python中的gener…

SAP从放弃到入门系列之WIP Batch(Work-in-Process ) -Part1

目录 一、 概述二、 系统配置三、 数据设置最后 ERP系统的复杂性并不单是架构设计和技术造成的&#xff0c;而是它所要支撑的业务场景&#xff0c;涉及行业越广泛越复杂软件功能越复杂&#xff0c;复杂的背后是业务实践沉淀和优化的流程。平时看着部分系统功能很复杂&#xff0…

47.判断类关键字 if else switch case default

目录 1 if 2 else 3 判断的嵌套 4 switch,case,default 4.1 基本使用 4.2 需要注意的点 1 if if后面的括号加表达式的内容&#xff0c;大括号中加入 条件为true 时要运行的代码 经测试如果我们将a的值设置为0&#xff0c;则不会弹出警告框 2 else 和if配合使用…

ubuntu netplan工具原理(网络配置、ip修改ip、固定ip)(NetworkManager)

https://netplan.io/ 文章目录 netplan工作原理netplan -h原翻译命令释义- help&#xff1a;显示netplan的帮助消息。- apply&#xff1a;将当前netplan配置应用到运行系统。示例命令&#xff1a;netplan apply --debug- generate&#xff1a;从/etc/netplan/*.yaml生成特定于后…

iOS开发 - NotificationService语音播报

iOS NotificationService语音播报 最近碰到个接收到推送要实现语音播报的需求&#xff0c;需要后台推送通知&#xff0c;APP客户端收到通知之后语音播放&#xff1a;“您的账户收到一笔巨款”的功能。 因为工程之前已经集成了极光推送服务。这里直接使用Notification Service…

【科研绘图】MacOS系统OmniGraffle实用指南

用过不少绘图软件&#xff0c;包括Visio (only for Windows)、ProcessOn、draw.io等主流软件&#xff0c;然后换Mac后尝试了实验室在用的OmniGraffle&#xff0c;才第一次感受到了绘图软件的人性化和强大&#xff01; 实用操作总结 按住Shift后调整元素位置或调整线段&#x…

使用STM32 再实现感应开关盖垃圾桶

硬件介绍 SG90舵机 如上图所示的舵机SG90&#xff0c;橙线对应PWM信号&#xff0c;而PWM波的频率不能太高&#xff0c;大约50Hz&#xff0c;即周期0.02s&#xff0c;20ms左右。 在20ms的周期内&#xff0c;高电平占多少秒和舵机转到多少度的关系如下&#xff1a; 0.5ms-----0度…

性能测试持续学习 Docker 新建镜像,启动 POD

目录 前言&#xff1a; 1、构建镜像 2、使用已有镜像启动 Pod 前言&#xff1a; 在进行性能测试时&#xff0c;持续学习Docker的使用可以帮助测试团队更好地管理测试环境和资源。通过使用Docker&#xff0c;可以轻松创建和管理测试环境的镜像&#xff0c;并通过启动POD来快…

win32汇编资源编译RC2103错误 - end of file in string literal

现在有如下的一个资源rc文件&#xff0c; #include <resource.h>#define DLG_MAIN 1 #define IDC_COUNT 101DLG_MAIN DIALOG 50, 50, 113, 40 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "例子" FONT 9, "宋体&…

什么是端口号【图解TCP/IP(笔记十一)】

文章目录 端口号端口号定义根据端口号识别应用通过IP地址、端口号、协议号进行通信识别端口号如何确定端口号与协议 TCP具有代表性的知名端口号UDP具有代表性的知名端口号 端口号 端口号定义 数据链路和IP中的地址&#xff0c;分别指的是MAC地址和IP地址。前者用来识别同一链…

【论文笔记】Guided Skill Learning and Abstraction for Long-Horizon Manipulation

【论文笔记】Guided Skill Learning and Abstraction for Long-Horizon Manipulation 更多笔记&#xff08;在耕&#xff09;&#xff1a;这里 文章目录 【论文笔记】Guided Skill Learning and Abstraction for Long-Horizon ManipulationAbstractI. INTRODUCTIONII. RELATED…

flashFXP 提示: 数据 Socket 错误: 连接已超时 阿里云 安全组

flashFXP 提示: 数据 Socket 错误: 连接已超时的解决办法, 公司搬家后,ip换了.ftp进不去了.当然要查一下服务器防火墙,ftp软件上的端口是否开放.比如自定义的端口为21221,则需要在安全组中开放这个端口.但发现没问题. 同时重新修改了ftp用户的密码.发现也无效 网上有人说,传输模…

MySQL每日一练:多表查询——连接查询、子查询

目录 1、首先创建员工表emp和部门表dept&#xff1a; dept表&#xff1a; emp表&#xff1a; 2、插入数据&#xff1a; dept表&#xff1a; emp表&#xff1a; 3、 按条件查找 1、首先创建员工表emp和部门表dept&#xff1a; dept表&#xff1a; create table dept (…

量子纠缠:超越时空的连接

亲爱的读者&#xff0c; 欢迎回到量子力学系列文章。在前几篇文章中&#xff0c;我们介绍了量子力学的起源、基本概念&#xff0c;以及叠加态和超级定位的奇特现象。今天&#xff0c;我们将探索量子力学中最为神奇和令人惊叹的现象之一&#xff1a;量子纠缠。 量子纠缠是一种特…

opencv读取图像数据并修改通道转变内存连续

opencv读取图像数据并修改通道转变内存连续

试题小结3

项目和项目之间的通信 两个java项目&#xff0c;他们之间进行信息的通信 前提&#xff1a;必须知道要通信的java项目&#xff08;接收请求方&#xff09;的服务器的IP地址和访问路径。 其实两个java项目之间的通信还是使用HTTP的请求。主要有两种方式&#xff1a; ①使用ap…

Flask+Echarts搭建全国疫情可视化大屏

FlaskEcharts搭建全国疫情可视化大屏 1、前言2、实现2.1 搭建flask应用2.2 编写html及其对应css代码2.3 可视化展示2.3.1 左上角板块2.3.2 中间上方板块2.3.3 右上角板块2.3.4 左下角板块2.3.5 中间下方板块2.3.6 右下角板块 2.4 完整代码&数据集获取 3、号外 1、前言 本项…

Git学习与使用

目录 版本控制、GIT以及SVN常见的版本控制方法本地版本控制集中式版本控制分布式版本控制 SVN与Git的区别 下载与安装Git安装&#xff1a; Git环境配置Git必要的配置 Git的基本理论&#xff08;核心&#xff09;Git项目搭建创建目录 git文件操作忽略文件 使用码云(gitee)辅助学…

CV常用注意力机制总结

本文总结了近几年CV领域常用的注意力机制&#xff0c;包括&#xff1a;SE&#xff08;Squeeze and Excitation&#xff09;、ECA&#xff08;Efficient Channel Attention&#xff09;、CBAM&#xff08;Convolutional Block Attention Module&#xff09;、CA&#xff08;Coor…