openResty的Redis模块踩坑记录

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fileinclude

前提知识: filter伪协议 include函数用php://filter伪协议来绕过 题目: 打开题目 页面显示如图,可以知道flag在flag.php中,还知道当前页面的绝对路径 先查看源代码 15行$lan用$_cookie传参,可以修改cookie值从而控制…

探索非洲专线物流的新时代_国际物流供应链管理平台_箱讯科技

随着全球化的发展,非洲作为一个充满机遇和挑战的大陆,吸引着越来越多的企业和投资者。然而,由于非洲的地理复杂性和基础设施不完善,物流问题一直是制约非洲发展的瓶颈之一。为了解决这一问题,非洲专线物流应运而生。本…

网络原理之传输层与网络层重点协议

目录 传输层重点协议 TCP协议 TCP协议段格式 TCP原理 确认应答机制(安全机制) 超时重传机制(安全机制) 连接管理机制(安全机制) 滑动窗口(效率机制) 流量控制(安…

数字IC笔试面试常考问题及答案汇总(内含各岗位大厂题目)

经历了无数的笔试面试之后,不知道大家有没有发现数字IC的笔试面试还是有很多共通之处和规律可循的。所以一定要掌握笔试面试常考的问题。 数字IC笔试面试常考问题及答案汇总(文末可领全部哦~) 验证方向(部分题目) Q1…

数据可视化分析,2023结婚全品类消费趋势洞察报告

结婚消费与人们的关系密切相关。结婚是一个重要的人生事件,往往伴随着大量的消费。人们倾向于在婚礼仪式、婚纱摄影、宴会等方面进行豪华的投资,以展示社会地位和个人品味。此外,结婚还涉及到婚戒、婚庆、蜜月旅行等费用。然而,随…

Jenkins+Robot 接口自动化测试

目录 前言: 设计目标 项目说明 目录结构 配置 jenkins 1.安装插件 2.配置项目 前言: JenkinsRobot是一种常见的接口自动化测试方案,可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具,而Robot Framew…

【5G PHY】5G 调制与编码策略(MCS)介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Cisco学习笔记(CCNA)——Internetworking

Internetworking Internetworking Basics 什么是网络? 计算机网络:具有独立功能的多台计算机及其外部设备,通过通信线路连接起来 网络设备 Hub(集线器) 优点:便宜、操作简单 缺点:共享型、…

Kubernetes(K8s)常用命令大全:熟练编排更完美

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

react 升级

1、查看react版本 当前开发项目的react版本从哪里看呢?其实就在package.json文件中,搜索"react",即可看到版本号 2、输入命令npm info react查看最新的react版本 3、执行命令 npm install --save react18.2.0 react-dom18.2.0 4…

Docker 部署 Jenkins (一)

Docker 部署 Jenkins (一) 一. 安装 jenkins $ mkdir -p /home/tester/data/docker/jenkins $ vim jenkins:lts-jdk11.sh./jenkins:lts-jdk11.sh 内容 #! /bin/bash mkdir -p /home/tester/data/docker/jenkins/jenkins_homesudo chown -R 1000:1000 /home/tester/data/dock…

2023年Java最新面试题

由【后端面试题宝典】提供 和 equals 的区别是什么? 对于基本类型,比较的是值;对于引用类型,比较的是地址;equals不能用于基本类型的比较;如果没有重写equals,equals就相当于;如果重…

基于Javaweb实现ATM机系统开发实战(十一)存储交易记录

首先创建一个业务接口: package com.atm.service;import com.atm.pojo.RunMessage;//交易记录的业务接口 public interface RunMessageService{//添加交易记录public void addRunMessage(RunMessage runMessage) throws Exception ; }再完成业务接口的实现类&#…

JAVA中的Socket编程、通信协议、传输协议

JAVA中的Socket编程 一、Socket概述 Socket,建立起客户端和服务器之间的连接,实现数据的传输和交互,它既可以发送请求,也可以接受请求,一个Socket由一个IP地址和一个端口号唯一确定,利用Socket能比较方便的…

基于单片机指纹考勤系统的设计与实现

功能介绍 以51单片机作为主控系统;利用指纹采集模块存储打卡信息;12864显示当前考勤信息,时间 ;如果迟到 语音播报 您已迟到;按键进行注册指纹、删除指纹、设置当前时间和签到时间、查询打卡等;具有掉电保存…

讯为RK3568开发板到手编译buildroot系统入坑一

从事单片机开发多年一直想买一个开发板学习Linux系统,这次狠心花了800多打样买了一个讯为的RK3568低配。裸板配置。 因为讯为没有编译系统的视频教程,只有文档的教程,而且只有瑞芯微官方带的Linux源码中的系统编译后文档教程。像ubuntu是没有…

51单片机的智能交通控制系统【含仿真+程序+演示视频带原理讲解】

51单片机的智能交通控制系统【含仿真程序演示视频带原理讲解】 1、系统概述2、核心功能3、仿真运行及功能演示4、程序代码 1、系统概述 该系统由AT89C51单片机、LED灯组、数码管组成。通过Protues对十字路口红绿灯控制逻辑进行了仿真。 每个路口包含了左转、右转、直行三条车道…

使用FreeMarker自定义生成word文档

使用FreeMarker自定义生成word文档 最终生成word文档如下: 实现思路: 按照要生成的文档模板格式,创建一个新的word(doc)文档,将其调整成所需格式,然后处理其中需要动态填充的数据&#xff0…

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中 一、概述二、特别说明三、开发环境四、安装 open-jdk-1.7五、配置环境1、配置环境变量路径2、环境变量3、完成安装 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。…

红帽Linux 8.0末班车

RH124、RH134、RH294三门课和考前辅导的套包课程。红帽系统管理是针对了解 Linux 并需要核心红帽企业 Linux 技能的 IT 业人员而设计的。学完这个课程后,学员将能够执行安装操作,建立网络连接,管理物理存储器&#xff0c…