通过redis setbit方式高效统计网站当前在线人数

关于统计在线人数,第一反应想到的是创建一个大型字典存储用户id与对应的状态,但是这种方法耗费空间大,效率较低。

通过学习 redis 想到更高效的方法。

原理:通过将用户 id 作为位数,每次上线则将该位设为 1,下线则设为 0,通过 bitcount 来查询有多少 1,通过 getbit,传入用户 id 来判断当前用户是否为上线状态。

SET key value [EX seconds] [PX milliseconds] [NX|XX]

SETBIT key offset value

BITCOUNT key [start end] -> 返回的是二进制中 1 的个数

GETBIT key offset

如,一个id = 888888 的用户上线了:


首先指定一个key:
set usercount 0

通过python 方法 ord('0') 得知字符 0 的 ASCII 码值为 48
通过python 方法 bin(48) 得到二进制为 0110000

需要将所有位数设为0
setbit usercount 2 0
setbit usercount 3 0
直到 bitcount usercount 返回 0 为止,代表所有 usercount 的所有位数都为 0 了,这样前置条件就完成了。

id = 888888 的用户上线
setbit usercount 888888 1 (这里当前usercount虽然没有888888位,但只要通过setbit就可以创建)
id = 8889 的用户上线
setbit usercount 8889 1
...

然后通过 bitcount usercount 判断有多少1,则就知道有多少在线人数了。(当前bitcount usercount 返回2,代表有2位用户在线)

通过 getbit usercount 8889,来判断用户id = 8889 的用户是否上线。

这样即使网站有上亿用户,需要的存储空间也只有10多M。

如果光想统计访问人数,则只需要

set count 0
incr count