61581229 发表于 2018-11-3 15:13:13

redis相关知识积累

@Test  
    public void jedisTest() {
  
    System.out.println("**************************");
  
      Jedis jedis = jedis();
  

  
      jedis.lpush("meineprivateliste", UUID.randomUUID().toString()); //向key meineprivateliste中存放一个字符串
  
      System.out.println(jedis.lrange("meineprivateliste", 0, -1)); //第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
  

  
      /*
  
         * 参与自: http://blog.csdn.net/liyantianmin/article/details/51613772
  事务是保证事务内的所有命令是原子操作,一般配合watch使用,事务的执行结果和pipeline一样都是采用异步的方式获取结果,multi.exec()提交事务,
  如果执行成功,其返回的结果和pipeline一样是所有命令的返回值,如果事务里面有两个命令那么事务的exec返回值会把两个命令的返回值组合在一起返回。如果事务被取消返回null。
  3、watch
  一般是和事务一起使用,当对某个key进行watch后如果其他的客户端对这个key进行了更改,那么本次事务会被取消,事务的exec会返回null。jedis.watch(key)都会返回OK
  https://my.oschina.net/sphl520/blog/312514
  我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。
  
         * */
  
      jedis.watch("foo");
  
      Transaction t = jedis.multi();
  
      /*
  
         * set是PipelineBase里的方法
  
         * Transaction extends MultiKeyPipelineBase,MultiKeyPipelineBase又extends PipelineBase
  
         *
  public Response set(String key, String value) {
  getClient(key).set(key, value);
  return getResponse(BuilderFactory.STRING);
  }
  public Response set(byte[] key, byte[] value) {
  getClient(key).set(key, value);
  return getResponse(BuilderFactory.STRING);
  }
  
         * */
  
      t.set("foo", "bar");
  
      /*
  
         * get是PipelineBase里的方法
  
         * Transaction extends MultiKeyPipelineBase,MultiKeyPipelineBase又extends PipelineBase
  
         *
  public Response get(String key) {
  getClient(key).get(key);
  return getResponse(BuilderFactory.STRING);
  }
  public Response get(byte[] key) {
  getClient(key).get(key);
  return getResponse(BuilderFactory.BYTE_ARRAY);
  }
  
         * */
  
      Response resp = t.get("foo");
  
      t.exec();
  
      /*
  
      public T get() {
  // if response has dependency response and dependency is not built,
  // build it first and no more!!
  if (dependency != null && dependency.set && !dependency.built) {
  dependency.build();
  }
  if (!set) {
  throw new JedisDataException(
  "Please close pipeline or multi block before calling this method.");
  }
  if (!built) {
  build();
  }
  if (exception != null) {
  throw exception;
  }
  return response;
  }
  
         * */
  
      System.out.println(resp.get());
  

  
      /*
  
         * http://www.blogjava.net/masfay/archive/2012/07/03/382080.html
  
         * 开启事务,当server端收到multi指令
  
         * 会将该client的命令放入一个队列,然后依次执行,知道(应该是直到)收到exec指令
  
         * */
  
      t = jedis.multi();
  
      int[] positions = new int[]{1, 2, 3};
  
      for (int position : positions)
  
            t.getbit("bla", position);
  
      for (Object obj : t.exec()) {
  
            System.out.println("Bit : " + (Boolean) obj);
  
      }
  

  
      jedis.set("meinint", Integer.toString(3));
  
      /*
  
         *源自http://www.redis.cn/commands/incr.html
  
         * 对存储在指定key的数值执行原子的加1操作。
  
如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。
  
如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,
  
那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。
  
这个操作仅限于64位的有符号整型数据。
  
注意: 由于redis并没有一个明确的类型来表示整型数据,所以这个操作是一个字符串操作。
  
执行这个操作的时候,key对应存储的字符串被解析为10进制的64位有符号整型数据。
  
事实上,Redis 内部采用整数形式(Integer representation)来存储对应的整数值,所以对该类字符串值实际上是用整数保存,也就不存在存储整数的字符串表示(String representation)所带来的额外消耗。
  
         * */
  
      jedis.incr("meinint");
  
      int meinint = Integer.valueOf(jedis.get("meinint"));
  
      System.out.println("Integer: " + meinint);
  

  
      /*
  
         *
  
设置或者清空key的value(字符串)在offset处的bit值。
  
那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定。
  
当key不存在的时候,就创建一个新的字符串value。要确保这个字符串大到在offset处有bit值。参数offset需要大于等于0,并且小于232(限制bitmap大小为512)。当key对应的字符串增大的时候,新增的部分bit值都是设置为0。
  
警告:当set最后一个bit(offset等于232-1)并且key还没有一个字符串value或者其value是个比较小的字符串时,Redis需要立即分配所有内存,这有可能会导致服务阻塞一会。在一台2010MacBook Pro上,offset为232-1(分配512MB)需要~300ms,offset为230-1(分配128MB)需要~80ms,offset为228-1(分配32MB)需要~30ms,offset为226-1(分配8MB)需要8ms。注意,一旦第一次内存分配完,后面对同一个key调用SETBIT就不会预先得到内存分配。
  
         * */
  
      jedis.setbit("testbits", 100, true);
  
      System.out.println("***********************");
  
      System.out.println("wtf"+jedis.get("testbits"));
  
      System.out.println(Arrays.toString(jedis.get(SafeEncoder.encode("testbits"))));
  

  
      jedis.watch("test");
  
      if (!jedis.exists("test")) {
  
            Transaction ta = jedis.multi();
  
            ta.setbit("test", 100000, false);
  
            ta.exec();
  
      }
  

  
      Transaction ta = jedis.multi();
  
      ta.setbit("test", 10, true);
  
      ta.exec();
  

  
      ta = jedis.multi();
  
      for (int i = 0; i
页: [1]
查看完整版本: redis相关知识积累