最近集群上有个job,其中需要短时间内频繁访问缓存,大概7亿多次。我这边的缓存是使用redis来做的,问题就来了。
首先,redis中存的是普通kv,没有考虑使用hash等解结构,那么以为着这个job需要访问7亿多次redis,导致效率低,且出现很多redis的read timeout exception.
我采取的一些办法:
1、使用pool来管理连接,并且适当放长timeout的时间,切记在每次使用完连接后放回池中。
2、把不同业务的缓存放到不同的redis实例上,效率有一定增加。
3、这个job访问的缓存有个特点,数据量不大,总共才几十兆,所以决定在每个node上使用map来保存,在reduce初始化阶段就读进去,效率有较大提升。
4、使用redis的pipeline,一次性将所有缓存拉过来,效率非常好。(注意这里需要你获取缓存值之间没有依赖)
此外,我也是用了hadoop的DistributedCache来处理,效果也还过得去,但是我始终对这个方式没好感,最大的体会是不灵活,特别是在有向缓存服务器反设值的时候,此方式无效。