在redis的特殊数据类型中选出三种数据类型进行分析:
geospatialhyperloglogbitmapsgeo只有六个命令:
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 #移除位置元素基数是集合中不重复的元素个数。
应用场景:统计一个网站的访问人数,即一个人多次访问也只算一人。 传统的方式:将访问的用户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本身并不是一种数据类型,而是一个字符串,可以对字符串的二进制位进行操作来记录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