package redis import ( r "github.com/garyburd/redigo/redis" ) type Pool struct { r.Pool } var nums = [8]uint8{1, 2, 4, 8, 16, 32, 64, 128} // BitRange 计算下标表 // str: 计算的字符串 // start: 开始的座标 // offset: 偏移值 // size: 查询个数 func BitRange(str []byte, start int, offset int, size int) []int { bits := []int{} k := 0 for i, b := range str { // 按位,依次判断0-7下标每位是否为真 for j, num := range nums { if b&num != num { continue } // redis 存储offset 是从左向右存 // 下标位置 = 7 - 当前位 k = int(i*8 + 7 - j) if offset <= k && k < offset+size { bits = append(bits, start*8+k) } } } return bits } // GetBitRange 按位查询 返回bit位为1的下标 // client: redis的client // key: redis 存储的key // cur: 开始位置 // size: 查询个数 func (p *Pool) BitRange(key string, cur int, size int) ([]int, error) { start := cur / 8 // end必须按8取整 end := (cur+size+7)/8 str, err := r.Bytes(p.ExecuteCMD("GETRANGE", key, start, end)) if err != nil { return nil, err } bits := BitRange(str, start, cur%8, size) return bits, nil }