这个主要看游戏类型和服务器架构,如果是web类型的游戏,数据大多放在redis和mysql,相对来说是很安全的,即使游戏进程挂了,数据还在其他其他进程中。
如果在mmorpg或其他性能要求比较高的游戏,总是直接操作redis和mysql,性能肯定是接受不了的,数据大多时候都保存在游戏进程中。万一游戏挂了,如何保障游戏的数据安全呢?
可以把玩家的数据创建在共享内存中,游戏进程可以读写,数据持久化进程负责读,然后更新到redis或者mysql等中。
这其中就有个数据同步的问题,必然要加锁。
对于锁还有些问题需要思考:
a进程获得了锁,但是出了意外:
1. a进程挂了,b进程可能获得锁,a退出的时候会释放锁
2. a进程卡住了,一直不释放锁,b永远等待
所以对共享内存的使用一定要小心。
C++中有个 boost.interprocess 库可以参考。
go里面有一句话是:
不要通过共享内存来通信,而应该通过通信来共享内存。
网友评论