使用缓存来解决性能问题
摘抄
网站数据访问通常遵循二八定律, 即80%的访问落在20%的数据上, 因此利用 Hash 表和内存的高速访问特性, 将20%的数据缓存起来。
不要将频繁修改的数据放到缓存中
遵守二八定律, 将80%的请求访问的数据放到缓存中
数据不一致与脏读
一般会对缓存的数据设置失效时间, 一旦超过失效时间, 就要从数据库中重新加载。因此应用要容忍一定时间的数据不一致, 如卖家已经编辑了商品属性, 但是需要过一段时间才能被买家看到。
缓存可用性
当缓存服务器崩溃时, 数据库会因为完全不能承受如此大的压力而宕机, 进而导致整个网站不可用。这种情况被称作缓存雪崩。
解决方案是, 通过分布式缓存服务器集群, 将缓存数据库分布到多台服务器上, 当一台缓存服务器宕机的时候, 只有部分缓存数据丢失, 重新从数据库中加载这部分数据不会对数据库产生很大影响。
分布式缓存架构
两种架构方式:
一种以 JBoss Cache 为代表的需要更新同步的分布式缓存, 一种是以 Memcached 为代表的不互相通信的分布式缓存。
JBoss Cache 的分布式缓存在集群中所有服务器中保存相同的缓存数据, 当某台服务器有缓存数据更新的时候, 会通知其他服务器更新缓存数据。这种方案更多见于企业应用系统中, 很少在大型网站上使用。。
Memcached 采用集中式缓存集群管理, 应用程序通过一致性 Hash 等路由算法选择缓存服务器远程访问缓存数据, 缓存服务器之间不通信。
Memcached 服务端通信模块基于 Libevent, 一个支持事件触发的网络通信程序库。
Memcached 的内存管理采用了固定空间分配的方式, Memcached 将内存空间分为一组 slab, 每个 slab 包含一组 chunk, 每个 chunk 的大小是固定的, 拥有相同大小 chunk 的 slab 被组织在一起, 叫做 slab class, 存储数据时根据数据的 size 大小, 寻找一个大于 size 的最小 chunk 将数据写入。
思考
这里可以去了解一下 Libevent,