1.bitmap位图
位图不是实际的数据类型,而是在String类型上定义的一组面向位的操作,使用1,0来表示数据,redis的key和value是有大小限制的,都是不能超过512M,那么bitmap最大能设置2^32的长度。
8 bit = 1byte
1024 byte = 1kb
1024 kb = 1Mb
512 * 1024 * 1024 *8 = 2^32l
使用
setbit k offset value offset为二进制的偏移量 针对二进制修改值为value
setbit k 1 1 -> get k = @ (0100 0000)
setbit k 7 1 -> get k = A (0100 0001)
setbit k 9 1 -> get k = A@ (0100 0001 0100)
bitcount k start end 统计二进制1出现的次数 start end 代表字节长度
bitcount k 0 0 计算出第0个字节八位当中的1的次数
bitcount k 0 1 计算出第0个字节和第一个字节 这十六位中出现的1的次数
bitpos key bit start end ,在该key中,第start的位置到end的位置 该bit的位置
bitpos k 0 1 1 ->8 (0100 0001 0 100)
bitop 二进制运算
使用场景
1.统计用户的登录天数 随机统计某阶段天数
可以把一年当成365个二进制位,登录则把某天改为1,统计某些天的1的次数
setbit json 320 1
setbit json 310 1
setbit json 1 1
setbit json 0 1
setbit json 2 1
bitcount json -2 -1 最后16天(正反向索引)
bitcount json 0 0 前八天
2.某阶段活跃用户统计
把用户想象成很多二进制位,日期key,如果该日期登录了,则把该key的对应二进制位改为1,对key做去重操作,统计去重之后的key的1出现的次数
setbit 20201010 1 1 -> 该天我登录了 (0100 0000)
setbit 20201011 1 1 -> 第二天我又登录了(0100 0000)
setbit 20201011 7 1 -> 第二天他也登录了(0100 0001)
统计这两天的活跃人数
bitop or addkey 20201010 20201011 -> 去重
bitcount addkey 0 -1 统计这些天的活跃数
最大的优点是在存储信息时节省大量空间,用512M可以存储40亿用户的一位信息。
2.布隆过滤器
它实际上是一个bitmap的使用,可以用于检索一个元素是否在一个集合中,优点是查询效率都远远超过一般的算法,缺点是存在误判。
原理
向里面添加元素时,会使用多个hash函数进行计算取模得出一个数组的下标,每个hash都会算出不同的位置,再把这些位置都置为1,就完成了add操作。
向它询问key是否存在时,与add一样,通过计算下标,查看当前位置是否为1,如果有一个为0,则说明不存在,若都为1,则说明可能存在,因为hash是有冲突的,如果这个位数组比较稀疏,这个概率就会很大,如果这个位数组比较拥挤,这个概率就会降低。它对删除某些元素是困难的,因为要把1置为0,而这个1可能是其他的key计算出来的,会影响其他元素的判断的情况。
使用场景比如:可以完成一些url是否爬取过,缓存穿透等场景。
3.hyperloglogs
用做基数统计,一个集合中不重复元素出现的个数。
可以用它做PV(页面浏览量)、UV(访客数量、每个用户一天只记录一次)。
如果统计 PV(浏览量,用户每点一次记录一次),则可以给每个页面配置一个独立的 Redis 计数器就可以了,把这个计数器的 key后缀加上当天的日期。这样每来一个请求,就执行 incrby指令一次,最终就可以统计出所有的 PV 数据。
UV(访站数量) 不同,它要去重,同一个用户一天之内的多次访问请求只能计数一次。不管你是否登录,则访问网站的每个网页都要带个唯一标识来区分用户不同。使用set为每个页面创建一个集合,每个人访问该网页就加到集合中,但是那么多的网页,维护这些set集合肯定麻烦。
为解决这个问题,其实有很多解决方案,用hyperloglogs就是一种,它是用于基数计数的概率的算法。
如何使用:
PFADD key user1
PFCOUNT key
PFMEGER k1 k2... 累加
4.geospatial
将指定的地理空间位置(经纬度及名称)添加到指定的key中,必须经度在纬度之前。
GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
GEODIST Sicily Palermo Catania
GEORADIUS Sicily 15 37 100 km
GEORADIUS Sicily 15 37 200 km
基于这个模型,我思考到可以用它做附近的人,同城的人。