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。

[img]https://img-blog.csdn.net/20150225142523301[/img]

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"));
}


二. 性能对比
两者的性能比较,如下图:
[img]https://img-blog.csdn.net/20150225174641279[/img]

三. 动态扩容
1. codis动态扩容
下图是整个codis的界面
[img]https://img-blog.csdn.net/20150225175821114[/img]

转自:http://blog.csdn.net/dayibagou/article/details/43937039
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值