redis客户端之jedis和sharedJedis

前提:首先我们得区分2.x和3.x版本,因为3.x版本开始支持redis集群

问题:那么在2.x怎么进行redis服务器扩展

解决方式:横向扩展(多个相互独立的主从服务器群)

服务器搭建在此不进行叙述


那么问题又来了,jedis在未集群的情况下只能操作单redis服务器,jedis客户端怎么对横向扩展的服务器群进行数据操作

解决方式:使用SharedJedis来实现分布式缓存,ShardedJedis通过一致性哈希来实现分布式缓存的,通过一定的策略把不同的key分配到不同的redis server上,达到横向扩展的目

ShardedJedis的使用方法和Jedis类似

区别: ShardedJedis不支持多命令操作,像mget、mset、brpop等可以在redis命令后一次性操作多个key的命令,具体jedis命令可参照Jedis下的 MultiKeyCommands 类,包含了所有的多命令操作。这些多操作命令已经在SharedJedis中过滤掉

SharedJedis客户端创建

//设置连接池的相关配置
        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();
          }
        }


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

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

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

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

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());


输出结果:cnblog和redis在同一个redis server中,另外两个分别在另外的redis server中

jedis客户端创建

jedis客户端工具类

public class JedisPoolUtil {
  
  private static volatile JedisPool jedisPool = null;
  
  private JedisPoolUtil() {}
  
  public static JedisPool getJedisPoolInstance()
  {
     if(null == jedisPool)
     {
       synchronized (JedisPoolUtil.class)
       {
          if(null == jedisPool)
          {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxActive(1000);
            poolConfig.setMaxIdle(32);
            poolConfig.setMaxWait(100*1000);
            poolConfig.setTestOnBorrow(true);
            
            jedisPool = new JedisPool(poolConfig,"127.0.0.1");
          }
       }
     }
     return jedisPool;
  }
  
  public static void release(JedisPool jedisPool,Jedis jedis)
  {
     if(null != jedis)
     {
       jedisPool.returnResourceObject(jedis);
     }
  }
}

根据工具类获取客户端

public static void main(String[] args) {
     JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
     Jedis jedis = null;
     
     try 
     {
       jedis = jedisPool.getResource();
       jedis.set("k18","v183");
       
     } catch (Exception e) {
       e.printStackTrace();
     }finally{
       JedisPoolUtil.release(jedisPool, jedis);
     }
  }


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值