【Redis】Redis三种特殊数据类型(geospatial,hyperloglog,Bitmaps)

三种特殊数据类型(geospatial,hyperloglog,Bitmaps)

geospatial

geoadd 添加地理位置信息

该命令以采用标准格式的参数x y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001规定如下:
有效的经度从-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 127.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 108.94 34.26 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.26 30.24 hangzhu
(integer) 1

geopos 获取指定城市的经度和纬度

127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"

geodist 获取指定城市之间的距离,单位自选

127.0.0.1:6379> geodist china:city beijing xian km
"911.3409"

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

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km	#以110,30这个经纬度为中心,寻找方圆1000km内的城市
1) "xian"
2) "shenzhen"
3) "hangzhu"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist	#显示到中间距离的位置
1) 1) "xian"
   2) "484.2186"
2) 1) "shenzhen"
   2) "924.6408"
3) 1) "hangzhu"
   2) "987.1218"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord
1) 1) "xian"
   2) 1) "108.93999785184860229"
      2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist count 2	#筛选出指定的结果!
1) 1) "xian"
   2) "484.2186"
2) 1) "shenzhen"
   2) "924.6408"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km	#以北京为中心,找出半径1000km内的城市
1) "beijing"
2) "xian"

geohash 将城市的经纬度转换为11个字符的字符串,如果两个字符串越接近,则距离越近

127.0.0.1:6379> geohash china:city shanghai xian
1) "wvd9sthzfm0"
2) "wqj6yuzdvy0"

geo底层就是zset,可以使用zset来操作geo

127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhu"
4) "shanghai"
5) "beijing"

127.0.0.1:6379> zrem china:city shanghai
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhu"
4) "beijing"

hyperloglog

基数

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

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

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

Redis 2.8.9版本就更新了Hyperloglog数据结构。Redis Hyperloglog基数统计的算法

  • 优点∶占用的内存是固定,2^64不同的元素的基数,只需要用12KB内存!如果要从内存角度来比较的话,Hyperloglog首选

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

传统的方式,set保存用户的id,然后就可以统计set 中的元素数量作为标准判断。这个方式如果保存大量的用户id,就会比较麻烦。目的是为了计数,而不是保存用户id 。

Hyperloglog会有0.81%的错误率,但对于统计任务来说,可忽略不计。

127.0.0.1:6379> PFADD mycount 1 2 3 4 5 6 7 8 9	#创建第一组元素mykey

(integer) 1
127.0.0.1:6379> PFCOUNT mycount	#计数mycount元素个数
(integer) 9
127.0.0.1:6379> pfadd mycount2 2 6 5 47 8 9 1 2 3
(integer) 1
127.0.0.1:6379> pfcount mycount2
(integer) 8
127.0.0.1:6379> PFMERGE mycount3 mycount mycount1	#合并mycount mycount1至mycount3
OK
127.0.0.1:6379> PFCOUNT mycount3
(integer) 9

综上比较:

允许容错,则可以使用hyperloglog
如果不允许,就使用set或自定义数据类型

Bitmaps

位储存

bitmaps:位图,数据结构。都是通过二进制位来进行记录。

统计用户信息,活跃/不活跃。

setbit (setbit 图名 位置 值 )设置位图某一位置的值

getbit 获取某一位置的值

统计一周七天打卡情况(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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(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 4
(integer) 0

【Redis】Redis三种特殊数据类型(geospatial,hyperloglog,Bitmaps)_第1张图片

你可能感兴趣的:(【Redis】,java,redis,数据库,linux)