20180705-关于行军队列的解决方法

前天提到了对于行军队列的需求,简约一下,对于队列,并不需要时刻将变化都持久化存储下来,因为这些都是内存中计算的数据,需要常驻内存,而需要做的,是在服务器关机或者宕机的时候,将内存中的行军队列加载到某种持久化存储,在服务器启动时,再从此持久化存储部分加载到内存中。


对于持久化存储部分,我之前考虑过redis和mongo,memcached的内存管理不适合存储这样的value值,memcache适用的场景是小容量的缓存机制。接下来redis也被排除,虽然redis的string类型的值最大是500M足可以满足需求但在将内存中的行军队列存储进redis时,redis的内存占用会快速激增,在超出配置中的最大内存时,会导致根据配置策略对k进行清理。即使在不超出最大配置的内存,但却逼近物理机的内存上限时,redis将会进行持久化存储用于压缩内存,有aof和rof两种方式,这两种方式都是使用copy-on-write的方式开辟新的进程进行处理,但是注意下这个时刻,redis使用了系统的磁盘缓存,而不是像mysql那样自己创建磁盘缓存自己来管理,当逼近内存上限时,会引发磁盘缓存的不足,从而引发内存和磁盘的数据交换来保证内存的可用,这会导致系统抖动。


至于排除mysql的原因,是因为这个数据库是基于严格的关系型和强事物的,每一次对数据的操作都会将是否成功返回给调用方。相比mongo,这是有性能损失的,mongo使用了内存换时间的通用做法,先将数据写入内存,然后在某一时候写入磁盘。

这里有篇文章对mongo和mysql进行了对比 https://blog.csdn.net/clh604/article/details/19608869

猜你喜欢

转载自blog.csdn.net/adofsauron/article/details/80931171