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

redis cluster发布后我们项目中使用了cluster,使用驱动是jedis,但是在压力测试过程中发现有一定数量的redis访问非常缓慢高达几十秒数分钟,经过分析jedis驱动JedisClusterInfoCache中加锁造成

private Map<String, JedisPool> nodes = new HashMap<String, JedisPool>();
  private Map<Integer, JedisPool> slots = new HashMap<Integer, JedisPool>();

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<String, JedisPool> nodes = new ConcurrentHashMap<String, JedisPool>();
 private Map<Integer, JedisPool> slots = new ConcurrentHashMap<Integer, JedisPool>();

去除锁

public JedisPool getNode(String nodeKey) {
    return nodes.get(nodeKey);
  }

public JedisPool getSlotPool(int slot) {
    return slots.get(slot);
  }

测试后比较处理比较平稳,未出现某一个访问耗时非常长得的情况。

时间: 2024-10-19 09:59:16

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

解决Redis Cluster模式下的排序问题

通常的redis排序我们可以这么做: 比如按商品价格排序:sort goods_id_set by p_*_price 这样在非集群模式下是没问题的,但如果在集群模式下,就会报错: 说是在集群模式下不能用sort的by子句,因为在集群模式下,上面的p_*_price匹配的key可能分布在不同的节点的slot中,所以无法做到排序. 那怎么办咧?别急,办法还是有的,我们就用 SortedSet 怎么用呢?很简单,看代码: 我们先添加几个商品,并赋上价格 zadd goods_prices 10 1

高可用Redis(十二):Redis Cluster

Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的QPS,而主从复制中单机的QPS可能无法满足业务需求 3.数据量的考虑,现有服务器内存不能满足业务数据的需要时,单纯向服务器添加内存不能达到要求,此时需要考虑分布式需求,把数据分布到不同服务器上 4.网络流量需求:业务的流量已经超过服务器的网卡的上限值,可以考虑使用分布式来进行分流 5.离线计算,需

纯手动创建Redis Cluster集群,最原始的三主三从创建方法

Cluster集群Redis Cluster是官方提供的高可用方案,一个去中心化的Redis集群方案,所有的Redis节点彼此间互联(PING-PONG机制),客户端直连任意节点即可连接到Cluster集群,无需haproxy中间件.总结:1. 去中心化,分片存储,把所有的物理节点映射到[0-16383]共16384个slot(槽位)上,并不一定平均分配.2. Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 1

Redis Cluster 4.0高可用集群安装、在线迁移操作记录

之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑到是线上生产环境,决定在线迁移,迁移过程,不中断服务.操作过程如下: 一.机器环境 1 2 3 4 5 6 7 8 9 10 11 12 13 迁移前机器环境 ----------------------------------------------------------------------

Redis Cluster搭建高可用Redis服务器集群

原文:Redis Cluster搭建高可用Redis服务器集群 一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节点,当遇到单机内存.并发等瓶颈时,可以采用分布式方案要解决问题. 二.集群原理 Redis Cluster架构图 Redis Cluster集群采用了P2P的模式,完全去中心化,Redis把所有的Key分成了16384个slot,每个R

高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题

别人用手机刷新闻.刷段子,你用手机刷知识.你会的越多,成功率就越高. 本篇分享大型网站高并发架构设计是如何解决Redis雪崩.穿透.并发等5大难题的,以下,enjoy~ 缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 比如一个雪崩的简单过程: 1.redis集群大面积故障 2.缓存失效,但依然大量请求访问缓存服务redis 3.redis大量失效后,大量请求转向到mysql数据库 4.mysql的调用量暴增,很

redis专题之redis cluster高可用集群

1.redis cluster集群是什么? redis cluster集群是一个由多个主从节点群组成的分布式服务器群,它具有复制.高可用和分片特性.Redis cluster集群不需要sentinel哨兵也能完成节点移除和故障转移的功能. 需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到1000节点. redis cluster集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单 2.redis cluster集群搭建 redis clu

redis cluster jedis client 示例

redis cluster 基本的redis操作示例: JedisCluster jc = null;     @Before     public void before(){         Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();         //Jedis Cluster will attempt to discover cluster nodes automatically    

第十一课——codis-server的高可用,对比codis和redis cluster的优缺点

[作业描述] 1.配置codis-ha 2.总结对比codis的集群方式和redis的cluster集群的优缺点 ================================================================================= 一.codis-ha的部署配置 ##codis-ha要独立于codis集群,单独配置,也是基于go环境的 1.go方式下载codis-ha: go get github.com/ngaut/codis-ha 2.进入cod