关于统计在线人数,第一反应想到的是创建一个大型字典存储用户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