Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)

目录

[Redis 三种特殊的数据类型:](#Redis 三种特殊的数据类型:)

Geospatial:地理位置

Geospatial类型常用的命令:

GEOADD:添加地理位置

GEOPOS:获取地理位置

GEODIST:返回两个给定位置之间的距离

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

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

GEOHASH:返回一个或多个位置元素的Geohash表示

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

Hyperloglog:基数统计的算法

例如:

Bitmaps:位图(位存储)

例如:


Redis 三种特殊的数据类型:

Geospatial:地理位置

Hyperloglog:基数统计的算法

Bitmaps:位图(位存储)

Geospatial:地理位置

如我需要查询朋友的定位,附近的人,打车所需距离的计算?

这个功能可以推算地理位置的信息,比如说两地之间的距离,方圆几里之内的人

可以查询一些测试数据:全国城市经纬度查询-知之小工具 (100xgj.com)

Geospatial类型常用的命令:

GEOADD:添加地理位置

#规则:两极是无法直接添加的,我们一般会下载城市数据,直接通过java或者python程序导入!

按照(经度 纬度 名称)填写哦!!
如果写错了,可以通过flushdb刷新redis数据库,并通过clear清理页面

127.0.0.1:6379> GEOADD china:city 39.54 116.28 Beijin
(error) ERR invalid longitude,latitude pair 39.540000,116.280000
如果出现了如上错误,说明我们写的经纬度超出范围了


127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> GEOADD china:city 116.28 39.54 Beijin
(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
(integer) 1
127.0.0.1:6379> GEOADD china:city 113.18 23.10 Guangzhou 114.05 22.52 Shengzhen
(integer) 2

GEOPOS:获取地理位置

127.0.0.1:6379> GEOPOS china:city Beijin  # 获取指定城市的经度和纬度
1) 1) "116.28000229597091675"
   2) "39.54000124957348561"
127.0.0.1:6379> 
127.0.0.1:6379> GEOPOS china:city Beijin
1) 1) "116.28000229597091675"
   2) "39.54000124957348561"
127.0.0.1:6379> GEOPOS china:city Beijin Chongqing
1) 1) "116.28000229597091675"
   2) "39.54000124957348561"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
127.0.0.1:6379> 

GEODIST:返回两个给定位置之间的距离

单位:

m表示单位为米。

km表示单位为千米。

mi表示单位为英里。

ft表示单位为英尺。

127.0.0.1:6379> GEODIST china:city Beijin Shanghai
"1036715.8809"
127.0.0.1:6379> 
127.0.0.1:6379> GEODIST china:city Beijin Shanghai KM  #表示千米
"1036.7159"
127.0.0.1:6379> 

如何查看我附近的人呢?(获得所有的附近的人的地址,定位!通过半径来查询!)

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

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM  #以110 30 这个经度纬度作为中心点。
1) "Chongqing"
2) "Shengzhen"
3) "Guangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 KM
1) "Chongqing"
127.0.0.1:6379> 
127.0.0.1:6379> GEORADIUS china:city 110 30 500 KM withdist  # 显示到中心的距离
1) 1) "Chongqing" 
   2) "341.9374"
127.0.0.1:6379> 
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 1  #限制查看的数量
1) 1) "Chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 2
1) 1) "Chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "Guangzhou"
   2) "829.9936"
   3) 1) "113.18000167608261108"
      2) "23.10000005307264104"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 3
1) 1) "Chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "Guangzhou"
   2) "829.9936"
   3) 1) "113.18000167608261108"
      2) "23.10000005307264104"
3) 1) "Shengzhen"
   2) "924.6408"
   3) 1) "114.04999762773513794"
      2) "22.5200000879503861"
127.0.0.1:6379> 

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

127.0.0.1:6379> GEORADIUSBYMEMBER china:city Chongqing 1000 km
1) "Chongqing"
2) "Guangzhou"
127.0.0.1:6379> 

GEOHASH:返回一个或多个位置元素的Geohash表示

# 将二维的字符串转换为一维的字符串,如果两个字符串接近,那么距离越近
127.0.0.1:6379> GEOHASH china:city Beijin Chongqing
1) "wx48yn090q0"
2) "wm5xzrybty0"
127.0.0.1:6379> 

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

127.0.0.1:6379> ZRANGE china:city 0 -1  # 查看地图中所有的元素
1) "Chongqing"
2) "Shengzhen"
3) "Guangzhou"
4) "Shanghai"
5) "Beijin"
127.0.0.1:6379> ZREM china:city Beijin  # 移除元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "Chongqing"
2) "Shengzhen"
3) "Guangzhou"
4) "Shanghai"
127.0.0.1:6379> 

Hyperloglog:基数统计的算法

基数是什么?

基数是用来表示一个集合中元素个数的概念。它通常用于描述集合的大小或元素的数量。基数可以是非负整数,包括零。基数为零表示集合是空的,没有元素。

  • 如果一个集合包含了3个元素,那么它的基数是3。
  • 如果一个集合为空,那么它的基数是0。

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

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

这个方式如果保存大量的用户id,就会比较麻烦!因为我们的目的是计数用户数量,而并不是用来保存用户id的。

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

例如:

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 mykey2 i jz x c v b n m  # 创建第二组元素 mykey2
(integer) 1
127.0.o.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379>PFMERGE mykey3 mykey mykey2   #合并两组 mykey mykey2 => mykey3并集
OK
127.0.0.1:6379> PFCOUNT mykey3   #看并集的数量!
(integer) 15

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

如果不允许容错,就使用set或者自己的数据类型即可!

Bitmaps:位图(位存储)

统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps !

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

例如:

使用bitmap来记录周一到周日的打卡!

周一:1 周二:0 周三:0 周四: 1 .....

查看某一天是否打卡

统计操作:统计打卡的天数(只有三天打卡了)

相关推荐
pen-ai1 分钟前
【SQL】一文速通SQL
数据库·sql
q567315232 小时前
用 PHP或Python加密字符串,用iOS解密
java·python·ios·缓存·php·命令模式
DC_BLOG2 小时前
Mysql-DDL语句
服务器·数据库·mysql
努力遇见美好的生活2 小时前
Mysql每日一题(行程与用户,困难※)
android·数据库·mysql
卫生纸不够用3 小时前
远程链接mysql步骤
数据库·mysql
只是有点小怂3 小时前
直接缓存映射Direct Mapped Cache
缓存
小兜全糖(xdqt)3 小时前
nuget 管理全局包、缓存和临时文件夹
缓存
夏小花花3 小时前
postgresql 创建序列
数据库·postgresql
Allen Bright3 小时前
Redis介绍
数据库·redis·缓存
engchina3 小时前
Oracle ADB 导入 BANK_GRAPH 的学习数据
数据库·学习·oracle·graph