예제 #1
0
파일: sbf.go 프로젝트: appwilldev/redis_sbf
func (s *SBFFrame) Add(conn redis.Conn, element []byte) bool {
	hashes := murmur.Hashes(element, s.SliceCount, s.SliceSize)
	// update bit val
	conn.Send("MULTI")
	for index, h := range hashes {
		pos := uint32(index)*s.SliceSize + s.StartIndex + h + SBF_FRAME_HEADER_SIZE<<3
		conn.Send("SETBIT", s.Refer, pos, 1)
	}
	conn.Send("INCR", s.Key)
	_, err := conn.Do("EXEC")
	if err == nil {
		s.Count += 1
		return true
	} else {
		return false
	}
}
예제 #2
0
파일: sbf.go 프로젝트: appwilldev/redis_sbf
func (s *SBFFrame) Check(conn redis.Conn, element []byte) bool {
	var flag int = 1
	hashes := murmur.Hashes(element, s.SliceCount, s.SliceSize)
	// check bit val
	conn.Send("MULTI")
	for index, h := range hashes {
		pos := uint32(index)*s.SliceSize + s.StartIndex + h + SBF_FRAME_HEADER_SIZE<<3
		conn.Send("GETBIT", s.Refer, pos)
	}
	if data, err := redis.Ints(conn.Do("EXEC")); err == nil {
		for _, f := range data {
			flag = flag & f
			if flag != 1 {
				return false
			}
		}
		return (flag == 1)
	} else {
		return false
	}
}