在redis的特殊数据类型中选出三种数据类型进行分析:
- geospatial
- hyperloglog
- bitmaps
geospatial 数据类型(地理位置)
geo只有六个命令:
geoadd <key> <经度> <纬度> <名称>... #将指定的地理空间位置(经度、纬度、名称)添加到指定的key中
#例:geoadd China:city 116.4 39.9 beijing 121.47 31.23 shanghai
geopos <key> <名称>... #获取key中指定名称的经纬度
#例:geopos China:city beijing shanghai
geodist <key> <名称1> <名称2> [unit] #获取key中指定两位置的直线距离,[unit]选项为长度单位(m米、km千米、mi英里、ft英尺)
#例:geodist China:city beijing shanghai km (默认单位为m,可不写)
georadius <key> <经度> <纬度> <半径> [unit] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
#获取给定的经纬度位置为中心,方圆半径内的key中的所有位置元素
#WITHCOORD选项为返回位置元素的经纬度
#WITHDIST选项为返回位置元素与中心位置的距离,长度单位与半径单位一致
#WITHHASH选项为位置元素经过原始 geohash 编码的有序集合分值,一般不会用到
#[COUNT count]选项为设置返回几个位置元素(在查询时依然会对key中的匹配元素全部做处理,所以大范围内查询依然很慢,但会减少带宽)
## 类似于 微信中 附近的人 功能
georadiusbymember <key> <名称> <半径> [unit] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
#获取以给定位置元素为中心,方圆半径内的key中的所有位置元素
geohash <key> <名称>... #获取由二维经纬度转换成的11个字符的Geohash字符串
扩展:
geo的底层是由zset(有序集合)实现的,所以可以用zset的命令来操作geo。
例如GEO中没有删除位置元素的命令,就可以用zrem命令:
zrange China:city 0 -1 #获取全部位置元素
zrem China:city beijing #移除位置元素
hyperloglog数据类型(基数统计)
基数是集合中不重复的元素个数。
应用场景:统计一个网站的访问人数,即一个人多次访问也只算一人。
传统的方式:将访问的用户id保存到set集合中,统计set集合中元素个数。
问题:当有大量的用户访问网站时,会导致内存占用资源过多。
而hyperloglog存放2^64个元素只需12kb的内存,所以做基数统计应首选hyperloglog!
hyperloglog只有三个命令:
pfadd <key> <value>... #将参数value存放到名为key的hyperloglog结构中
pfcount <key>... #当参数为一个时:统计key中的近似基数;当有多个参数时:统计多个hyperloglog结构并集的近似基数
pfmerge <key> <key1> <key2>... #将多个HyperLogLog合并到key中,合并后的key的基数接近于所有输入HyperLogLog的并集
hyperloglog允许0.81%的容错率,如果统计功能不允许容错的话还是老老实实地用set统计吧~
Bitmaps数据类型(位图)
bitmaps本身并不是一种数据类型,而是一个字符串,可以对字符串的二进制位进行操作来记录0和1两种状态。
应用场景可以是记录用户是否登录,员工是否打卡等。
命令:
setbit <key> <i> <value> #设置key的下标i位置上的值为value,value值只能是0或1
#例:setbit user:sara:2020 49 1 设置用户Sara在2020年的第49天访问了网站
getbit <key> <i> #获取key的下标i位置上的值
#例:getbit user:sara:2020 48 获取用户Sara在2020年的第48天是否访问了网站
bitcount <key> [start end] #统计key中值为1的字节数,[start end]选项与getrange命令类似
#例:bitcount user:sara:2020 获取用户Sara在2020年一共有多少天访问过网站
bitop [operation] <dekey> <key1>... #对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到dekey上
#[operation] 选项为位元操作AND(与)、OR(或)、XOR(异或)、NOT(非)。非的参数只能有一个,其他都可多个参数
#例:key1 = 1001;key2 = 1101;
#bitop and dekey key1 key2 ==> dekey=1001
#bitop or dekey key1 key2 ==> dekey=1101
#bitop xor dekey key1 key2 ==> dekey=0010
#bitop not dekey key1 ==> dekey=0110