最近在开发的时候,由于对用户体验要求较高,要是每次都去通过db加载数据的话,不但速度慢而且当访问量大的时候还容易造成db数据库down机,所以考虑使用memcache进行开发。
在memcache开发过程中,遇到一些问题:
在本地完成代码测试一个鼠标hover上去然后去服务器拿一个400B的数据的时候,只需要大约16ms的时间就可以完成,当时感觉这个速度好快呀,基本不会影响用户体验的。但是布置到线上之后,同样的一个鼠标hover上去请求一个400B的数据,却需要60~90ms的时间,偶很不能理解,不知道为什么出现这个问题。
后来做了一个测试,是把一个135K的数组分别保存到三台不同服务器以及使用apc本机缓存的测试,以下是每次进行100次的读写操作的平均时间:
(单位为ms)
127.0.0.1memcache | 192.168.1.31远程memcache | 192.168.1.32远程memcache | apc | |
第一个100次操作的平均值 | 9.5 | 149.6 | 139.2 | 53.1 |
第二个100次操作的平均值 | 10.1 | 158.1 | 138.9 | 54.2 |
第三个100次操作的平均值 | 9.5 | 154.9 | 139.6 | 52.8 |
第四个100次操作的平均值 | 9.6 | 163.5 | 137.9 | 53.2 |
第五个100次操作的平均值 | 9.6 | 156.7 | 135.4 | 53.4 |
第六个100次操作的平均值 | 9.6 | 148.9 | 138.8 | 54 |
第七个100次操作的平均值 | 9.6 | 145.6 | 136.6 | 52.8 |
第八个100次操作的平均值 | 9.6 | 139.7 | 137.3 | 52.9 |
第九个100次操作的平均值 | 9.7 | 168.5 | 140 | 53.5 |
第十个100次操作的平均值 | 9.7 | 168.3 | 139.2 | 52.9 |
10000次操作的平均值 | 9.65 | 155.38 | 138.29 | 53.28 |
通过以上的数据可以看出,在本机环境下的时候(127.0.0.1),memcache的性能远远高于apc的性能,提高性能大约400%;但是在使用远程的memcache的时候(在内网环境),memcache的性能比(127.0.0.1)的性能降低了大约13~15倍之多,比使用apc的性能也降低了3倍之多。
因为在(127.0.0.1)以及(192.168.1.31)、(192.168.1.32)上面安装的memcache是相同的版本并且所有的配置都是相同的,memcache的协议也相同,memcache的内存管理机制也是相同,数据缓存删除机制也都是使用的Least Recently Used(LRU)最近最少使用原则,性能差别如此之大,肯定不会因为配置、协议以及memcache使用的机制的原因,究竟为什么出现这个问题呢?
通过查阅相关资料知道memcached的客户端使用TCP链接与memcache服务器通讯。一个运行中的memcached服务器监视一些(可设置)端口。客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。 才确认这个问题是出在TCP连接上了。(192.168.202.133和192.168.202.157)host上的memcache比(127.0.0.1)host上的memcache多出来的大约140ms的时间就是花费在了发送命令到memcache服务器,等待服务器返回上了,要是需要去解决这个问题,唯有去优化app主机和memcache主机之间的网络连接,才能对这个140ms的时间去进行优化,也许这就是一些小型项目不推荐使用memcache的原因吧,这也应该就是memcache的一个小小的瓶颈了吧。
如果你的是中小型网站的话,或者网站不是分布式的话,使用apc完全可以满足你的要求了,并且在性能上也完全可以满足要求了;
如果你的是大中型网站的话,或者网站对用户体验性要求比较高并且是高分布式的话,还是使用memcache的比较好一点,并且memcache具有一个apc没有的优势就是方便集群,当数据量增大的时候可以通过添加memcache服务器来增加memcache的容量。