Redis三种特殊数据类型

geospatial 地理位置

朋友的定位, 附近的人, 打车的距离计算
Redis的Geo在Redis3.2版本就推出了.这个功能可以推算地理位置信息, 两地之间的距离, 方圆几里的人
首先需要一个城市经度纬度查询工具 自行百度搜索

只有六个命令

相关命令
GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

getadd

添加地理位置
规则:两级无法添加, 我们一般会下载城市数据, 直接通过java程序一次性导入
参数key 值(纬度、经度、名称)

具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
(error) ERR invalid longitude,latitude pair 39.900000,116.400000

GEOADD

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
(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.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
127.0.0.1:6379>

GEOPOS

获取当前位置定位: 一定是一个坐标值!

127.0.0.1:6379> geopos china:city beijing   # 获取指定城市的经度纬度
1) 1) "116.39999896287918"2) "39.900000091670925"
127.0.0.1:6379> geopos china:city beijing chongqing     # 获取指定城市的经度纬度
1) 1) "116.39999896287918"2) "39.900000091670925"
2) 1) "106.49999767541885"2) "29.529999579006592"
127.0.0.1:6379>

GEODIST

获取当前位置定位: 一定是一个坐标值!

127.0.0.1:6379> geopos china:city beijing   # 获取指定城市的经度纬度
1) 1) "116.39999896287918"2) "39.900000091670925"
127.0.0.1:6379> geopos china:city beijing chongqing     # 获取指定城市的经度纬度
1) 1) "116.39999896287918"2) "39.900000091670925"
2) 1) "106.49999767541885"2) "29.529999579006592"
127.0.0.1:6379>

GEODIST

两人之间的距离
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:

  • 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> GEODIST china:city beijing chongqing
"1464070.8051"
127.0.0.1:6379>

GEORADIUS

附近的人(获取所有附近的人的地址, 定位! )通过半径来查询
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

所有数据都应该录入: china:city 才会让结果更加的准确

127.0.0.1:6379> georadius china:city 110 30 1500 km     # 获取 110 30 这个经纬度为中心  寻找方圆1000km 内的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379>georadius china:city 110 30 150 km withdist          # 显示到中间距离的位置
127.0.0.1:6379> georadius china:city 110 30 150 km withcoord        # 显示他人的定位信息
127.0.0.1:6379> georadius china:city 110 30 150 km withdist withcoord count 2       # 筛选指定的结果
(empty list or set)
127.0.0.1:6379>

GEORADIUSBYMEMBER

找出位于指定元素周围元素的其他元素.

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379>

GEOHASH

命令返回一个或多个位置的geohash表示
该命令将返回11个字符的Geohash字符串

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

GEO底层实现原理

其实就是Zset 我们可以使用Zset命令来操作geo

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379>

HyperLogLogs

什么是基数

基数(cardinality,也译作势),是指一个集合(这里的集合允许存在重复元素,与集合论对集合严格的定义略有不同,如不做特殊说明,本文中提到的集合均允许存在重复元素)中不同元素的个数。例如看下面的集合:

A{1, 2, 3, 4, 5, 2, 3, 9, 7}

这个集合有9个元素,但是2和3各出现了两次,因此不重复的元素为1,2,3,4,5,9,7,所以这个集合的基数是7。

如果两个集合具有相同的基数,我们说这两个集合等势。基数和等势的概念在有限集范畴内比较直观,但是如果扩展到无限集则会比较复杂,一个无限集可能会与其真子集等势(例如整数集和偶数集是等势的)。

简介

Redis 2.8.9 版本就更新了 HyperLogLogs 数据结构
优点: 占用内存是固定的 2^64 不同的元素的技术 只需要12kb 的内存 若从内存角度比较的话 HyperLogLogs 首选
Redis HyperLogLogs 基数统计算法
网页UV(一个人访问网站多次, 但是还是算作一个人)
传统方式 set保存用户的id 然后就可以统计set元素数量就可以作为标准判断
这种方式保存大量的用户id就会比较麻烦 我们的目的是为了计数 而不是保存用户id
0.81%错误率 统计UV任务 可以忽略不记的

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 j k l m n o p        # 创建第二个元素 mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 8
127.0.0.1:6379> pfmerge mykey3 mykey mykey2         # 合并两组 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3
(integer) 16
127.0.0.1:6379>

如果允许容错 那么一定可以使用 HyperLogLogs
如果不允许容错 就使用set或者自己的数据类型即可

Bitmaps

位存储

统计用户信息(活跃 不活跃)
登录 未登录 打卡(365打卡)
两个状态 都可以使用Bitmaps
Bitmaps 位图 数据结构 都是操作二进制位 来进行记录
就只有 0 和1 两个状态

测试

