Lua App中通过Sqlite实现消息队列(异步通信)

本文介绍了如何在Lua应用中利用Sqlite数据库实现消息队列,以满足无网或弱网环境下的用户操作需求。通过创建事件表、使用Lua协程处理请求和维护队列的先进先出特性,实现异步通信机制。同时探讨了可能的优化方案,如对while死循环的替代选择。

实践动机和目标

目前具有社交功能的App中大量使用本地Sql来存储用户记录,同时为了优化用户体验,这些App都有意提供用户在无网(或弱网)环境下操作的需求。因此,在App中有必要有异步通信机制来处理(响应)用户的请求。

实现原理

1.通过在Sqlite中设立事件表(EventTable),来记录用户操作信息。
2.借由Lua提供的协程来处理用户请求,并向服务器发送请求。
3.完成与服务器的一次响应事件后,删除这一条操作事件。

建立事务表

在Sqlite中建立事务表,建议在表中设立一个时间戳类型的字段(EventDate)。采用时间戳类型的字段主要有两个目的:
1.作为事件的唯一标识符
2.时间戳类型本身可以作为字段进行排序

由此联想:Sqlite本身对每一行数据都会设置一个id,能否利用这个字段进行排序?

获取队列

队列的必要特性就是先进先出,那么就要在sql语句中实现。代码如下:

select * from EventTable order by EventDate ASC limit 1 

order by EventDate ASC 按照EventDate对EventTable事件表进行正序排序
limit 1 取顶部第一条数据

设置Lua协程

运用Lua语言本身提供的协同程序处理,注意协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程,创建协程代码:

function syncService( ... ) 
   while true do
      -- [[ 处理内容 ]] --
      sleep(1)
   end
end
local syncData = coroutine.create(syncService)
function onReady( ... )
   coroutine.resume(syncData)
end

完善处理内容

在处理内容中可以完成API请求,在这个步骤中可以做以下配置:

设定一个全局变量 local sync = true
方法体中依次完成队列获取、调取API、删除队列(释放):

local sync = true --全局变量
if sync then
   local data =  dbHelper.execTable("select * from EventTable order by EventDate ASC limit 1", "select”)
   if data and #data > 0 then
      if data[1] and data[1].EventDate then 
         sync = false
         local response = post( ) --调取API,这里做了简略
         if response == 200 then
            dbHelper.execTable("delete from EventTable where EventDate = '"..data[1].EventDate.."'", "delete") --释放队列
            sync = true
         else
            sync = true
         end
      end
   end 
end



以上就是利用Lua来实现消息队列的基本思想,运用到的以下知识点:Lua 协程、Sqlite数据库操作

思考:调取线程中使用while死循环是否可取,有无更好的替代方案?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值