memcache加速网页游戏

0

Memcache是一种高速的内存对象缓存系统,它能够显著提高web应用的性能,包括网页游戏。在网页游戏中,大量的数据可能需要频繁地从数据库中读取,如用户信息、游戏数据、角色状态等。这些数据如果每次都从数据库读取,会增加服务器的负载和响应时间,影响用户体验。

使用Memcache,可以将这些热点数据(如最近访问过的用户信息,游戏物品库存等)缓存到内存中,当需要时直接从内存中读取,避免了对数据库的频繁访问。这样可以大大提高数据读取速度,减少服务器负载,提升游戏的响应速度。此外,Memcache还支持分布式,可以部署在多台服务器上,提供更高的可用性和可扩展性。

然而,需要注意的是,Memcache并不适合存储大量的、经常变化的数据,因为它的目的是为了减少对数据库的访问,而不是替代数据库。同时,如果缓存的数据量过大,可能会导致内存溢出。因此,合理地设计缓存策略和数据结构是非常重要的。

网站的基本结构,之前提到过了:浏览器发请求,后台程序处理(往往还有连接数据库取数),返回响应数据。当访问量很大时,或者重数据库取数耗费时间多的时候,我们可以考虑把固定的数据存储在内存中,这样不用重新连接数据库执行查询命令,效率会快很多。我这里的一种方案是使用redis与memcache实现缓存机制,其中redis实现用户名密码等信息存储,memcache用于其他数据缓存。

memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)

memcache加速网页游戏

相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储,但没有采用一致性哈希。最新版本的Redis已经支持了分布式存储功能。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能。为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点。在Redis Cluster中,每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中哪个变态手游盒子可以玩命运战歌,任意两个节点的宕机都不会导致数据的不可用。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。

Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储,当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。

Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除。

当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图 所示,将100个字节的数据缓存到128个字节的Chunk中,剩余的28个字节就浪费掉了。

对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率;最后作为系统调用,其系统开销远远大于一般函数调用。所以,为了提高内存的管理效率,高效的内存管理方案都不会直接使用malloc/free调用。Redis和Memcached均使用了自身设计的内存管理机制,但是实现方法存在很大的差异,下面将会对两者的内存管理机制分别进行介绍。

Redis和Memcached都是将数据存放在内存中,都是内存数据库。不过memcached还可用于缓存其他东西,例如图片、视频等等。memcached把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;redis有部分存在硬盘上,这样能保证数据的持久性,支持数据的持久化(RDB、AOF),而Memcached不支持持久化。同时Redis并不是所有的数据都一直存储在内存中的,当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘,但memcached超过内存比例会抹掉前面的数据。

Redis相比Memcached来说,拥有更多的数据结构并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去,序列化再反序列化,这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据时,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

Memcache时一个内存对象缓存系统,用于加速动态web应用程序,减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络I/O。

春节后面试,很多面试官都会问的一个问题:redis跟memcache之间的一些区别?所以今天整理了下这方面内容,也是做个备忘!

Memcache可扩展考察的内容有很多,由于整理的篇幅内容很多,在此只是罗列了普遍遇到的Memcache相关的知识考点。额外的考点还有:(1)Memcache的工作流程是什么样的?

如果使用memcached作为Session存储老三国网页版游戏攻略武将,要确保memcached的服务正常工作,否则Session相关功能将不起作用,这样PHP的处理就多了一层外面的依赖。因为memcached是使用内存的,这样当用户量比较大时,就可能由于内存方面原因导致Session时长上的问题,Session的实际失效时长达不到设定的失效时长(由memcached在内存不够时的处理机制决定)。

如果想使用udp支持,需要确保你的memcached服务器启用,也确保Web服务器连接到memcache服务器端口正常。重新启动Apache后,将开始使用的memcache存储PHP的Session。 测试案例:

默认状态下,PHP使用文件方式做Session存储,磁盘的I/O性能肯定没有内存中存取快,因此改用memcache来存储Session在读写速度上会快很多,而且在多台服务器集群时,使用memcahced能够有效地解决Session共享的问题。 我们配置好memcached服务器后,修改php.ini配置文件的代码:

Memcache将内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)。page是分配给slab的内存空间,默认是1MB,根据slab大小切分成chunk,chunk是用户缓存记录的内存空间,slab class是特定chunk的组。 在存储数据时,Memcache会压缩数据的大小进行存储,一般压缩后的数据为原数据大小的30%左右,从而节省了70%的传输性能消耗。如果存储的数是小于100字节的键值对,那么压缩后可能带来膨胀,但Memcache都是按照固定大小分块存储的,最小也有88B,所以小数据带来的压缩膨胀也并不会有什么影响。 具体流程如下图所示。

(2)单进程最大的使用内存为2GB,需要更多内存时可开多个端口。 (3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。

LRU:最近最少使用算法;当同一个slab的格子满了,这时需要新加一个值时,不会考虑将这个新数据放到比当前slat更大的空闲slab,而是使用LRU移除旧数据,放入这个新数据。

专题: 单机游戏三国草   单机三国传游戏   梦三国单机游戏