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

目录

Redis 三种特殊的数据类型:

Geospatial:地理位置

Geospatial类型常用的命令:

GEOADD:添加地理位置

GEOPOS:获取地理位置

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

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

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

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

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 ..... 

查看某一天是否打卡

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107645.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux —— 信号阻塞

目录 一,信号内核表示 sigset_t sigprocmask sigpending 二,捕捉信号 sigaction 三,可重入函数 四,volatile 五,SIGCHLD 信号常见概念 实际执行信号的处理动作,称为信号递达Delivery;信…

【实例项目:基于多设计模式下的日志系统(同步异步)】

本项目涉及的到所有源码见以下链接: https://gitee.com/ace-zhe/wz_log 一、项目简介 1.日志的概念(白话版) 日志类似于日记,通常是指对完成某件事情的过程中状态等的记录,而计算机中的日志是指日志数据&#xff0c…

centos编译升级cmake,痛苦的Linux小白

环境 root 用户 下载 cmake官网下载地址:https://cmake.org/download/ 获取下载地址,右击cmake-3.27.4.tar.gz 命令行输入链接地址,下载 wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4.tar.gz解压 tar -zx…

Docker基础-cgroup

cgroup cgroup什么是 cgroups为什么使用 cgroupscgroups 的用途cgroups 可以控制的子系统基础命令pidstatstress cgroup试验cgroups 信息查看cgroups 版本查看cgroups 子系统查看cgroups 挂载信息查看查看一个进程上的 cgroup 限制 使用 cgroups 对内存进行控制使用 cgroups 对…

新加坡市场最全开发攻略

作为东盟经济的“发动机”!新加坡是继纽约、伦敦、香港之后的第四大国际金融中心。据《2022年全球竞争力》报告显示,新加坡是亚洲地区排名最高的,位列全球三甲之一。 同时,新加坡作为东盟(ASEAN)的核心成员国,还是世贸…

算法:经典贪心算法--跳一跳[2]

1、题目: 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 返回到达 nums[n - 1] 的最小跳跃次数。生…

Hugging News #0904: 登陆 AWS Marketplace

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

Android离线文字识别-tesseract4android调用

Android在线文字识别可以调阿里云的接口Android文字识别-阿里云OCR调用__花花的博客-CSDN博客 需要离线文字识别的话,可以调tesseract4android。个人测试效果不是特别理想,但是速度真的很快,VIVO S10后摄照片,80ms内识别完成。现…

王道考研计算机网络

文章目录 计算机网络体系结构计算机网络概述计算机网络的性能指标 计算机网络体系结构与参考模型错题 物理层通信基础基础概念奈奎斯特定理和香农定理编码与调制电路交换、报文交换和分组交换数据报与虚电路 传输介质物理层设备错题 数据链路层数据链路层的功能组帧差错控制检错…

二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了,这里是文章链接 https://blog.csdn.net/qq_45894840/article/details/129490504?spm1001.2014.3001.5501什么是缓冲区溢出 当系统向缓冲区写入的数据多于它可以容纳的数据时,…

从0到1理解ChatGPT原理

目录 写在前面 1.Tansformer架构模型 2.ChatGPT原理 3.提示学习与大模型能力的涌现 3.1提示学习 3.2上下文学习 3.3思维链 4.行业参考建议 4.1拥抱变化 4.2定位清晰 4.3合规可控 4.4经验沉淀 机械工业出版社京东自购链接 写在前面 2022年11月30日,ChatG…

【C语言】库宏offsetof

一.offsetof简介 因此,宏offsetof的作用是: 当你传入结构体的类型及其成员时,它会返回该成员在结构体中的偏移量. 二.offsetof的使用 如下,我们使用offsetof打印一下结构体foo中,成员a,成员b及成员c相对于首地址的偏移量分别是多少: #include <stdio.h> #include …