一 geospatial(地理位置)
geospatial类型可以用在以下场景中 1、朋友的地位 2、附近的人 3、打车距离计算
城市经纬度查询 这个网站可以查询城市的经纬度,用于测试geospatial数据类型
geospatial底层是zset
所以zset的命令可以操作geospatial 比如需要删除一个geospatial中的元素 可以用zrem key member 来删除
# geoadd key 精度 维度 名称 将给定的空间元素(纬度、经度、名字)添加到指定的键里面 需要注意的是地球两极无法直接添加
geoadd china:city 116.405285 39.904989 beijing #将北京市的经纬度添加到china:city集合中
#geopos key member [member ...] 获取当前定位
geopos china:city beijing $获取北京的经纬度
#geodist key member1 member2 [unit] 返回两个给定位置之间的距离 unit是单位 默认单位是m
geodist china:city beijing shanghai km #查询北京到上海之间的距离 单位是km
#georadius key 经度 纬度 半径 单位(m|km...)[withcoord][withdist][count]
georadius china:city 110 20 1000 km #找出指定key china:city 中纬度为110 经度为20的 1000km以内的元素
georadius china:city 110 20 1000 km withdist #与上面的命令结果不同的是会带上筛选出来的元素的直线距离
georadius china:city 110 20 1000 km withcoord #会筛选出结果的经纬度
georadius china:city 110 20 1000 km withdist withcoord count
#georadiusbymember key member 半径 单位(m|km...)[withcoord][withdist][count]
georadiusbymember china:city beijing 2000 km #查询以北京为中心方圆2000公里范围内的所有元素
二 Hyperloglog(基数统计)
要理解Hyperloglog需要先理解一个概念:基数;什么是基数呢?基数实际上指的是一个集合中所有不重复元素的个数。比如有一个集合{1,3,5,7,7,8,8}那么这个集合的基数就是5。基数是有误差的
Hyperloglog的应用场景
- 统计网站的用户访问量(需要对用户进行去重 同一个用户一天只统计一次)
传统的处理方式就是用一个set的集合,存用户的id,然后统计set集合中的数量。这样处理,如果保存大量的用户id,就会占用大量的内存。而Hyperloglog则可以实现上面的需求,但是它占用的内存是固定的就是12KB
比如说如果一个网站有2的64次方的用户(极端假设)那么用set存储就要存储2的64次方个数,那样内存占用是相当巨大的,而hyperloglog 实现同样的统计 只需要12KBhyperloglog的统计会有0.81%的错误率
#pfadd key element [element...]向redis添加一个hyperloglog类型得key 并向其中添加元素 pfadd testHyperlog a b c a d e d f #type testHyperlog 返回的数据类型是string 这个需要注意一下 #pfcount key [key...] 统计hyperloglog的元素的个数 可以接多个key 如果有多个key 则取多个key的并集 pfcount testHyperlog #此时返回的值是6 #pfmerge destkey sourcekey [sourcekey ...] 将多个hyperloglog类型的key的元素进行合并生成一个新的hyperloglog结构的结果集 pfmerge testHyperlog2 testHyperlog testHyperlog1
三 Bitmap(位图)
位图是redis提供的一种操作二进制位的数据结构,通过位图可以直接指定元素的状态存储在二进制数的那个位置上 就只有0跟1两个状态
位图的应用场景包括
- 统计活跃粉丝数量
- 统计打卡情况
- 实际上对于只有两个状态的元素的统计都可以用位图来实现
场景1 统计一年365天的打开情况 如果是你用其他的集合进行存储(如map) 那么你再map中需要存储365个key 这样才能统计一年的打卡情况(做到能够查询一年中任何一天的打卡情况,而不是仅仅统计打卡数),但是如果通过位图的话 我只需要准备365个bit的内存大小(约46个字节的内存大小就行了)#setbit key offset value 设置一个bitmap类型的key offset是偏移量(第多s少位) value的取值只能是0 和 1 不是0 跟1会报错 setbit testbitmap 0 1 #模拟星期天已打卡 setbit testbitmap 1 1 #模拟星期一已打卡 setbit testbitmap 2 0 #模拟星期二没打开 #getbit key offset 查看某个offset位置的状态 getbit testbitmap 2 #此时返回的值时0 #bitcount key [start end] 统计某个bitmap类型key的元素的值为1个数 start end 可选 指的是偏移量 bitcount testbitmap #此时返回的是2 因为值为1的元素的个数有两个 #type testbitmap 需要注意的是 此时返回的是string 并不是返回的bitmap