@Test public void bitOp() { jedis.set("key1", "\u0060"); jedis.set("key2", "\u0044"); jedis.bitop(BitOP.AND, "resultAnd", "key1", "key2"); String resultAnd = jedis.get("resultAnd"); assertEquals("\u0040", resultAnd); jedis.bitop(BitOP.OR, "resultOr", "key1", "key2"); String resultOr = jedis.get("resultOr"); assertEquals("\u0064", resultOr); jedis.bitop(BitOP.XOR, "resultXor", "key1", "key2"); String resultXor = jedis.get("resultXor"); assertEquals("\u0024", resultXor); jedis.del("resultAnd"); jedis.del("resultOr"); jedis.del("resultXor"); jedis.del("key1"); jedis.del("key2"); }
@Test public void bitOpNot() { jedis.del("key"); jedis.setbit("key", 0, true); jedis.setbit("key", 4, true); jedis.bitop(BitOP.NOT, "resultNot", "key"); String resultNot = jedis.get("resultNot"); assertEquals("\u0077", resultNot); jedis.del("key"); jedis.del("resultNot"); }
@Override public Long bitop(BitOP op, String destKey, String... srcKeys) { Span span = helper.buildSpan("bitop"); span.setTag("destKey", destKey); span.setTag("srcKeys", Arrays.toString(srcKeys)); try { return super.bitop(op, destKey, srcKeys); } catch (Exception e) { onError(e, span); throw e; } finally { span.finish(); } }
@Override public Long bitop(BitOP op, byte[] destKey, byte[]... srcKeys) { Span span = helper.buildSpan("bitop"); span.setTag("destKey", Arrays.toString(destKey)); span.setTag("srcKeys", TracingHelper.toString(srcKeys)); try { return super.bitop(op, destKey, srcKeys); } catch (Exception e) { onError(e, span); throw e; } finally { span.finish(); } }
/** * 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。 operation 可以是 AND 、 OR 、 * NOT 、 XOR 这四种操作中的任意一种 * * @param op * @param destKey * @param srcKeys * @return */ public Long bitTop(final BitOP op, final String destKey, String... srcKeys) { if (RedisConstants.isInUse()) { return getTemplate().execute(new JedisCallBackHandler<Long>() { public Long invoke(Jedis jedis) { return jedis.bitop(op, destKey, srcKeys); } }); } else { return null; } }
/** * 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。 operation 可以是 AND 、 OR 、 * NOT 、 XOR 这四种操作中的任意一种 * * @param op * @param destKey * @param srcKeys * @return */ public Long bitTop(final BitOP op, final String destKey, String... srcKeys) { if (RedisConstants.isInUse()) { return getTemplate().executeWrite(new JedisCallBackHandler<Long>() { public Long invoke(Jedis jedis) { return jedis.bitop(op, destKey, srcKeys); } }); } else { return null; } }
/** * 所有的key中的值应该是integer * @param destKey * @param srcKeys * @return 返回合并之后的写入destKey中的值 * @throws FedisException */ Long bitop(final BitOP op , final String destKey , final String... srcKeys) throws FedisException{ FedisUtils.checkNull(srcKeys); List<Long> values = new ArrayList<Long>(); for(int i = 0 ; i< srcKeys.length ; i++){ values.add(getLong(srcKeys[i])); } if(values.size() == 0){ setLong(destKey , 0L); return 0L; } Long result = values.get(0); if(BitOP.NOT == op){ result = ~result; }else{ for(int i = 1 ; i < values.size() ; i++){ switch(op){ case AND: result = result & values.get(i); break; case OR: result = result | values.get(i); break; case XOR: result = result ^ values.get(i); break; default: break; } } } setLong(destKey , result); return result; }
@Override public Long bitop(BitOP op, String destKey, String... srcKeys) { return jedis.bitop(op, destKey, srcKeys); }
@Override public Long bitop(BitOP op, byte[] destKey, byte[]... srcKeys) { return jedis.bitop(op, destKey, srcKeys); }
@Override public Long bitop(BitOP op, byte[] destKey, byte[]... srcKeys) { return null; }
@Override public Long bitop(BitOP op, String destKey, String... srcKeys) { return null; }
@Override public Long bitop(BitOP op, String destKey, String... srcKeys) { throw new FakeJedisNotImplementedException(); }
@Override public Long bitop(BitOP op, byte[] destKey, byte[]... srcKeys) { throw new FakeJedisNotImplementedException(); }
@Override public Response<Long> bitop(BitOP op, byte[] destKey, byte[]... srcKeys) { throw new FakeJedisNotImplementedException(); }
@Override public Response<Long> bitop(BitOP op, String destKey, String... srcKeys) { throw new FakeJedisNotImplementedException(); }
private Long bitnot0(Jedis j, String destkey, String key) { return j.bitop(BitOP.NOT, destkey, key); }
private Long bitand0(Jedis j, String destkey, String... keys) { return j.bitop(BitOP.AND, destkey, keys); }
private Long bitor0(Jedis j, String destkey, String... keys) { return j.bitop(BitOP.OR, destkey, keys); }
private Long bitxor0(Jedis j, String destkey, String... keys) { return j.bitop(BitOP.XOR, destkey, keys); }
private void bitnot0(String destkey, String key) { t.bitop(BitOP.NOT, destkey, key); }
private void bitand0(String destkey, String... keys) { t.bitop(BitOP.AND, destkey, keys); }
private void bitor0(String destkey, String... keys) { t.bitop(BitOP.OR, destkey, keys); }
private void bitxor0(String destkey, String... keys) { t.bitop(BitOP.XOR, destkey, keys); }
Response<Long> bitop(BitOP op, final byte[] destKey, byte[]... srcKeys);
Response<Long> bitop(BitOP op, final String destKey, String... srcKeys);
Long bitop(BitOP op, final byte[] destKey, byte[]... srcKeys);
void bitop(BitOP op, final String destKey, String... srcKeys);
Long bitop(BitOP op, final String destKey, String... srcKeys);