从二进制获取Redis的位图

时间:2015-09-30 11:52:59

标签: node.js coffeescript redis

我正在开发用户活动功能,我每天都会跟踪用户的活动。我正在考虑使用位图,因此当天活跃的用户将被设置为1。

SETBIT users:2015:9:30 <userid> 1

我不想为每个用户做GETBIT。我想以二进制形式检索整个值,以便我可以遍历它并找到活动或非活动用户。

我想知道这种方法是否正确以及使用哪个节点模块。

2 个答案:

答案 0 :(得分:0)

Redis中的位数组存储为字符串。要获取整个数组,只需执行常规GET并从结果中解析字节。

答案 1 :(得分:0)

要获取bitarray,您应该将return_buffers设置为true,然后对其执行get操作,这将为您提供一个缓冲区对象。将此缓冲区对象转换为十六进制字符串,然后遍历它。

我的解决方案

neoredis = require 'redis'
key = "h"
map =
  "0":[]
  "1":[3]
  "2":[2]
  "3":[2,3]
  "4":[1]
  "5":[1,3]
  "6":[1,2]
  "7":[1,2,3]
  "8":[0]
  "9":[0,3]
  "a":[0,2]
  "b":[0,2,3]
  "c":[0,1]
  "d":[0,1,3]
  "e":[0,1,2]
  "f":[0,1,2,3]
usersbufferobject = null

redis = neoredis.createClient(6379,'redis',{return_buffers:true})
redis.get key,(err,res)->
  redis.quit()
  if not err?
    if res?
      usersbufferobject = res.toString('hex')
      users = []
      offset = 0
      arr = usersbufferobject.match(/.{1,2}/g)
      for i in arr
        for j in map[i[0]]
          users.push(offset+j)
        for j in map[i[1]]
          users.push(offset+4+j)
        offset+=8
      console.log "Active Users",users
    else
      console.log "No users active"
  process.exit()