`

codis和jedis性能比较

 
阅读更多
一. 原理:
1. Jedis是redis的java版本的客户端实现。
1.1 以下是jedis代码测试,使用了两个redis服务:

public class RedisShardPoolTest {   
    static ShardedJedisPool pool;//切片连接池
    static{
        JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置
        config.setMaxActive(300);//最大活动的对象个数
        config.setMaxIdle(1000 * 60);//对象最大空闲时间
        config.setMaxWait(1000 * 10);//获取对象时最大等待时间
        config.setTestOnBorrow(true);//;如果为true,则得到的jedis实例均是可用的;
        String hostA = "127.0.0.1";//服务器地址
        int portA = 6379;//redis端口号
        String hostB = "127.0.0.1";
        int portB = 6378;
        List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(2);
        JedisShardInfo infoA = new JedisShardInfo(hostA, portA);
        JedisShardInfo infoB = new JedisShardInfo(hostB, portB);
        jdsInfoList.add(infoA);
        jdsInfoList.add(infoB);
        pool =new ShardedJedisPool(config, jdsInfoList);
     }
    public static void main(String[] args) {
        long s1=System.currentTimeMillis();        
        Map<String, String> map=new HashMap<String, String>();
        for(int i=0; i<1000; i++){
              ShardedJedis jds = null;//切片客户端连接
              jds = pool.getResource();
            try {               
                map.put("s"+i, "s"+i);
                jds.hmset("s"+i, map);               
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                pool.returnResource(jds);
            }
        }
        long s2=System.currentTimeMillis();
        System.out.println(testTime(s2-s1));        
    }   
    public static String testTime(long ss){
        String aa=null;
        long zongmiaoshu = ss / 1000;
        long dangqianmiaoshu = zongmiaoshu % 60;
        long zongfenshu = zongmiaoshu /60;
        long dangqianfenshu = zongfenshu % 60;
        long zongshishu = zongfenshu / 60;
        long dangqianshishu = zongshishu % 24;    
        aa="当前时间:" + dangqianshishu + ":" + dangqianfenshu + ":" + dangqianmiaoshu;    
        return aa;            
    }
}


Codis 是一个分布式 Redis 解决方案,对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 ,上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
下图可以看到redis客户端连接是是codis的代理。代理连接很多的分组,一个组包括一个master和0到多个slave。



2.1 codis代码测试:先配置codis,codis的安装配置就不讲了,我测试在集成在spring中了。
spring中的配置:

<bean id="ehcacheService" class="net.okdi.core.common.redis.RedisServiceImpl"/>
    <context:property-placeholder location="classpath:/redis.properties"
    ignore-unresolvable="true" />
    <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxActive" value="${redis_max_active}"></property>
        <property name="maxIdle" value="${redis_max_idle}"></property>
        <property name="maxWait" value="${redis_max_wait}"></property>
        <property name="testOnBorrow" value="${redis_test_on_borrow}"></property>
    </bean>
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis_addr}"></property>
        <property name="port" value="${redis_port}"></property>
        <property name="password" value="${redis_auth}"></property>
        <property name="poolConfig" ref="jedisConfig"></property>
    </bean>
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can't cast to String!!!
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
    </bean>  


redis配置文件:

redis_addr=192.168.31.204
redis_port=19000 (codis代理服务器端口)
redis_auth=okdi
redis_max_active=1024
redis_max_idle=200
redis_max_wait=10000
redis_timeout=10000
redis_test_on_borrow=true


封装的redis方法,用的是redisTemplate:

public class RedisServiceImpl implements EhcacheService {

    private static Logger logger = Logger.getLogger(EhcacheServiceImpl.class);

    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private RedisConstant redisConstant;

    @Override
    public void put(String cacheName, String key, String value) {
//        boolean bool = redisTemplate.hasKey(cacheName);
        if (cacheName==null || "".equals(cacheName) || key==null || "".equals(key)) {
            return;
        }
        //放入redis
        redisTemplate.opsForHash().put(cacheName, key, value);

        long expireTime = redisConstant.getExpireTime(cacheName);
        //如果不等于-1,则该cacheName配置有过期时间
        if(expireTime != -1){
            redisTemplate.expire(cacheName, expireTime, TimeUnit.SECONDS);
        }
    }

    @Override
    public void put(String cacheName, String key, Object value) {
        if (cacheName==null || "".equals(cacheName) || key==null || "".equals(key)) {
            return;
        }
        //放入redis
        redisTemplate.opsForHash().put(cacheName, key, JSON.toJSONString(value));

        long expireTime = redisConstant.getExpireTime(cacheName);
        //如果不等于-1,则该cacheName配置有过期时间
        if(expireTime != -1){
            redisTemplate.expire(cacheName, expireTime, TimeUnit.SECONDS);
        }
    }

}


用junit测试:
public class test11 extends BaseTest{

    @Autowired
    private EhcacheService redisService;    
    @SuppressWarnings("rawtypes")
    @Test
    public void test1(){    
        long s1=System.currentTimeMillis();

        for(int i=0;i<10000;i++){
            redisService.put("a"+i, "a"+i,"a"+i);
            redisService.remove("a"+i, "a"+i);
        }
        long s2=System.currentTimeMillis();
        System.out.println(testTime(s2-s1));
        System.out.println(redisService.getValueByKey("eeee9", "e9"));
    }


二. 性能对比
两者的性能比较,如下图:


三. 动态扩容
1. codis动态扩容
下图是整个codis的界面


转自:http://blog.csdn.net/dayibagou/article/details/43937039
分享到:
评论

相关推荐

    codis数据迁移性能优化

    ### Codis数据迁移性能优化 #### 什么是Codis? Codis是一个分布式缓存系统,它主要基于Redis构建,旨在提供高性能、高可用性的缓存服务。Codis通过将多个Redis实例组织成一个集群来实现这一目标,使得应用程序...

    codis性能测试

    总结起来,"codis性能测试"项目着重于评估CODIS在高并发环境下的性能,包括多线程入库的效率和随机查询的响应速度。测试过程中,需关注资源利用率的平衡,以实现系统性能的最大化。通过这样的测试,我们可以发现并...

    大牛总结codis-cluster集群部署实战手册

    美团和阿里巴巴等大型企业已经在生产环境中成功应用了Codis 3.0的集群功能,这足以证明其稳定性和性能。 Codis的设计理念是将数据库的管理和业务逻辑分离,通过Proxy层透明地对客户端提供服务,使得业务方无需关心...

    Codis3.1集群搭建文档

    Codis 是一个分布式的Redis解决方案,由Go语言编写,可以水平扩展,提供高性能和高可用性的Redis服务。下面是Codis3.1集群搭建的详细步骤和相关知识点: 一、Codis集群架构 Codis集群架构主要包括四个组件:Codis ...

    redis-codis集群

    它主要解决了单个Redis实例在处理大规模数据和高并发请求时的性能瓶颈问题。通过Codis,你可以将多个Redis实例组合成一个逻辑上的集群,实现数据的自动分片、故障转移以及平滑扩容。 **Redis基础知识** Redis是一个...

    Go-Codis是用Go编写基于代理的高性能Redis集群解决方案

    **Go-Codis:高性能Redis集群的Go语言实现** Go-Codis是一个使用Go语言编写的高性能、基于代理的Redis集群解决方案。它旨在提供一种灵活且可扩展的方式,以处理大规模的数据存储和检索需求,特别是在那些对数据一致...

    codis测试环境搭建

    需要注意的是,实际生产环境中,为了提高可用性和性能,通常会部署多个 Codis-Proxy 和 Codis-Redis 节点,并使用 keepalived 或其他方式实现负载均衡和故障切换。同时,根据业务需求,可能还需要对 Codis 进行扩容...

    Codis使用入门

    在文件中,可能分析了各种方案的优缺点,如数据一致性、容错能力、操作复杂度和性能等方面,帮助读者更好地理解为什么选择Codis。 现在,让我们详细了解一下Codis的核心特点和使用方法: 1. **分片策略**:Codis...

    Codis ansiable playbook 一键部署

    Codis Ansible Playbook 是一个自动化部署工具,用于简化 Codis 的集群安装和管理过程。Codis 是一个分布式 Redis 解决方案,它允许你水平扩展 Redis 集群,提高数据存储和处理能力。Ansible 是一个强大的 IT 自动化...

    codis-3.2.2.zip

    在3.2.2这个版本中,Codis提供了稳定性和性能上的优化,使得它成为大规模Redis集群的可靠选择。下面我们将深入探讨Codis的设计原理、功能特点以及3.2.2版本中的关键改进。 1. Codis设计原理: Codis采用了Proxy...

    Redis 集群解决方案 Codis.zip

    Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的...

    Go-codis-3.2.2源码分析

    Codis是开源的、基于代理的高性能Redis集群解决方案,由淘宝内部开发并维护,主要用于解决单个Redis实例内存不足或者为了提高服务的可用性和扩展性而引入的分布式解决方案。 Codis采用Go语言编写,这使得它在性能...

    codis安装文档以及安装包

    **CODIS 安装详解** CODIS(Cluster Of Distributed Internet Services)是阿里巴巴开源的一个分布式数据库中间件,...记得在实际操作过程中,根据自己的服务器配置和业务需求调整相关参数,确保系统的稳定性和性能。

    codis3.2.0-go1.7.5-linux.tar.gz安装包

    CODIS(Cluster Of Distributed Internet Services)是阿里巴巴开源的一款分布式Redis解决方案,主要针对单机Redis在大规模数据场景下存储和访问性能的局限性。CODIS通过代理层实现了对多个Redis实例的透明化管理,...

    codis-release3.1.zip

    4. **Dashboard管理**:CODIS Dashboard提供了直观的Web界面,用户可以通过它查看集群状态、添加/删除Proxy和Redis实例、执行数据迁移操作、监控性能指标等。这对于日常运维工作非常便利。 5. **数据迁移机制**:...

    codis for pika 二进制包

    **CODIS for PIKA 二进制包详解** CODIS(Cluster Of Distributed Internet Services)是阿里巴巴开源的一个分布式Redis解决方案,它允许用户在不修改...同时,要注意监控集群的性能和健康状态,及时进行维护和优化。

    用Go编写的基于代理的高性能Redis集群解决方案Codis.rar

    2. **高性能Redis集群解决方案**: Codis设计的目标是提供高性能的集群解决方案,通过优化的数据分片策略和智能的流量调度,确保在大规模数据和高并发场景下,系统仍能保持良好的响应速度和吞吐量。 3. **Redis集群...

    Codis集群搭建文档

    ### Codis集群搭建知识点 ...通过以上步骤,可以完成Codis集群的基本搭建,包括Go语言环境配置、Zookeeper集群搭建以及Codis服务的启动和关闭。此外,还应注意监控服务运行状态,并在出现问题时能够及时处理。

    codis/redis 迁移redis cluster工具

    在分布式系统中,Redis和Codis都是常见的缓存解决方案。然而,随着业务的发展,有时我们需要将数据从一个系统迁移到另一个系统,例如从Codis迁移到Redis Cluster,或者反之。为了解决这个问题,特定的迁移工具...

Global site tag (gtag.js) - Google Analytics