Lua 脚本读取 redis 数据|学习笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 快速学习 Lua 脚本读取 redis 数据

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第一阶段Lua 脚本读取 redis 数据】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/669/detail/11610


Lua 脚本读取 redis 数据

 

内容介绍

一、 前情回顾

二、 Lua 脚本读取 redis 数据

三、 运行代码

四、 总结

 

一、 前情回顾

要连接 redis 去获取数据首先得有 redis 实例,实例需要 new, 超时可以设置timeout, 有了实例还需要连接数据库,连接以后要读取数据或者是写入数据,其他的暂时不需要了解

local ok , new _ tab peal1( reqruire ," table . new ")

if not ok or type ( new _ cab )~= " function " then

new_tab=function(narr,nrec)return()end

end

local_ M = neW _ tab (0,54)

_M_VERSION=0.26!

local  common_cmds={

local sub comumands

" subscribe "," psubscribe ”

local unsub _ eommands ={

" unsubscribe "," punsubscribe "

local  mt{_index=_M_{}

function _ M. new ( sel f)

local sock , err tcpO )

if not sock thenl

return nil ,err

end

return setmetatable (_sock=sock,_ subscribed = false )

end

function _ M.set _ timeout ( self , timeout )

local sock rawget (se1f,"_ sock ”)

if not sock then

return nil ," not initialized

end

return sock : settimeout ( timeout )

end

functionM . connect (self ·)

LocalSockTaWget(self," sock ")

if not sock then

return nil ," not inicialized" end

self_ SubsCribed = false

return sock: connect (..) end

function _ M . set _ keepalive ( self ,

local sock rawget ( self ,"_ sock ")

if not sock then

retarn nil ," not initialized ”

end

if rawget (se1f,

retarn nil " subscribed ") then

" subscribed state "

 

二、 Lua 脚本读取 redis 数据

只需要在流程中把数据读出来,读到 lua 脚本中流程打通就可以了,剔除的操作由前端工程师实现,接下来就进行操作,写脚本在 shell 窗口不是很方便,所以在windows 新建脚本,在这里面写,写好上传上来就行。

图片1.png

编写读取数据的脚本思路:写读取 redis 数据先引入 redis 包,包是 web 包没在脚本中,这就涉及到了如何引入 web 包,前面课程中已经讲过,类似于 java 中的 import 这里面叫 require。

引入以后实例化一个 redis 对象,用对象连接数据库,连接后调用命令,这就是实践的过程。

1. 引入 readies 的模块

2. 实例对象

3. 创建链接

4. 调用命令

1.引入 readies 的模块

调用 require, 先定义一个局部变量局部变量名为 importRedis,等于引入的外部redis, 跟的是文件名称,文件名称为 redis.lua,不能加 .lua 只能把 redis 写过来,但是不能仅仅写 redis, 因为 redis 目录在 use/local/Openresty/lualip/resty 中,Openresty 引入第三方的包使用时默认放在 resty 目录中,类似于 java 大数据环境中这些软件 jar 包,jar 包都在 lib下面,这个里面依赖的包 lualib 的 resty 中,系统在找的时候 Java/ 大数据中默认到 lib 中找,Openresty 默认到 lualob 中找,要想让他找到 redis.lua 首先要将默认到了的目录找到也就是 luaredis 目录的文件,还要将 resty 加到里面去。

也就是在引入时需要引入的是 resty.redis 系统会默认它到 lualib 找,找到 resty, 去 resty 中去找 redis。所以这里先写 resty 目录再写, redis 文件名这一步就将 redis 引入了 local importRedis=require"resty.redis"

2.实例化对象

定义一个 local 名为 redis,importRedis 是前面引入进来的,相当于已经拿到了redis, 引入以后直接调用,redis 实例化方法 _M.new, 可能有的同学有疑问前面进行调用直接 _M..new 通过这个方法来调用,但是这里需要先引进来用 local 接收,接收以后再调用时需要用到: importRedis:new(), 这个时候不需要 _M,可以省略掉,直接用对象变量:加上 new 就可以引过来,实例化以后就赋给了 redis。

也就是说此 redis 拿到了实例,只不过变量名叫 redis, 这就是实例化 redis ,local redis=importRedis:new()

3.创建连接

创建连接实际上用 redis 去连接,依然是 _M.connect, 连接就要有一个 ip, 在这个服务器上 ip 是192.168.100.160,端口有三个打开 redis 有160.7001、160.7002、160.7003,现在的数据 heima 在7002中,这是 redis 在160上部署的一个集群,通过到这个节点上找这个端口去连接这就和节点连接上了,但是连接有可能连接成功也有可能连接失败,所以再来做一个局部接收,成功就用 ok 失败就用 err, 用 ok 和 err 进行接收连接时的一些信息,如果不成功就 then 输出连接失败,否则输出连接成功

local ok , err =redis : connect (”192.168.100.160",7002)

if not ok then

ngx . say (" redis connect err ", err )

else

ngx . say (" redis connect ok ”, Ok )

end

functionM . connect (self ·)

LocalSockTaWget(self," sock ")

if not sock then

return nil ," not inicialized" end

self_ SubsCribed = false

return sock: connect (..) end

function _ M . set _ keepalive ( self ,

local sock rawget ( self ,"_ sock ")

if not sock then

retarn nil ," not initialized ”

end

4.调用命令

现在数据中有一个 heima 值是 verygood, 直接调用 redis,key 是 heima, 获取数据也有可能成功和失败。这就是 redis 读取数据的实例

local ok , err =redis : get (”heima")

if not ok then

ngx . say (" get   redis  data", err )

else

ngx . say ("get   redis  data  ”, Ok )

end

 

三、 运行代码

如果代码有效果看看能不能优化,报错查看一下有哪些错误,接下来就把写好的脚本引入实例连接以后在调用,将脚本保存,保存以后上传到 testlua 里,上传以后脚本有了,但是还没有修改 nginx 配置文件,把名称由 content _ by _lua_ file usr /1ocal/ openresty / testlua / Test10 .lua; 改为 content _ by _lua_ file usr /1ocal/ openresty / testlua / TestRedis .lua;,

路径还是这个路径只是名词变了,保存以后要生效看到效果就要重启 niginx 服务器重启没有报错,立刻回到首界面中刷新界面,如果正常没错的话就有 heima 正常输出出来,如果报错会给一个 err, 刷新过后显示如下结果,

图片2.png

这个值不太好看,稍加处理一下,前面代码每次输出都加一个回车换行,保存后再次上传,上传不会覆盖将前面删掉,重启 nginx 服务器,刷新界面,这下可以看到换行了,先做是连接 redis,如果连接成功就报 OK,后面给了一个 ok 的值 OK 的值是1,获取数据get   redis  dataOK,读到了这个数据的值 verygood, 也就是heima 对应的是 verygood, 这就将 redis 中的数据读取出来了,这个流程走通就说明 redis 读取数据流程走通了读到了脚本里面。

图片3.png

更改后的代码如下

local ok , err =redis : connect (”192.168.100.160",7002)

if not ok then

ngx . say (" redis connect err ", err )

eles

ngx . say (" redis connect ok ”, Ok )

ngx.say("<br>")

end

local ok , err =redis : get (”heima")

if not ok then

ngx . say (" get   redis  data", err )

ngx.say("<br>")

else

ngx . say ("get   redis  data  ”, Ok )

end

5. 注意

当前的 redis 里面没有设置密码所以没有加这个,如果 redis 里面设置了密码还需要这一步操作,就可以读取数据了

﹣请注意这里 auth 的调用过程

local count

count , err = red : get _ reused _times0if0= count then

ok , err = red : auth (" admin ") if not ok then

gx . say (" failed to auth :", err )

return

end

elseif err then

ngr . say (" failed to get reused times :" I , err )

return

end


四、总结

以上就是 redis 读取数据的过程,就是按上面四个步骤进行书写的。

1.引入 readies 的模块

local importRedis=require"resty.redis"

2.实例对象

local redis=importRedis:new()

3.创建链接

local ok , err =redis : connect (”192.168.100.160",7002)

4.调用命令

local ok , err =redis : get (”heima")

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
146 16
|
11天前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
数据并发竞争是大流量系统(如火车票系统、微博平台)中常见的问题,可能导致用户体验下降甚至系统崩溃。本文介绍了两种解决方案:1) 加写回操作加互斥锁,查询失败快速返回默认值;2) 保持多个缓存备份,减少并发竞争概率。通过实践案例展示,成功提高了系统的稳定性和性能。
|
11天前
|
缓存 监控 NoSQL
Redis经典问题:数据不一致
在使用Redis时,缓存与数据库数据不一致会导致应用异常。主要原因包括缓存更新失败、Rehash异常等。解决方案有:重试机制、缩短缓存时间、优化写入策略、建立监控报警、定期验证一致性、采用缓存分层及数据回滚恢复机制。这些措施可确保数据最终一致性,提升应用稳定性和性能。
|
22天前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
32 6
|
2月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
73 14
|
2月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
56 13
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
45 5
|
7月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
256 0
|
3月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
40 2
|
4月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?