3、Redis:Redis的三种特殊数据类型

文章目录

  • 1、Geospatial地理位置详解
  • 2、Hyperloglog基数统计
  • 3、Bitmap位图场景详解

1、Geospatial地理位置详解

Redis的Geo在Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人

精度维度查询工具:网站

相关命令

  • GEOADD
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

1、getadd:添加地理位置

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作

该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001规定如下:

  • 有效的经度从``-180度到180度`。
  • 有效的纬度-85.05112878度到85.05112878度
  • 当坐标位置超出上述指定范围时,该命令将会返回一个错误
  • 参考文档:官网
  • key(精度 纬度)

规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!!!

1.1、设置值

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.56 29.53 chongqin
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzheng 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
127.0.0.1:6379>

1.2、获取指定城市的精度和纬度

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

2、geodist:返回两个给定位置之间的距离

单位

  • m 表示单位为米
  • km 表示单位为千米
  • mi 表示单位为英里
  • ft 表示单位为英尺
127.0.0.1:6379> geodist china:city beijing shanghai # 查看上海到比较的直线距离
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379>

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

前提:所有数据都应录入,才会让结果更加清晰

127.0.0.1:6379> GEORADIUS china:city 110 30 500 km # 以110,30 这个经纬度为中心,寻找方圆500km内的城市
1) "chongqin"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 5000 km # 显示到110,30距离的位置
1) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 显示他人的定位信息
1) 1) "chongqin"
   2) "336.2141"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 帅选出指定的结果
1) 1) "chongqin"
   2) 1) "106.55999869108200073"
      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 withdist withcoord count 1 # 帅选出指定的结果
1) 1) "chongqin"
   2) "336.2141"
   3) 1) "106.55999869108200073"
      2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2 # 帅选出指定的结果
1) 1) "chongqin"
   2) "336.2141"
   3) 1) "106.55999869108200073"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> 

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

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km # 找出距离北京1000km的城市
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> 

5、geohash:返回一个或多个位置元素的 Geohash 表示(了解即可)

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

# 将二维的经纬度转换成一维的字符串,如果两个字符串越接近,那么距离越近
127.0.0.1:6379> geohash china:city beijing 
1) "wx4fbxxfke0"
127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5zbzf8ey0"
127.0.0.1:6379> 

GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo

127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中全部的元素
1) "chongqin"
2) "xian"
3) "shenzheng"
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) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379>

2、Hyperloglog基数统计

先介绍一下什么是基数:不重复的元素

Redis 2.8.9版本就更新了Hyperloglog数据结构!

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

测试使用

127.0.0.1:6379> PFADD mykey a b c d e f g h i j # 创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey # 统计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
OK # 合并两组 mykey mykey2 ==> mykey3
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
127.0.0.1:6379> 
  • 如果允许容错,那么一定可以使用Hyperloglog
  • 如果不允许容错,就使用set或者自己的数据类型即可

3、Bitmap位图场景详解

	位存储

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

3、Redis:Redis的三种特殊数据类型_第1张图片

使用Bitmap来记录周一到周日的打卡,1是打卡,0是没有打卡

3、Redis:Redis的三种特殊数据类型_第2张图片
查看某一天是否打卡

127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> 

统计操作,统计打卡的天数

127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤
(integer) 3
127.0.0.1:6379> 

学习视频:走你

你可能感兴趣的:(Redis,redis)