星空网 > 软件开发 > Java

Jedis下的ShardedJedis(分布式)使用方法(一)

原来项目中有用到Redis用作缓存服务,刚开始时只用一台Redis就能够满足服务,随着项目的慢慢进行,发现一台满足不了现有的项目需求,因为Redis操作都是原子性这样的特性,造成有时同时读写缓存造成查询效率的下降。但是由于我们现在用的还是2.X版本,还是没有集群功能的(Redis作者在3.0版本中已经加入了集群功能), 因此只能使用2.x版本中自带的一个叫做ShardedJedis的来实现分布式缓存。

ShardedJedis是通过一致性哈希来实现分布式缓存的,通过一定的策略把不同的key分配到不同的redis server上,达到横向扩展的目的。那么ShardedJedis内部是怎么实现的呢,文章会慢慢讲解。

 

 1.ShardedJedis使用方法

ShardedJedis的使用方法除了配置时有点区别,其他和Jedis基本类似,有一点要注意的是 ShardedJedis不支持多命令操作,像mget、mset、brpop等可以在redis命令后一次性操作多个key的命令,具体包括哪些,大家可以看Jedis下的 MultiKeyCommands 这个类,这里面就包含了所有的多命令操作。很贴心的是,Redis作者已经把这些命令从ShardedJedis过滤掉了,使用时也调用不了这些方法,大家知道下就行了。

好了,现在来看基本的使用

 

  //设置连接池的相关配置    JedisPoolConfig poolConfig = new JedisPoolConfig();    poolConfig.setMaxTotal(2);    poolConfig.setMaxIdle(1);    poolConfig.setMaxWaitMillis(2000);    poolConfig.setTestOnBorrow(false);    poolConfig.setTestOnReturn(false);    //设置Redis信息    String host = "127.0.0.1";    JedisShardInfo shardInfo1 = new JedisShardInfo(host, 6379, 500);    shardInfo1.setPassword("test123");    JedisShardInfo shardInfo2 = new JedisShardInfo(host, 6380, 500);    shardInfo2.setPassword("test123");    JedisShardInfo shardInfo3 = new JedisShardInfo(host, 6381, 500);    shardInfo3.setPassword("test123");    //初始化ShardedJedisPool    List<JedisShardInfo> infoList = Arrays.asList(shardInfo1, shardInfo2, shardInfo3);    ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, infoList);    //进行查询等其他操作    ShardedJedis jedis = null;    try {      jedis = jedisPool.getResource();        jedis.set("test", "test");        jedis.set("test1", "test1");      String test = jedis.get("test");      System.out.println(test);      ......    } finally {       //使用后一定关闭,还给连接池
   if(jedis!=null) {
    jedis.close();
    } }

 

 

jedis获取后一定要关闭,这和我们使用数据库连接池是一样的,放在finally块中保证jedis的关闭.

ps:如果大家使用的jdk是1.7版本或者以上的话,可以使用1.7加入的try-with-resources语句

 

    try(ShardedJedis jedis = jedisPool.getResource()) {      jedis.set("test", "test");      jedis.set("test1", "test1");      String test = jedis.get("test");      System.out.println(test);    }

 

try-with-resources的效果和我们上面写法是一样的,只是jedis.close()语法它会帮我们调用,它会默认调用我们在try-with-resources语句中声明的,实现了Closeable 接口的对象的close方法(像上面的ShardedJedis),我们经常用到的数据库连接Connection和一些输入输出流都可以使用这种方法。

 

 从代码上看,除了初始化ShardedJedisPool时需要加入多个Redis服务器信息,其他的和Jedis使用差不多。

在初始化ShardedJedisPool 时,我们还可以传入ShardedJedis采用的hash算法,支持MURMUR_HASHMD5两种算法,默认是使用MURMUR_HASH(可以查看redis.clients.util.Hashing 类查看相关的信息)

另外还可以传入keyTagPattern来指定我们key的分布策略,所有能够匹配keyTagPattern的key(通过正则匹配)将放在同一个redis里,默认的是直接使用key来进行判定。Redis自带了一个Sharded.keyTagPattern,如下

 

Pattern DEFAULT_KEY_TAG_PATTERN = Pattern.compile("\\{(.+?)\\}");

 

我们可以用下面的代码来实际测试下

    ShardedJedis jedis = jedisPool.getResource();

jedis.set("cnblog", "cnblog"); jedis.set("redis", "redis"); jedis.set("test", "test"); jedis.set("123456", "1234567"); Client client1 = jedis.getShard("cnblog").getClient(); Client client2 = jedis.getShard("redis").getClient(); Client client3 = jedis.getShard("test").getClient(); Client client4 = jedis.getShard("123456").getClient(); ////打印key在哪个server中 System.out.println("cnblog in server:" + client1.getHost() + " and port is:" + client1.getPort()); System.out.println("redis in server:" + client2.getHost() + " and port is:" + client2.getPort()); System.out.println("test in server:" + client3.getHost() + " and port is:" + client3.getPort()); System.out.println("123456 in server:" + client4.getHost() + " and port is:" + client4.getPort());

 

 

看输出内容:

Jedis下的ShardedJedis(分布式)使用方法(一)

可以看到我们保存的4个key,cnblog和redis在同一个redis server中,另外两个分别在另外的redis server中。

ShardedJedis里面采用了一致性哈希的算法,来决定每个key的保存位置,具体是怎么样计算的,在下一篇中会研究下Jedis的源码来看看。

 




原标题:Jedis下的ShardedJedis(分布式)使用方法(一)

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

跨境物流干货:跨境电商如何选择好的物流渠道? :https://www.goluckyvip.com/news/10556.html
黑天鹅灰犀牛频发,暴雷不断,跨境物流何去何从? :https://www.goluckyvip.com/news/10557.html
跨境退货成本降低有妙招,逆物流策略也能赚钱!:https://www.goluckyvip.com/news/10558.html
营销热点|宠物赛道又出爆品!TikTok播放破千万!:https://www.goluckyvip.com/news/10559.html
跨境电商快递资讯:中国邮政与华为结为全面战略合作伙伴:https://www.goluckyvip.com/news/1056.html
一张卡价值上万!“拆卡直播”在TikTok已疯魔:https://www.goluckyvip.com/news/10560.html
天坛最佳攻略 天坛必玩景点:https://www.vstour.cn/a/408240.html
央视新址为什么会找回:https://www.vstour.cn/a/408241.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流