Moon数据库连接实战:Redis/PostgreSQL/MySQL异步驱动使用教程

发布时间:2026/7/16 19:52:49
Moon数据库连接实战:Redis/PostgreSQL/MySQL异步驱动使用教程 Moon数据库连接实战Redis/PostgreSQL/MySQL异步驱动使用教程【免费下载链接】moonA lightweight game server framework implemented with Actor Model项目地址: https://gitcode.com/gh_mirrors/moon1/moonMoon是一个基于Actor模型的轻量级游戏服务器框架提供了完整的数据库异步驱动支持。在本教程中我们将深入探讨如何在Moon框架中高效地连接和使用Redis、PostgreSQL、MySQL等主流数据库帮助您构建高性能的游戏服务器后端。 Moon数据库连接概览Moon框架内置了多种数据库的异步驱动包括Redis、PostgreSQL、MySQL和MongoDB。这些驱动都采用了非阻塞I/O设计能够充分利用Moon的Actor模型优势实现高并发数据库操作。 数据库驱动安装与配置Moon的数据库驱动模块位于lualib/moon/db/目录下您可以直接在Lua代码中引入使用Redis驱动moon.db.redisPostgreSQL驱动moon.db.pgMySQL驱动moon.db.mysqlMongoDB驱动moon.db.mongo Redis数据库连接实战基础连接配置Redis是游戏服务器中最常用的缓存和数据存储方案。Moon提供了完整的Redis客户端支持local redis require(moon.db.redis) -- 连接Redis服务器 local db, err redis.connect({ host 127.0.0.1, port 6379, auth your_password, -- 可选密码认证 db 0, -- 可选数据库索引 timeout 1000 -- 连接超时毫秒 }) if not db then moon.error(Redis连接失败:, err) return end常用操作示例-- 字符串操作 db:set(player:1:name, Alice) local name db:get(player:1:name) -- 哈希表操作 db:hset(player:1, level, 10) db:hset(player:1, gold, 1000) local player_data db:hgetall(player:1) -- 有序集合排行榜 db:zadd(leaderboard, 1500, player1) db:zadd(leaderboard, 1200, player2) local top_players db:zrange(leaderboard, 0, 9, WITHSCORES) -- 发布订阅 db:publish(chat_channel, Hello, World!)Pipeline批量操作优化对于批量操作使用Pipeline可以显著减少网络往返次数local ops { {SET, key1, value1}, {SET, key2, value2}, {GET, key1}, {INCR, counter} } -- 执行Pipeline local responses {} db:pipeline(ops, responses) -- 处理所有响应 for i, resp in ipairs(responses) do print(i, resp.ok, resp.out) end PostgreSQL数据库连接实战连接PostgreSQL数据库PostgreSQL是功能强大的关系型数据库Moon提供了完整的PostgreSQL协议支持local pg require(moon.db.pg) -- 连接PostgreSQL local db, err pg.connect({ host 127.0.0.1, port 5432, user postgres, password your_password, database game_db }) if not db then moon.error(PostgreSQL连接失败:, err) return end数据操作示例-- 创建玩家表 db:query([[ CREATE TABLE IF NOT EXISTS players ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, level INTEGER DEFAULT 1, gold INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ]]) -- 参数化查询防止SQL注入 local ok, result db:query( INSERT INTO players (name, level, gold) VALUES ($1, $2, $3) RETURNING id, Alice, 1, 1000 ) if ok then print(新玩家ID:, result[1].id) end -- 查询玩家数据 local ok, players db:query(SELECT * FROM players WHERE level $1, 10) if ok then for _, player in ipairs(players) do print(player.id, player.name, player.level) end endJSONB数据类型支持PostgreSQL的JSONB类型非常适合存储游戏中的动态数据-- 创建包含JSONB字段的表 db:query([[ CREATE TABLE game_users ( uid BIGINT PRIMARY KEY, data JSONB ) ]]) -- 存储JSON数据 local player_data { name Alice, level 25, equipment { weapon Sword, armor Plate, accessories {Ring, Necklace} } } db:query( INSERT INTO game_users (uid, data) VALUES ($1, $2), 1001, player_data ) -- 查询JSONB字段 local ok, result db:query( SELECT>local mysql require(moon.db.mysql) -- 连接MySQL local db, err mysql.connect({ host 127.0.0.1, port 3306, user root, password your_password, database game_db, charset utf8mb4 }) if not db then moon.error(MySQL连接失败:, err) return end基本CRUD操作-- 创建游戏物品表 db:query([[ CREATE TABLE IF NOT EXISTS items ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, type VARCHAR(50), price INT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ]]) -- 插入数据 local ok, result db:query( INSERT INTO items (name, type, price) VALUES (?, ?, ?), {Sword, Weapon, 100} ) if ok then print(插入成功ID:, result.insert_id) print(影响行数:, result.affected_rows) end -- 查询数据 local ok, items db:query(SELECT * FROM items WHERE price ?, {50}) if ok then for _, item in ipairs(items) do print(item.id, item.name, item.price) end end 数据库服务最佳实践1. 服务化数据库连接在Moon框架中建议将数据库连接封装为独立的服务-- service/db_service.lua local moon require(moon) local redis require(moon.db.redis) local db_pool {} local config { host moon.env(REDIS_HOST) or 127.0.0.1, port tonumber(moon.env(REDIS_PORT)) or 6379 } -- 初始化连接池 local function init_pool() for i 1, 5 do -- 创建5个连接 local conn, err redis.connect(config) if conn then table.insert(db_pool, conn) else moon.error(Redis连接失败:, err) end end end -- 获取连接 local function get_connection() return table.remove(db_pool) end -- 归还连接 local function return_connection(conn) table.insert(db_pool, conn) end -- 消息处理 moon.dispatch(lua, function(sender, session, cmd, ...) local conn get_connection() if not conn then moon.response(lua, sender, session, {error No available connection}) return end local result {conncmd} return_connection(conn) moon.response(lua, sender, session, result) end) -- 初始化 init_pool()2. 使用内置的数据库服务Moon提供了内置的数据库服务可以直接使用-- 使用Redis服务 local redisd require(redisd) local db_conf { host 127.0.0.1, port 6379, timeout 1000 } -- 创建Redis服务 local redis_db moon.new_service({ unique true, name redis_db, file redisd.lua, threadid 1, -- 独占线程 poolsize 5, -- 连接池大小 opts db_conf }) -- 发送命令 redisd.send(redis_db, SET, player:1:name, Alice) local result redisd.call(redis_db, GET, player:1:name) print(获取结果:, result)3. 错误处理与重试机制local function safe_db_call(db, func_name, ...) local max_retries 3 for attempt 1, max_retries do local ok, result dbfunc_name if ok redis.socket_error then moon.warn(数据库连接错误尝试重连... (尝试次数: .. attempt .. )) db:disconnect() db redis.connect(config) if not db then moon.sleep(1000) -- 等待1秒后重试 end else return ok, result end end return false, 数据库操作失败已达到最大重试次数 end -- 使用安全的数据库调用 local ok, value safe_db_call(db, get, important_key) if ok then print(获取成功:, value) else moon.error(操作失败:, value) end⚡ 性能优化技巧批量操作优化-- 批量插入玩家数据 local function batch_insert_players(players) local queries {} for _, player in ipairs(players) do table.insert(queries, { INSERT INTO players (name, level, gold) VALUES ($1, $2, $3), player.name, player.level, player.gold }) end -- 使用管道批量执行 local results db:pipe(queries) return results end连接池管理-- 连接池实现 local ConnectionPool {} ConnectionPool.__index ConnectionPool function ConnectionPool.new(config, size) local pool setmetatable({ config config, size size or 10, connections {}, available {} }, ConnectionPool) for i 1, pool.size do local conn redis.connect(config) if conn then table.insert(pool.connections, conn) table.insert(pool.available, conn) end end return pool end function ConnectionPool:borrow() if #self.available 0 then return table.remove(self.available) end -- 如果没有可用连接创建新的超出池大小 return redis.connect(self.config) end function ConnectionPool:return_connection(conn) if #self.available self.size then table.insert(self.available, conn) else conn:disconnect() end end 监控与调试数据库性能监控local function monitor_db_performance() moon.timeout(5000, function() -- 每5秒监控一次 -- 监控连接池状态 local pool_status { total #db_pool, available #available_connections, in_use #db_pool - #available_connections } -- 记录到日志 moon.info(数据库连接池状态:, pool_status) -- 继续监控 monitor_db_performance() end) end -- 启动监控 monitor_db_performance() 环境配置建议通过环境变量配置-- 从环境变量读取数据库配置 local db_config { host moon.env(DB_HOST) or 127.0.0.1, port tonumber(moon.env(DB_PORT)) or 5432, user moon.env(DB_USER) or postgres, password moon.env(DB_PASSWORD) or , database moon.env(DB_NAME) or game_db } -- 设置日志级别 moon.env(LOG_LEVEL, 4) -- 1ERROR, 2WARN, 3INFO, 4DEBUG 实战案例游戏排行榜系统让我们通过一个完整的游戏排行榜系统来展示Moon数据库连接的实际应用local moon require(moon) local redis require(moon.db.redis) -- 排行榜服务 local LeaderboardService {} function LeaderboardService:init() self.db redis.connect({ host 127.0.0.1, port 6379 }) -- 初始化排行榜 self.db:del(leaderboard:global) end function LeaderboardService:update_score(player_id, score) self.db:zadd(leaderboard:global, score, player_id) end function LeaderboardService:get_rank(player_id) return self.db:zrevrank(leaderboard:global, player_id) end function LeaderboardService:get_top_n(n) return self.db:zrevrange(leaderboard:global, 0, n-1, WITHSCORES) end function LeaderboardService:get_player_score(player_id) return self.db:zscore(leaderboard:global, player_id) end -- 消息处理 moon.dispatch(lua, function(sender, session, cmd, ...) local func LeaderboardService[cmd] if func then local result {func(LeaderboardService, ...)} moon.response(lua, sender, session, result) else moon.response(lua, sender, session, {false, Unknown command: .. cmd}) end end) -- 初始化服务 LeaderboardService:init() 总结通过本教程您已经掌握了在Moon框架中连接和使用各种数据库的核心技巧。Moon的数据库驱动提供了异步非阻塞充分利用Actor模型的并发优势完整协议支持支持Redis、PostgreSQL、MySQL等主流数据库高性能连接池内置连接池管理减少连接开销错误恢复机制自动重连和错误处理服务化架构可以将数据库操作封装为独立的服务在实际游戏服务器开发中合理使用这些数据库连接技术可以显著提升服务器的性能和稳定性。记得根据具体的业务场景选择合适的数据库类型并遵循最佳实践来设计数据访问层。现在就开始在您的Moon项目中实践这些数据库连接技术构建高性能的游戏服务器吧【免费下载链接】moonA lightweight game server framework implemented with Actor Model项目地址: https://gitcode.com/gh_mirrors/moon1/moon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考