Redis 学习笔记(七)特殊数据类型

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值