06-redis的三种特殊类型

一 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 实现同样的统计 只需要12KB hyperloglog的统计会有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
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值