lua中如何实现连接字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua中如何实现连接字符串相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env lua function th_table_dup(ori_tab) -- 复制table if (type(ori_tab) ~= "table") then return nil; end local new_tab = ; for i,v in pairs(ori_tab) do local vtyp = type(v); if (vtyp == "table") then new_tab[i] = th_table_dup(v); elseif (vtyp == "thread") then -- TODO: dup or just point to? new_tab[i] = v; elseif (vtyp == "userdata") then -- TODO: dup or just point to? new_tab[i] = v; else new_tab[i] = v; end end return new_tab;end function permutation(s1,p) if #s1 == 1 then -- 如果s1长度为1,意味着获得了一种新的排列 p = p .. s1[1] -- 那么就打印它 print(p) else -- 否则,选定一种方案,继续递归 local i for i = 1, #s1 do -- 4.3 Control Structure; Numeric for local p2, s2 p2 = p .. s1[i] s2 = th_table_dup(s1) -- 把s1表的内容复制给s2表 table.remove(s2,i) -- 20.1 Insert and Remove permutation(s2,p2) -- 用s2继续进行递归 end endend -- 主程序a = io.read() -- 读入字符串,可含汉字 -- 22.1 The Simple I/O Modellen = #(string.gsub(a, "[\128-\191]", "")) -- 计算字符数(不是字节数) i=1 -- 迭代出每一个字符,并保存在table中s = -- 21.1 Basic String Functionsfor c in string.gmatch(a, ".[\128-\191]*") do -- 21.2 Pattern-Matching Functions s[i]=c -- 21.7 Unicode i=i+1end print("permutation output:")p=""permutation(s,p) 参考技术A 用两个圆点连接字符串即可。

如何在 Lua 中使我的 redis 连接单例?

【中文标题】如何在 Lua 中使我的 redis 连接单例?【英文标题】:How to make my redis connection Singleton in Lua? 【发布时间】:2021-07-30 22:47:19 【问题描述】:

我正在尝试处理 Nginx 和 Lua 传入的 HTTP 请求。我需要在每个请求中从 Redis 读取一个蓝色,目前,我通过以下代码在每个请求中打开一个 Redis 连接:

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

local ok, err = red:connect("redis", 6379)
if not ok then
    ngx.say("failed to connect: ", err)
    return
end

local res, err = red:auth("abcd")
if not res then
    ngx.log(ngx.ERR, err)
    return
end 

有什么方法可以使这个连接静态或单例来提高我的请求处理程序性能?

【问题讨论】:

【参考方案1】:

It is impossible 在不同请求之间共享一个 cosocket 对象(因此,一个 redis 对象,请查看this answer 了解详细信息):

此 API 函数创建的 cosocket 对象与创建它的 Lua 处理程序具有完全相同的生命周期。所以永远不要将 cosocket 对象传递给任何其他 Lua 处理程序(包括 ngx.timer 回调函数),并且永远不要在不同的 Nginx 请求之间共享 cosocket 对象。

但是,nginx/ngx_lua 内部使用a connection pool:

在实际解析主机名并连接到远程后端之前,此方法将始终在连接池中查找由先前调用此方法创建的匹配空闲连接

话虽如此,您只需要使用sock:setkeepalive() 而不是sock:close() 来实现持久连接。 redis对象接口有对应的方法:red:set_keepalive()。

您仍然需要根据每个请求创建一个 redis 对象,但这将有助于避免连接开销。

【讨论】:

以上是关于lua中如何实现连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

在Pandoc lua过滤器中连接字符串片段

Lua中字符串与模式匹配(正则表达式)

lua保存缓存中文件

程序lua的string.format为什么比".."慢

一文读懂Lua元表

第三章 表达式 Lua程序设计笔记