之前我们的电影详情一直采用从redis中读取数据,但QPS一直不高,用了30组redis服务器,采用一致性哈希算法去命中机器去连redis读取结果返回。因为redis取的次数问题及结果过大,一是同一次请求可能多个redisKey,因为key名不同,因此造成要多次一致性hash并且连接多次才能取得结果,通过以下想法跟试验优化了下:
1、将多次Redis查询的数据缓存到一台机器上,只一次读取,提高了一点QPS,但只是从以前的单台八百多到一千出头。
2、优化redis集群的分组,每个主库下挂多个从库,提高了一点
3、redis缓存服务器专门用来读取,只设置一台,不走一致性哈希,走一主N从架构,提高了些
4、缓存一致性哈希结果,每次都要去根据配置文件去计算一致性哈希生成哈希环,然后通过key去查找命中,通过文件将一致性哈希的结果缓存起来,其中遇到了不少坑,包括unserialize的文件大于200K之后解不出来。生成哈希环的过程中恰好一台服务器碰到并发比较高造成文件多次写入无法json_decode情况。最后通过Yac跟一次写入的方式解决了这个问题
5、将缓存结果直接存文件,通过文件的创建时间判断是否过期。
最后发现存文件比读redis缓存的qps高上很多很多,8核16G的标配服务器通过AB压测得到的结果从之前的六百多到了现在的两千五百多,提高了很多。