redis的三个特殊数据结构(geospatial、bitmaps、hyperloglogs)

geospatial

应用:存储位置信息,可以很方便计算和管理位置信息
主要的命令有:geoadd、geopos、geodist、geohash、georadius、georadiusbymember

geoadd:添加一个或多个位置到一个key中
语法:geoadd key longitude latitude member [longitude latitude member ...]

localhost:6379> geoadd China:city 116.40 39.9 北京    # 添加一个位置
(integer) 1
localhost:6379> geoadd China:city 121.47 31.23 上海 120.15 30.28 杭州 113.27 23.13 广东    # 添加多个位置
(integer) 3
localhost:6379> zrange China:city 0 -1    # 查看用zrange,因为geo本质是一个有序集合
1) "\xe5\xb9\xbf\xe4\xb8\x9c"
2) "\xe6\x9d\xad\xe5\xb7\x9e"
3) "\xe4\xb8\x8a\xe6\xb5\xb7"
4) "\xe5\x8c\x97\xe4\xba\xac"
localhost:6379> exit
[root@VM_0_2_centos bin]# redis-cli -h localhost -p 6379 --raw    # --raw 解决中文乱码问题
localhost:6379> zrange China:city 0 -1
广东
杭州
上海
北京
localhost:6379> zrange China:city 0 -1 withscores
广东
4046533759716104
杭州
4054134257390783
上海
4054803462927619
北京
4069885360207904

geopos:查看某个key成员的地理位置
语法:geopos key member [member ...]

localhost:6379> geopos China:city 北京
116.39999896287918091
39.90000009167092543
localhost:6379> geopos China:city 北京 上海
116.39999896287918091
39.90000009167092543
121.47000163793563843
31.22999903975783553

geodist:计算两点之间的距离,可以选择计算单位,默认单位是m
语法:geodist key member1 member2 [m|km|ft|mi]

localhost:6379> geodist China:city 北京 上海
1067378.7564
localhost:6379> geodist China:city 北京 上海 m
1067378.7564
localhost:6379> geodist China:city 北京 上海 km
1067.3788

geohash:获取元素的 hash 值
geohash 可以获取元素的经纬度编码字符串,上面已经提到,它是 base32 编码。 你可
以使用这个编码值去 http://geohash.org/${hash}中进行直接定位,它是 geohash 的标准编码
值.
语法:geohash key member [member ...]

localhost:6379> geohash China:city 上海
wtw3sj5zbj0

获取hash码,请求链接http://geohash.org/wtw3sj5zbj0,结果如下

georadius:给定一个坐标点,查找附近指定距离范围内的元素,相当于附近的人
语法:georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
先查找安徽的坐标:117.25 , 31.83

localhost:6379> georadius China:city 117.25 31.83 500 km    # 查看方圆500km内的城市
杭州
上海
localhost:6379> georadius China:city 117.25 31.83 500 km withcoord  # withcoord  结果带上坐标
杭州
120.15000075101852417
30.2800007575645509
上海
121.47000163793563843
31.22999903975783553
localhost:6379> georadius China:city 117.25 31.83 500 km withdist    # withdist 带上距离
杭州
325.6740
上海
405.5792
localhost:6379> georadius China:city 117.25 31.83 500 km withdist count 1 asc    # 由近到远取一个
杭州
325.6740

georadiusbymember:与georadius功能相同,不同的是georadiusbymember的中心点是geo中的成员而不是经纬度
语法:georadiusbymember key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

localhost:6379> georadiusbymember China:city 上海 500 km withdist
杭州
164.5694
上海
0.0000

zrem:应为geo的本质是zset,所以删除也是用zrem

localhost:6379> zrange China:city 0 -1 
杭州
上海
北京
localhost:6379> zrem China:city 北京
1
localhost:6379> zrange China:city 0 -1 
杭州
上海

bitmaps

Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。
可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。

setbit:设置值
语法:setbit key offset value
理解:key是数组,offset是数组的下标,value是这个下标位置的状态值(0或1)

localhost:6379> setbit sign 0 0
0
localhost:6379> setbit sign 1 1
0
localhost:6379> setbit sign 2 1
0
localhost:6379> setbit sign 2 0    # 支持覆盖
1
localhost:6379> setbit sign 3 1
0
localhost:6379> setbit sign 4 0
0
localhost:6379> setbit sign 5 1
0
localhost:6379> setbit sign 6 0
0

getbit:获取key中一个下标的状态
语法:getbit key offset

localhost:6379> getbit sign 2
0

bitcount:统计一个key中状态为1的下标数量
语法:bitcount key [start end]

localhost:6379> bitcount sign    # 默认统计全部
3
localhost:6379> bitcount sign 0 3    # 统计指定下标范围
3

bitop:用来做bitmaps之间的运算
语法:
bitop operation destkey key [key ...]
operation:表明操作类型,有四个可选值

  • and:与
  • or:或
  • not:非
  • xor:异或

destkey:目标key,运算的结果会存到这里
key [key ...] 被运算的一个或多个bitmaps的key

localhost:6379> setbit sign 0 1
0
localhost:6379> setbit sign 1 1
0
localhost:6379> setbit sign2 0 1
0
localhost:6379> setbit sign2 1 0
0
localhost:6379> bitop and and-result sign sign2    # 获取sign和sign2的交集存入and-result
1
localhost:6379> getbit and-result 0
1
localhost:6379> bitop or or-result sign sign2    # 获取sign和sign2的并集存入or-result
1
localhost:6379> getbit or-result 0
1
localhost:6379> getbit or-result 1
1
localhost:6379> bitop not not-result sign2    # 将sign2中是0的值存入not-result
1
localhost:6379> getbit not-result 0
0
localhost:6379> getbit not-result 1
1
localhost:6379> bitop xor xor-result sign sign2    # 将sign和sign2的异或值存入xor-result
1
localhost:6379> getbit xor-result 0
0
localhost:6379> getbit xor-result 1
1

bitpos:计算Bitmaps中第一个值为targetBit的偏移量:
语法:bitpos key bit [start] [end]

localhost:6379> bitpos sign 1    # sing中第一个状态为1的下标
0
localhost:6379> bitpos sign 0    # sing中第一个状态为0的下标
2

小结:我们在生活中,或编程中,只要只有两个标志位(0 1)我们都可以考虑使用bitmaps来进行操作,这 样的话,十分方便,还有就是能够极大的节约内存!


hyperloglogs

hyperloglog 是用来做 基数统计 的,其优点是:输入的提及无论多么大,那hyperloglog 使用的空间总是固 定的12KB ,利用 12KB,它可以计算 2^64 个不同元素的基数! 非常节省空间!
应用例子:网页统计UV (浏览用户数量,同一天同一个ip多次访问算一次访问,目的是计数,而不是保存用户)

pfadd:添加元素
pfcount:统计基数
pfmerge: 合并多个数据集

localhost:6379> pfadd mykey a b c c c c c c d e
1
localhost:6379> pfadd mykey2 e f e d f c d s f d d d d d d
1
localhost:6379> pfcount mykey
5
localhost:6379> pfcount mykey2
5
localhost:6379> pfcount mykey mykey2
7
localhost:6379> pfmerge mergekey  mykey mykey2    # 合并mykey和mykey2写入到mergekey
OK
localhost:6379> pfcount mergekey
7

在需要对大数据进行不重复数统计时推荐用hyperloglogs,但是如果需要精确统计的话就不要使用,因为hyperloglogs存在1%左右的误差。

你可能感兴趣的:(redis的三个特殊数据结构(geospatial、bitmaps、hyperloglogs))