jialiguo 发表于 2018-11-5 09:04:42

解决Redis cluster的jedis驱动在高并发下的拥塞问题

  redis cluster发布后我们项目中使用了cluster,使用驱动是jedis,但是在压力测试过程中发现有一定数量的redis访问非常缓慢高达几十秒数分钟,经过分析jedis驱动JedisClusterInfoCache中加锁造成
  private Map nodes = new HashMap();
  private Map slots = new HashMap();
  public JedisPool getNode(String nodeKey) {
  r.lock();
  try {
  return nodes.get(nodeKey);
  } finally {
  r.unlock();
  }
  }
  public JedisPool getSlotPool(int slot) {
  r.lock();
  try {
  return slots.get(slot);
  } finally {
  r.unlock();
  }
  }
  将map替换成ConcurrentHashMap
  private Map nodes = new ConcurrentHashMap();
  private Map slots = new ConcurrentHashMap();
  去除锁
  public JedisPool getNode(String nodeKey) {
  return nodes.get(nodeKey);
  }
  public JedisPool getSlotPool(int slot) {
  return slots.get(slot);
  }
  测试后比较处理比较平稳,未出现某一个访问耗时非常长得的情况。
  另外2.8版本的驱动刷新也偶尔会出问题,需要在刷新中加入判断,如果在更新则跳过更新动作;否则会导致卡顿,很难恢复。
  以上问题在2.9版本的驱动中已经解决;可以更新2.9版本驱动来解决问题;无需修改源代码

页: [1]
查看完整版本: 解决Redis cluster的jedis驱动在高并发下的拥塞问题