redis高阶应用

最近深入学习redis,了解到了redis的其他少见的用法,有Bitmap,HyperLogLog,GEO… 一起来看看吧!

Bitmap 位图

Bitmap是基于redis字符串结构的一种应用,通过字符串的二进制位来表示某个offset值是否存在,由于是直接对位进行操作,所以复杂度是O(1),在Redis中速度也是非常快的,场景正确内存使用也是极低的。

命令:

  • SETBIT {key} {offset} {value}
    • offset 必须为int(0~4294967296),注意越界,相当于一个子key
    • value 0 或 1 表示该offset是否存在
  • GETBIT {key} {offset}
    • 查看offset是否存在
  • BITCOUNT {key}
    • 统计该key下存在几个子key,如果key不存在统计也是0
  • BITOP {operation} {destkey} {key} [key…]
    • 对一个或多个key就行元操作
    • operation 可选参数
      • AND 对一个或多个key求逻辑与操作,并将结果保存到 destkey (结果相当于求几个key的交集)
      • OR 对一个或多个key求逻辑或操作,并将结果保存到 destkey (结果相当于求几个key的并集)
      • XOR 对一个或多个key求逻辑异或操作,并将结果保存到 destkey (结果相当于求几个key的差集)
      • NOT 对给定 一个key 求逻辑非操作,并将结果保存到 destkey (结果相当于对key进行取反)

应用场景:

  • 统计系统日活月活
  • 优惠劵用户领取记录
  • 适用于offset值较小且密集的场景,这样内存占用率最低,当offset值过大时可以考虑拆分为多个key进行操作。

有一点需要注意 Bitmap 的内存占用是最大的offset值所决定的 !!!


HyperLogLog 基数统计

HyperLogLog是一个可以接收多个元素作为输入,并给出输入元素的基数估算值:

  • 基数:集合中不同元素的数量。例如 [‘我’,’是’,’最’,’最’,’帅’,’的’] 的基数就是 5
  • 估算值:HyperLogLog本身是基于算法实现的,由于本身实际不存储元素,所以给出的基数值并不一定精确,标准误差率约为0.81%。

命令:

  • PFADD {key} {element} [element…]
    • element 存放到该key中的元素
  • PFCOUNT {key} [key…]
    • 当给定一个HyperLogLog时,返回给定key的基数估算值。
    • 当给定多个HyperLogLog时,返回多个key合并后的的基数估算值,合并后的HyperLogLog使用完及时删除,不会保存。
  • PFMERGE {destkey} {key} [key…]
    • 合并多个HyperLogLog并存储在destKey中

应用场景:

  • 登录ip统计
  • 系统日活统计(比Bitmap更低更低的内存占用)

HyperLogLog 内存占用极低,绝对时大数据量场景下的好帮手。redis版本需要在2.8.9以上哦!


GEO 地理位置

Redis GEO 借助了有序集合(zset)和geohash可以很容易的实现地理位置搜索及应用。

命令:

  • GEOADD {key} {longitude} {latitude} {member} [{longitude} {latitude} {member} …]
    • 该命令用来添加一或多个地址位置到指定的key中
    • longitude 经度
    • latitude 维度
    • member 元素名称
  • GEOPOS {key} {member} [{member}…]
    • 获取一或多个成员的经纬度信息
  • GEODIST {key} {member1} {member2} [m|km|ft|mi]
    • 获取多个两个成员之间的距离,可指定距离单位格式化输出
  • GEORADIUS {key} {longitude} {latitude} {radius} [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT {count}]
    • 该命令可以根据给定地理位置坐标获取指定范围内的地理位置集合
    • radius 距离范围,参数后可选择距离单位
    • WITHCOORD 传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度
    • WITHDIST 传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离
    • ASC|DESC 默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序
    • WITHHASH 传入WITHHASH参数,则返回结果会带上匹配位置的hash值
    • count 传入COUNT参数,可以返回指定数量的结果
      • GEORADIUSBYMEMBER {key} {member} {radius} [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT {count}]
      • 该命令是根据某个成员的地理位置坐标获取指定范围内的地理位置集合 个性化参数与GEORADIUS命令基本相同。
      • GEOHASH {key} {member} [member …]
      • 获取某个成员的地理位置的geohash值

由于GEO数据保存在zset中,所以删除成员的操作可以使用redis的 zrem 命令来删除某个地理位置