skynet + redis 发布订阅 多频道开启关闭管理以及监听

本文介绍了一种使用Lua和Skynet框架实现跨服聊天系统的方案。通过调用skynet.db.redis模块,配置自定义的Redis连接,实现了频道的开启与关闭功能。每个频道的监听通过协程和xpcall_loop_check循环检查实现,确保了消息的实时传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

local skynet = require("skynet")
local redis = require("skynet.db.redis") 
local sconfig = util.get_server_config() --- 自己的redis配置
local util = require("util")
require("skynet.manager")

local CMD = {}
local channels = {}
local channelFunction = {} ---开启频道的方法table

function CMD.open_cross_channel(channelName) --- 开启频道
	cross_chat_function(channelName)
end

function cross_chat_function(channelName) --- 开启频道的方法 每开一个都要以方法的形式放入table
	
	channelFunction[channelName] =  
	function(channelName)
		local channelwatching = redis.watch(sconfig.redis)
		channels[channelName] = channelwatching
		channelwatching:subscribe(channelName)
			util.xpcall_loop_check( --- xpcall_loop_check 这是自己写的loop 代码在下面 根据情况自己调整
				function()
					while true do 
						local mes = channelwatching:message() --- 监听到的消息内容 在这里写业务逻辑
					end
				end
			,"crosschannel")	
	end
	channelFunction[channelName](channelName) --- 调起自己的方法 开始监听
end

function CMD.close_cross_channel(channelName) --- 关闭频道
	channels[channelName]:unsubscribe(channelName)
	channels[channelName] = nil
end

require "skynet.datasheet"
skynet.start(function() 
	skynet.dispatch("lua", function(_, _, cmd, ...)
		local c = assert(CMD[cmd], cmd)
		local ret =  c(...)
		skynet.ret(skynet.pack(ret))
	end)
	skynet.register(".CROSSCHANNELMGR")
end)

 这是loop的代码

local skynet = require "skynet"
local sysLog = require("sysLog") --- log

function util.xpcall_loop_check(update, name)
	skynet.fork(function() --- 必须是协程!!! 不然启动while true会阻塞其它服务
		while true do
			local now = os.time()
			local ok, ret = xpcall(update, debug.traceback, now)
			if not ok and ret then 
				sysLog.info("LOOP ERROR", name, ok, ret)
			end
		end
	end)
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值