redis位图(bitmap)
今天群里有个群友问到这个问题,what,脑子里面竟然没有印象!redis这个操作是什么鬼,就去看了下 虽然不是什么新的理念但是这里还是记录下,毕竟位操作在性能上面还是比较快的,这里就用统计每天用户的活跃度来说
主要用到的几个命令
setbit getbit bitop bitcount
核心就是二进制的相关操作 bitop
BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。 BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。 BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。 BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey
这里搞一个小实例
我有一个小网站 一共三个用户
第一天 id 1 用户登录
第二天 id 1 2 用户登录
第三天 id 1 2 3 用户登录
统计每一天登录的用户数
统计三天都登录的用户
统计三天活跃用户
127.0.0.1:6379> setbit day_one 1 1 (integer) 0 127.0.0.1:6379> setbit day_two 1 1 (integer) 0 127.0.0.1:6379> setbit day_three 1 1 (integer) 0 127.0.0.1:6379> setbit day_three 2 1 (integer) 0 127.0.0.1:6379> setbit day_three 3 1 (integer) 0 127.0.0.1:6379> bitcount day_one (integer) 1 127.0.0.1:6379> bitcount day_two (integer) 1 127.0.0.1:6379> bitcount day_three (integer) 3 127.0.0.1:6379> setbit day_two 2 1 (integer) 0 127.0.0.1:6379> bitop and login_every_day day_one day_two day_three (integer) 1 127.0.0.1:6379> bitcount login_every_day (integer) 1 127.0.0.1:6379> get login_every_day "@" 127.0.0.1:6379> bitop or login_all day_one day_two day_three (integer) 1 127.0.0.1:6379> bitcount login_all (integer) 3 127.0.0.1:6379>
上班干活!