redis


Geospatial(地理空间)


定位?打车距离?

Redis 的 GEO 可以计算地理位置信息,两地距离等等

GEO 很简单,只有以下六个命令:

  • GETADD
  • GEODIST
  • GETHASH
  • GEOPOS
  • GEORADIUS
  • GEORAIDUSBYMEMBER

GETADD

GEOADD key longitude latitude member:添加地理空间,longitude:经度,latitude:纬度,注意两级地址(北极、南极)不能添加

1
2
3
4
5
6
7
8
9
10
11
12
hominsu-redis-docker:0>GEOADD china:city 116.23 40.22 beijing
"1"
hominsu-redis-docker:0>GEOADD china:city 121.48 31.40 shanghai
"1"
hominsu-redis-docker:0>GEOADD china:city 104.1 30.65 chengdu
"1"
hominsu-redis-docker:0>GEOADD china:city 113.27 23.15 guangzhou
"1"
hominsu-redis-docker:0>GEOADD china:city 113.88 22.55 shenzhen
"1"
hominsu-redis-docker:0>GEOADD china:city 102.82 24.88 kunming
"1"

GETPOS

GEOPOS key member [member ...]:查询 member 的经纬度

1
2
3
hominsu-redis-docker:0>GEOPOS china:city kunming
1) 1) "102.82000154256820679"
2) "24.88000038305494144"

GEOHASH

GEOHASH key member [member ...]:将经纬度转换成一个 11 个字符的 GeoHash 字符串

1
2
3
hominsu-redis-docker:0>GEOHASH china:city guangzhou kunming
1) "ws0e9w2dw20"
2) "wk3je9r0x80"

GEODIST

GEODIST key member1 member2 [unit]:查询两个位置之间的距离,unit 为单位,可选项如下所示:

  • m:米
  • km:千米
  • mi:英里
  • ft:英尺
1
2
3
4
hominsu-redis-docker:0>GEODIST china:city kunming guangzhou m
"1078695.8807"
hominsu-redis-docker:0>GEODIST china:city kunming guangzhou km
"1078.6959"

GEORADIUS

GEORADIUS key longitude latitude radius unit [withcoord] [withdist] [withhash] [count] :获取以某个指定位置的半径范围内的其他位置,参数如下:

  • longitude:经度,
  • latitude:纬度,
  • radius:半径大小
  • unit:单位,
  • [withcoord]:返回值中加上经纬度,
  • [withdist]:返回值中加上直线距离,
  • [withhash]:返回值加上半径中其他位置的 Hash
  • [count]:指定查询数量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
hominsu-redis-docker:0>GEORADIUS china:city 100 30 1000 km withcoord withdist withhash
1) 1) "kunming"
2) "633.7973"
3) "4021126527066087"
4) 1) "102.82000154256820679"
2) "24.88000038305494144"


2) 1) "chengdu"
2) "400.1909"
3) "4026137819636205"
4) 1) "104.09999996423721313"
2) "30.6499990746355806"
hominsu-redis-docker:0>GEORADIUS china:city 100 30 1000 km withcoord withdist withhash count 1
1) 1) "chengdu"
2) "400.1909"
3) "4026137819636205"
4) 1) "104.09999996423721313"
2) "30.6499990746355806"

GEORAIDUSBYMEMBER

GEORADIUSBYMEMBER key member radius unit [withcoord] [withdist] [withhash] [count] :获取位置空间中指定某一个位置的半径范围内的其他位置,参数如下:

  • member:位置,
  • unit:单位,
  • radius:半径大小
  • [withcoord]:返回值中加上经纬度,
  • [withdist]:返回值中加上直线距离,
  • [withhash]:返回值加上半径中其他位置的 Hash
  • [count]:指定查询数量
1
2
3
4
5
6
7
8
9
10
11
12
13
hominsu-redis-docker:0>GEORADIUSBYMEMBER china:city chengdu 1500 km withcoord withdist withhash count 2
1) 1) "chengdu"
2) "0.0000"
3) "4026137819636205"
4) 1) "104.09999996423721313"
2) "30.6499990746355806"


2) 1) "kunming"
2) "654.0043"
3) "4021126527066087"
4) 1) "102.82000154256820679"
2) "24.88000038305494144"

GEO 其他操作

GEO 底层是通过 Sorted Sets(有序序列)实现的,因此可以使用 Sorted Sets 的命令来操作 GEO

通过 ZRANGE 来获取全部的城市名称

1
2
3
4
5
6
7
hominsu-redis-docker:0>ZRANGE china:city 0 -1
1) "kunming"
2) "chengdu"
3) "shenzhen"
4) "guangzhou"
5) "shanghai"
6) "beijing"

通过 ZREM 来移除城市

1
2
3
4
5
6
7
8
hominsu-redis-docker:0>ZREM china:city beijing
"1"
hominsu-redis-docker:0>ZRANGE china:city 0 -1
1) "kunming"
2) "chengdu"
3) "shenzhen"
4) "guangzhou"
5) "shanghai"

ZCARD:查询元素个数

1
2
hominsu-redis-docker:0>ZCARD china:city
"5"

HyperLogLogs


基数:集合之间不重复的元素个数(去重后的元素个数)

A { 1, 3, 5, 7 }

B { 3, 5, 7, 9 }

基数 = 5

应用:访问统计

⚠️注意:HyperLogLogs 有错误率,能接受错误的应用场景才能使用 HyperLogLogs,否则就使用 Sets

添加和统计

PFADD key element [element]:创建一组元素

PFCOUNT key:创建元素个数

1
2
3
4
5
6
7
8
hominsu-redis-docker:0>PFADD key a b c d e f g h i j
"1"
hominsu-redis-docker:0>PFCOUNT key
"10"
hominsu-redis-docker:0>PFADD key2 q w e r t y u i o p
"1"
hominsu-redis-docker:0>PFCOUNT key
"10"

合并

PFMEERGE destkey sourcekey [sourcekey ...]:合并

1
2
3
4
hominsu-redis-docker:0>PFMERGE key3 key key2
"OK"
hominsu-redis-docker:0>PFCOUNT key3
"17"

Bitmaps


位储存(只有 0、1 两个状态),只有两个状态就可以使用 Bitmaps

统计用户信息:活跃、不活跃,登录、未登录等等

SETBIT

SETBIT key offset valueoffset 是操作的偏移地址

设置一个每个星期的打卡检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
hominsu-redis-docker:0>SETBIT sign 0 0
"0"
hominsu-redis-docker:0>SETBIT sign 1 0
"0"
hominsu-redis-docker:0>SETBIT sign 2 0
"0"
hominsu-redis-docker:0>SETBIT sign 3 1
"1"
hominsu-redis-docker:0>SETBIT sign 4 0
"0"
hominsu-redis-docker:0>SETBIT sign 5 1
"1"
hominsu-redis-docker:0>SETBIT sign 6 0
"0"

GETBIT

GETBIT key offset:获取某个偏移地址中保存的值

1
2
3
4
5
6
hominsu-redis-docker:0>GETBIT sign 3
"1"
hominsu-redis-docker:0>GETBIT sign 0
"0"
hominsu-redis-docker:0>GETBIT sign 5
"1"

BITCOUNT

BITCOUNT key:统计值为 1 的位

1
2
hominsu-redis-docker:0>BITCOUNT sign
"2"