设为首页 收藏本站
查看: 1306|回复: 0

[经验分享] redis之初探

[复制链接]

尚未签到

发表于 2016-12-18 10:06:32 | 显示全部楼层 |阅读模式
    之前nosql群里的哥们对redis讨论的挺热闹,今天我也着手试了吧,主要测试2个方面(只是简单测试了下,主要针对jedis java客户端,jedis已实现了consistent hash算法)
 

1:在多节点下,数据的分布均匀情况如何
2:在多节点下,删除可增加节点后,对原有数据的映射关系,及命中情况如何
本机上启动3个节点(637963806381
第一:测试数据分布测试情况:
3个节点下,插入10000条数据情况,数据分布还是挺理想的

节点数据量分布率

6379 node


3365


33.65%


6380 node


3243


32.43%


6381 node


3392


33.92%

 
第二:测试增删节点后,对原有数据的影响
 
 
a:首先本机的3个节点(6379、6380、6381),插入10条数据(数据少,分布的还是不均匀的),数据的分布情况为:
 

key:0 put in :127.0.0.1:6380
key:1 put in :127.0.0.1:6380
key:2 put in :127.0.0.1:6381
key:3 put in :127.0.0.1:6381
key:4 put in :127.0.0.1:6380
key:5 put in :127.0.0.1:6381
key:6 put in :127.0.0.1:6379
key:7 put in :127.0.0.1:6380
key:8 put in :127.0.0.1:6381
key:9 put in :127.0.0.1:6379
b:再把6381节点服务停掉,代码里面不修改节点配置,发现该正确hitkey还是能正确hit到自己的节点(此时后台会抛连接redis异常)
 

key:0 from :127.0.0.1:6380->0
key:1 from :127.0.0.1:6380->1
key:2 from :127.0.0.1:6381->null
key:3 from :127.0.0.1:6381->null
key:4 from :127.0.0.1:6380->4
key:5 from :127.0.0.1:6381->null
key:6 from :127.0.0.1:6379->6
key:7 from :127.0.0.1:6380->7
key:8 from :127.0.0.1:6381->null
key:9 from :127.0.0.1:6379->9
c:再启动6381这个节点服务,代码里面的配置remove6381,然后重新get所有的key,可以看到该正确hitkey也还是能正确hit到自己的节点
 
 

key:0 from :127.0.0.1:6380->0
key:1 from :127.0.0.1:6380->1
key:2 from :127.0.0.1:6380->null
key:3 from :127.0.0.1:6380->null
key:4 from :127.0.0.1:6380->4
key:5 from :127.0.0.1:6380->null
key:6 from :127.0.0.1:6379->6
key:7 from :127.0.0.1:6380->7
key:8 from :127.0.0.1:6380->null
key:9 from :127.0.0.1:6379->9
 
其实以上测试已经说明了,jedis客服端在移除或者添加一个cache节点,不影响原有数据的映射关系,这也是一致性hash算法的原理。就这么测这么点,自己玩玩而已,至于性能如何,官方说的挺不错的,大家可以自己去看看...整一个新的分布式缓存我觉得这些必要的测试还是需要的,下面把测试代码发出来,写的很简单,就2个类:
 
 

import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.util.Hashing;
import redis.clients.util.Sharded;
/**
*
* @Title: RedisResourcePool.java
* @Copyright: Copyright (c) 2005
* @Description: <br> <br>
* @Company: hd
* @Created on May 4, 2012 3:05:44 PM
* @author <a href="mailTo:tangzhibin@*.com">tangzhibin</a>
*/
public class RedisResourcePool {
/**ShardedJedisPool底层实现了commons.pool中的GenericObjectPool对象池,it's thread-safety*/
private ShardedJedisPool shareRedisPool;
void initRedisPool(){
JedisPoolConfig configs=new JedisPoolConfig();
/**对象池中最大活动的对象个数*/
configs.setMaxActive(200);
/**对象的最大空闲时间*/
configs.setMaxIdle(60*1000);
/**客户端获取对象时,如果池中没有空闲的对象(已达MaxActive),则会等待MaxWait时间,在此时间内,如果还没有空闲的对象返回,则抛出异常*/
configs.setMaxWait(5*1000);
/**设置host port等配置*/
String []hostPorts={"127.0.0.1:6379","127.0.0.1:6380","127.0.0.1:6381"};
//String []hostPorts={"127.0.0.1:6379","127.0.0.1:6380"};
List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(hostPorts.length);
for(int i=0;i<hostPorts.length;i++){
String hostPort=hostPorts;
String[] host_port=hostPort.split(":");
String host=host_port[0];
/**注意port一定要转为int类型(不能为String),否则JedisShardInfod初始化时, 会将该String作为节点name名称,而把默认的6379作为端口号*/
int port=Integer.parseInt(host_port[1]);
JedisShardInfo jedisShardInfo=new JedisShardInfo(host,port);
jdsInfoList.add(jedisShardInfo);
}
/**初始化redis池*/
this.shareRedisPool = new ShardedJedisPool(configs, jdsInfoList,
Hashing.MURMUR_HASH, Sharded.DEFAULT_KEY_TAG_PATTERN);
}
private RedisResourcePool(){
initRedisPool();
}
static class RedisResourcePoolIniter{
private static final RedisResourcePool redisResourcePool=new RedisResourcePool();
private static RedisResourcePool getRedisResourcePool(){
return redisResourcePool;
}
}
public ShardedJedis getRedisCacheResource(){
return shareRedisPool.getResource();
}
public void restoreRedisCacheResource(ShardedJedis resource){
if(shareRedisPool!=null && resource!=null){
shareRedisPool.returnResource(resource);
}
}
public static RedisResourcePool getRedisResourcePool(){
return RedisResourcePoolIniter.getRedisResourcePool();
}
}

测试的main函数在此类中

import redis.clients.jedis.Client;
import redis.clients.jedis.ShardedJedis;
/**
*
* @Title: RedisManager.java
* @Copyright: Copyright (c) 2005
* @Description: <br> <br>
* @Company: hd
* @Created on May 4, 2012 3:05:44 PM
* @author <a href="mailTo:tangzhibin">tangzhibin</a>
*/
public class RedisManager {
private RedisResourcePool redisResourcePool=RedisResourcePool.getRedisResourcePool();
private RedisManager(){}
private static class RedisManagerIniter{
private static final RedisManager redisManager=new RedisManager();
private static RedisManager getRedisManager(){
return redisManager;
}
}
public static RedisManager getRedisManager(){
return RedisManagerIniter.getRedisManager();
}

public String set(String key,String value){
ShardedJedis resource=null;
try{
resource=redisResourcePool.getRedisCacheResource();
Client cli=resource.getShard(key).getClient();
return resource.set(key, value);
}finally{
redisResourcePool.restoreRedisCacheResource(resource);
}
}
public Object get(String key){
ShardedJedis resource=null;
try{
resource=redisResourcePool.getRedisCacheResource();
Client cli=resource.getShard(key).getClient();
System.out.println("key:"+key+" from :"+cli.getHost()+":"+cli.getPort());
return resource.get(key);
}catch(Exception ex){
ex.printStackTrace();
return null;
}finally{
redisResourcePool.restoreRedisCacheResource(resource);
}
}

public static void main(String[] args){
RedisManager rm=RedisManager.getRedisManager();
//set
for(int i=0;i<10000;i++){
rm.set(String.valueOf(i),String.valueOf(i));
}
////get
//for(int i=0;i<10;i++){
//System.out.println(rm.get(String.valueOf(i)));
//}
//
}
}

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315879-1-1.html 上篇帖子: Redis 安装及配置 (转整理) 下篇帖子: 6月21 redis介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表