使用bitmap来记录周一到周日的打卡
周一 1 周二 0 周三 1 周四 0 周五 1 周六 1 周日 0

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 1
(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>

查看某一天是否打卡

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

统计操作 统计打卡的天数

127.0.0.1:6379> bitcount sign
(integer) 4
127.0.0.1:6379>

参考文献来源
http://blog.codinglabs.org

Redis三种特殊数据类型相关推荐

  1. Redis三种特殊数据类型——Geospatial地理空间

    Redis三种特殊数据类型:bitmaps位图.hyperloglog基数统计 和 geospatial 地理空间 一.介绍 Redis GEO 用于存储地理位置信息,并对存储的信息进行操作,该功能在 ...

  2. redis 三种特殊数据类型

    三种特性数据类型 geospatial 定位,附近的人,打车距离计算. redis的geo在redis3.2版本就推出了.可推算地理位置的信息,两地之间的距离,方圆几里的人. 6个命令. GEOADD ...

  3. Redis三种特殊数据类型(Geospatial地理位置详解,Hyperloglog基数统计,Bitmap位图场景详解)

    学习总结,转自[狂神说Java]Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili 1.Geospatial 地理位置 Geospatial : 使用场景 :朋友的定位,方圆几公里得人(附 ...

  4. Redis中三种特殊数据类型

    本文来说下Redis中三种特殊数据类型 文章目录 Gerspatial地理位置 Hyperloglog基数统计 Bitmap位图 Gerspatial地理位置 一共 6 个命令: GEOADD GEO ...

  5. redis的三种特殊数据类型

    三种特殊数据类型 GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作.来实现诸如附近位置.摇一 ...

  6. Redis(三)【五大数据类型三种特殊数据类型】

    目录 三. 五大数据类型 Redis-Key String(字符串) List(列表) Set(集合) Hash(哈希) Zset(有序集合) 6. 三种特殊数据类型 geospatial 地理位置 ...

  7. Redis(测试连接, 五大数据类型,三种特殊数据类型)

    文章目录 测试性能 测试端口: 测试: 基础知识 总共有16个数据库,默认是0号数据库 数据库切换: 清空数据: redis是单线程的 redis为什么是单线程还运行如此快? 五大数据类型 Redis ...

  8. redis学习--三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap

    三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存 ...

  9. Redis中五大基本数据类型和三种特殊数据类型详解

    目录 介绍 概念 基本命令 redis是单线程的 五大基本数据类型 String 命令 应用场景 List 命令 应用场景 Set 命令 应用场景 Hash 命令 应用场景 Zset 命令 应用场景 ...

最新文章

  1. solaris10找安装包的地方
  2. 【Kafka】Kafka-配置参数详解-参数调优
  3. wxWidgets:wxConfigBase类用法
  4. 销售探讨_让我们一起探讨编程资源的领域
  5. Hive:用Java代码通过JDBC连接Hiveserver
  6. 全面使用禅道做敏捷开发的规范化管理分享
  7. CSharpGL(53)漫反射辐照度
  8. 如何从小白进化成 Apache Flink 技术专家?9节基础课程免费公开!
  9. Anaconda常用指令
  10. 功率 db 和dbm 的区别
  11. SPI TFT液晶屏与Arduino Uno 连接
  12. Centos7 SGE安装部署
  13. 关于计算机专业的调整与优化,Win10这样做优化让你的电脑更流畅
  14. HTML作业-商城网页
  15. 鼠标点桌面计算机图标闪,用鼠标点击桌面图标老闪动是怎么回事?
  16. 软件测试常用的linux命令
  17. 四阶行列式直接展开_四阶行列式_4阶行列式详细解题步骤
  18. 闲人的命令执行漏洞基础学习1
  19. JavaScript 静态方法
  20. 【历史上的今天】8 月 30 日:首台通用电子计算机的发明者诞生;谷歌推出第一个涂鸦

热门文章

  1. 今日arXiv精选 | 14 篇 ICCV 2021 最新论文
  2. AAAI 2021 | 基于动态混合关系网络的对话式语义解析方法
  3. 万能的Seq2Seq:基于Seq2Seq的阅读理解问答
  4. 训练技巧 | 功守道:NLP中的对抗训练 + PyTorch实现
  5. 从Grid R-CNN到Grid R-CNN Plus:基于网格的目标检测演化
  6. Java 实现 Trie (前缀树)
  7. 【Java后台】Java执行Python代码的3类5种情况测试【Java源码+Python源码举例】
  8. 开篇词丨这样学Redis,才能技高一筹
  9. 定义快捷代码_Qt Creator快捷键
  10. 【LeetCode】LeetCode之打家劫舍Ⅱ——暴力递归+动态规划解决循环问题+DP空间优化