java 7부터 BitSet의 valueOf()가 추가되었다. 이를 이용해서 Redis의 BitSet 으로 받아 테스트해본다.

이 것을 이용해서 성능을 향상시킨 블로그(http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ )를 참조로 만들었다.

public class BitSetTest {

static Jedis jedis = new Jedis("192.168.159.133");

public static void main(String[] args) throws Exception {
  jedis.setbit("mon", 8, true);
  jedis.setbit("mon", 15, true);
  jedis.setbit("tue", 1, true);
  jedis.setbit("tue", 7, true);
  jedis.setbit("tue", 0, true);

  List<String> weekdays = new ArrayList<String>();
  weekdays.add("mon");
  weekdays.add("tue");

  BitSet all = new BitSet();
  for (String weekday : weekdays) {
     System.out.println(weekday + " : " + BitSet.valueOf(jedis.get(weekday.getBytes())));
     BitSet bitset = BitSet.valueOf(jedis.get(weekday.getBytes()));
     all.or(bitset);
  }
   System.out.println(all.cardinality());
}


결과는 예상하면, 약간 생뚱 맞다고 느껴질 수 있지만, 익숙해질 필요가 있다.

mon : {8, 15}
tue : {0, 6, 7}
5

 

그 이유는 아래 이미지 파일로 설명할 수 있다.

사진

 

redis의 biset 를 저장할 때, offset 0 이 의미하는 것은 바로 첫번째 1byte의 가장 최상위 bit를 의미한다. 따라서 0 offset true를 지정하고 get해서 BitSet으로 얻어오면 7로 얻어온다. 1 offset에 true를 저장하면 6으로 값을 얻어온다. 이런식으로 값들이 저장하도록 되어 있다.

만약 offset이 8인 값에 true를 저장해서 BitSet으로 얻어오면, 15로 얻어온다.

16 offset에 저장해서 BitSet으로 가져온다면, 23으로 가져온다..

Posted by '김용환'
,