> 文章列表 > redis笔记——三种特殊的数据结构

redis笔记——三种特殊的数据结构

redis笔记——三种特殊的数据结构

三种特殊数据类型

geospatial(地理位置)

用于定位,附近的人,距离计算

添加元素

geoadd key 经度 纬度 描述名称,可一次添加多个元素

127.0.0.1:6379> geoadd china:city 113.28 23.12 guangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 106.50 29.53 chongqi 114.05 22.52 sshengzhen
(integer) 3

获取元素

获取key中某个字段的经纬度,可一次获取多个字段的经纬度

127.0.0.1:6379> geopos china:city guangzhou chongqi
1) 1) "113.27999979257583618"2) "23.1199990030198208"
2) 1) "106.49999767541885376"2) "29.52999957900659211"

计算两点之间的距离

跟上km参数表示结果使用千米作为单位。参数m表示米

127.0.0.1:6379> geodist china:city guangzhou chongqi km
"981.9531"

实现看我附近的人功能

georadius以给定的经纬度为中心,查找某一半径内的元素

#从china:city集合中查找 以经纬度为110 30为圆心,1000km内的所有的元素
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqi"
2) "sshengzhen"
3) "guangzhou"

参数

  • withdist,附近的人并且显示两点的直线距离
  • withcoord,同时显示找到的元素的经纬度

指定geospatial类型元素进行查询

127.0.0.1:6379> georadiusbymember china:city guangzhou 1000 km
1) "sshengzhen"
2) "guangzhou"
3) "chongqi"

geohash

该命令会返回一个由经纬度编码的hash值

127.0.0.1:6379> geohash china:city guangzhou chongqi
1) "ws0e98zgz20"
2) "wm5xzrybty0"

geospatial底层实现其实就是zset

那么我们就可以使用zset 的命令来操作geospatial类型,比如删除元素,获取成员列表

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqi"
2) "sshengzhen"
3) "guangzhou"
4) "shanghai"
127.0.0.1:6379> zrem china:city chongqi
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "sshengzhen"
2) "guangzhou"
3) "shanghai"

Hyperloglog

一种数据结构,优点是节省内存空间,可以用来计数,例如统计网站的用户访问量(UV)。但是会出现一定的错误率,要在允许容错的情况下使用

127.0.0.1:6379> pfadd key1 a b c d e f g h i j #添加hyperloglog
(integer) 1
127.0.0.1:6379> pfcount key1  #统计key中的元素个数
(integer) 10
127.0.0.1:6379> pfadd key2 i j z x c v b n m
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 9
127.0.0.1:6379> pfmerge key3 key1 key2  #将多个key做并集操作,第一个参数就是输出的key
OK
127.0.0.1:6379> pfcount key3
(integer) 15

bitmaps

位图,通过操作二进制位来表示信息,一个位只有两个表示0、1,可以用来统计用户信息,例如用户登陆状态、活跃状态等

127.0.0.1:6379> setbit sign 0 1  #存储位
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> getbit sign 0   #获取位
(integer) 1
127.0.0.1:6379> getbit sign 2
(integer) 0
127.0.0.1:6379> bitcount sign  #统计所有位为1的数量
(integer) 2