目录

三种特殊数据类型

Geospatial

可以推算地理位置信息,方圆几里的人

geoadd 添加地理信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 添加地理位置
# 规则:两极无法直接添加,一般会下载城市数据,直接通过java程序一次性导入。
# 参数 key 值(经度、纬度、名称)
# 有效经度从-180度到180度
# 有效纬度从-85.05112878度到85.05112878度
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 4

geopos从key里返回所有给定位置元素的位置(经度和纬度)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.49999767541885376"
   2) "29.52999957900659211"
127.0.0.1:6379> geopos china:city shengzhen hangzhou
1) 1) "114.04999762773513794"
   2) "22.5200000879503861"
2) 1) "120.1600000262260437"
   2) "30.2400003229490224"

deodist返回两个给顶顶位置之间的距离

单位:

m表示单位为米

km表示单位为千米

mi表示单位为英里

ft表示单位为英尺

1
2
3
4
5
# 直线距离
127.0.0.1:6379> geodist china:city shanghai beijing
"1067378.7564"
127.0.0.1:6379> geodist china:city shanghai beijing km 
"1067.3788"

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist	# 显示距离
1) 1) "chongqing"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord	# 显示经纬度
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km count 1	# 显示指定数量
1) "chongqing"

georadiusbymember找出位于指定范围内的元素,中心点是由给定的位置元素决定

1
2
3
4
5
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 400 km
1) "xian"

geohash返回一个或者多个位置元素的geohash值

该命令将返回11个字符的geohash字符串

1
2
3
4
# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越接近
127.0.0.1:6379> GEOHASH china:city shanghai beijing
1) "wtw3sj5zbj0"
2) "wx4fbxxfke0"

GEO底层的实现原理其实是Zset,可以使用zset命令来操作geo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"

Hyperloglog

什么是基数?

A{1, 3, 5, 7, 8, 7}

B{1, 3, 5, 7, 8}

基数(不重复的元素)=5,可以接受误差

简介(布隆过滤器)

Redis Hyperloglog基数统计的算法

优点:占用的内存数固定的,2^64不同的元素的技术,只需耗费12KB内存,如果从内存角度来比较的话Hyperloglog首选。

但是有0.81%的错误率。

网页的UV(一个人访问一个网站多次,但还是算作一个人)

传统的方式:色图保存用户的id,然后就可以统计set中的元素数量作为标准判读!

这个方式如果保存大量的用户id,就会比较麻烦。但目的是为了计数,而不是保存用户id,因此会浪费大量内存。

使用Hyperloglog可以忽略其错误率。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> pfadd mykey a b c d e f g h i j	# 创建第一组元素mykey
(integer) 1
127.0.0.1:6379> pfcount mykey	# 统计mykey元素的基数数量(非重复)
(integer) 10
127.0.0.1:6379> pfadd mykey a
(integer) 0
127.0.0.1:6379> pfcount mykey
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2	# 合并多组到mykey3
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
127.0.0.1:6379> pfcount mykey
(integer) 10

如果允许容错,那么一定可以使用Hyperloglog。

如果不允许出错,就是用set或者自己的数据类型即可。

Bitmap

位存储(0或1)

统计用户信息:活跃,不活跃;登录,未登录;打卡,未打卡。

两个状态的都可以使用Bitmap

Bitmaps位图,数据结构,都是操作二进制位来进行记录,只有0和1两个状态。

测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 使用bitmap来记录周一到周日的打卡
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(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 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
# 查看某一天是否有打卡
127.0.0.1:6379> getbit sign 3
(integer) 0
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> getbit sign 0
(integer) 1
# 统计操作,统计打卡的天数
127.0.0.1:6379> bitcount sign 0 3
(integer) 3