Redis 特殊数据类型

一、Geo

Geo,即地理位置,核心原理是使用 GeoHash 这种地理空间位置编码方法,将二维的地理空间位置的经度、纬度、名称编码成一维字符串,GeoHash 表示的是一个区域。

可以用来计算两个位置之间的距离(测距),某位置周围一定距离有哪些位置(实现附近的人、车辆功能)等。

经纬度可以通过座标拾取工具 http://api.map.baidu.com/lbsapi/getpoint/index.html 来获取

  • geoadd:添加地理位置(经度、纬度、名称),可以一次添加一个或多个
geoadd sights 108.971152 34.225619 dayanta
geoadd sights 108.95346 34.265725 zhonglou
geoadd sights 109.2851 34.389417 bingmayong
geoadd sights 108.779778 34.210991 kunmingchi 110.073028 34.497647 huashan
  • geopos:根据地理位置名称获取对应经纬度,存储的经纬度和获取的在精度上有所差异。
geopos sights zhonglou
  • geodist:计算两个地理位置之间的距离,可以指定距离的单位:m、km、mi、ft
geodist sights dayanta zhonglou km
  • georadiusbymember:我们举例来说明该指令的用法,以zhonglou为中心,查找其方圆50km范围内距离最近的3个地理位置,并按照距离升序排列,withdist参数表示返回对应的距离,该命令返回结果不会排除指定的中心地理位置
georadiusbymember sights zhonglou 50 km withdist count 3 asc
  • georadius:和 georadiusbymember 功能类似,但是需要指定中心位置的经纬度,而不是指定中心位置的名称
georadius sights 108.95346 34.265725 50 km withdist count 3 asc
  • geohash:返回地理位置经纬度对应的11位geohash编码字符串
 geohash sights zhonglou
  • 移除地理位置:官方并未直接提供移除的命令,但是,由于 GeoHash 底层是基于 ZSet 实现的,我们可以使用zrem 命令来移除
zrem sights huashan

二、HyperLogLog

如果需要统计一个网站的 UV,数据量较少的情况下可以使用Set实现,但如果是百万甚至千万级别的 UV 则会消耗大量的内存空间,效率低。更好的办法是使用 HyperLogLog,它是一种不精确的数据去重、统计方案,统计结果可能存在最大0.81%的误差,最多需要12kb的内存空间,效率高,UV 统计结果也允许有一定误差,就可以考虑使用 HyperLogLog。

  • pfadd:添加数据记录

  • pfcount:统计数据

  • pfmerge:根据 key 将多个 HyperLogLog 合并成一个新的 HyperLogLog,如下根据 uv uv2 合并一个新的 uv3:

pfmerge uv3 uv uv2

三、Bitmap

Bitmap,位图,不是一种实际的数据类型,而是在 String 类型基础上定义的位操作。在 Redis 中,字符串最终也是以二进制01组合的形式存储的,Bitmap 相关命令就是用来操作二进制数据的。可以用来存储一些只有两种状态的数据,例如签到、打卡数据,效果高而且节省空间,比如要记录某个用户一年365天的打卡记录,只需要365bit,约46byte。

  • setbit:设置 key 对应 value 在指定 offset(偏移量,从0开始) 位置的 bit(0、1)值。
    比如我们记录某个用户一周内每天的签到情况,0表示未签到,1表示签到:
setbit sign 0 1
  • getbit:获取 key 对应 value 在指定 offset 位置的 bit 值,如下获取用户一周内某一天的签到情况:
getbit sign 1
  • bitcount:统计在指定 offset 范围内,二进制数据中1的个数,如下统计用户一周内签到的天数:
bitcount sign 0 6
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章