三种特殊数据类型

GEO地理位置

简介

Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作。来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。geo的数据类型为zset。

GEO 的数据结构总共有六个常用命令:geoadd、geopos、geodist、georadius、
georadiusbymember、gethash

命令介绍

geoadd

# ===================================================
# 语法
#   geoadd key longitude latitude member ...
#
# 将给定的空间元素(纬度、经度、名字)添加到指定的键里面。
# 这些数据会以有序集he的形式被储存在键里面,从而使得georadius和georadiusbymember这样的命令可以在之后通过位置查询取得这些元素。
# geoadd命令以标准的x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。
# geoadd能够记录的坐标是有限的:非常接近两极的区域无法被索引。
# 有效的经度介于-180-180度之间,有效的纬度介于-85.05112878 度至 85.05112878 度之间。当用户尝试输入一个超出范围的经度或者纬度时,geoadd命令将返回一个错误
# ===================================================
127.0.0.1:6379> geoadd china:city 116.23 40.22 北京
(integer) 1
127.0.0.1:6379> geoadd china:city 121.48 31.40 上海 113.88 22.55 深圳 120.21
30.20 杭州
(integer) 3
127.0.0.1:6379> geoadd china:city 106.54 29.40 重庆 108.93 34.23 西安 114.02
30.58 武汉
(integer) 3

geopos

# ===================================================
# 语法
#   geopos key member [member...]
#
# 从key里返回所有给定位置元素的位置(经度和纬度)
# ===================================================
127.0.0.1:6379> geopos china:city 北京
1) "116.23000055551528931"
2) "40.2200010338739844"
127.0.0.1:6379> geopos china:city 上海 重庆
1) "121.48000091314315796"
2) "31.40000025319353938"
1) "106.54000014066696167"
2) "29.39999880018641676"
127.0.0.1:6379> geopos china:city 新疆
1) (nil)

geodis

# ===================================================
# 语法
#   geodist key member1 member2 [unit]
#
# 返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。
# 指定单位的参数unit必须是以下单位的其中一个:
# m表示单位为米
# km表示单位为千米
# mi表示单位为英里
# ft表示单位为英尺
# 如果用户没有显式地指定单位参数,那么geodist默认使用米作为单位。
#geodist命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成0.5%的误差。
# ===================================================
127.0.0.1:6379> geodist china:city 北京 上海
"1088785.4302"
127.0.0.1:6379> geodist china:city 北京 上海 km
"1088.7854"
127.0.0.1:6379> geodist china:city 重庆 北京 km
"1491.6716"

georadius

georadius
# ===================================================
# 语法
#   georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count]
#
# 以给定的经纬度为中心, 找出某一半径内的元素
# ===================================================
测试:重新连接 redis-cli,增加参数 --raw ,可以强制输出中文,不然会乱码[root@kuangshen bin]# redis-cli --raw -p 6379
# 在 china:city 中寻找坐标 100 30 半径为 1000km 的城市
127.0.0.1:6379> georadius china:city 100 30 1000 km
重庆
西安
# withdist 返回位置名称和中心距离
127.0.0.1:6379> georadius china:city 100 30 1000 km withdist
重庆
635.2850
西安
963.3171# withcoord 返回位置名称和经纬度
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord
重庆
106.54000014066696167
29.39999880018641676
西安
108.92999857664108276
34.23000121926852302# withdist withcoord 返回位置名称 距离 和经纬度 count 限定寻找个数
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count
1 重庆
635.2850
106.54000014066696167
29.39999880018641676
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count
2 重庆
635.2850
106.54000014066696167
29.39999880018641676
西安
963.3171
108.92999857664108276
34.23000121926852302

georadiusbymember

# ===================================================
# 语法
#   georadiusbymember key member radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count]# 找出位于指定范围内的元素,中心点是由给定的位置元素决定
# ===================================================
127.0.0.1:6379> GEORADIUSBYMEMBER china:city 北京 1000 km
北京
西安
127.0.0.1:6379> GEORADIUSBYMEMBER china:city 上海 400 km
杭州
上海

geohash

# ===================================================
# 语法
#   geohash key member [member...]# Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近
# ===================================================
127.0.0.1:6379> geohash china:city 北京 重庆
wx4sucu47r0
wm5z22h53v0
127.0.0.1:6379> geohash china:city 北京 上海
wx4sucu47r0
wtw6sk5n300

zrem

GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以可以借用zrem命令实现对地理位置信息的删除

127.0.0.1:6379> geoadd china:city 116.23 40.22 beijin
1
127.0.0.1:6379> zrange china:city 0 -1 # 查看全部的元素
重庆
西安
深圳
武汉
杭州
上海
beijin
北京
127.0.0.1:6379> zrem china:city beijin # 移除元素
1
127.0.0.1:6379> zrem china:city 北京 # 移除元素
1 1
27.0.0.1:6379> zrange china:city 0 -1
重庆
西安
深圳
武汉
杭州
上海

HyperLogLog

简介

Redis 在 2.8.9 版本添加了 HyperLogLog 结构

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比

HyperLogLog则是一种算法,它提供了不精确的去重计数方案

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数

基本命令

命令 描述
[PFADD key element [element …] 添加指定元素到 HyperLogLog 中
[PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值
[PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog,并 集计算
127.0.0.1:6379> PFADD mykey a b c d e f g h i j
1 1
27.0.0.1:6379> PFCOUNT mykey
10
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m
1 1
27.0.0.1:6379> PFMERGE mykey3 mykey mykey2
OK
127.0.0.1:6379> PFCOUNT mykey3
15

BitMap

简介

在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或者不登录;又如需要记录用户一年的打卡情况,打卡了是1, 没有打卡是0,如果使用普通的 key/value存储,则要记录365条记录,如果用户量很大,需要的空间也会很大,所以 Redis 提供了 Bitmap 位图这中数据结构,Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1;如果要记录 365 天的打卡情况,使用 Bitmap表示的形式大概如下:0101000111000111…,这样有什么好处呢?当然就是节约内存了,365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。

BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了setbit, getbit, bitcount 等几个bitmap 相关命令

setbit

SETBIT key offset value : 设置 key 的第 offset 位为value (1或0)

# 使用 bitmap 来记录上述事例中一周的打卡记录如下所示:
# 周一:1,周二:0,周三:0,周四:1,周五:1,周六:0,周天:0 (1 为打卡,0 为不打卡)
127.0.0.1:6379> setbit sign 0 1
0
127.0.0.1:6379> setbit sign 1 0
0
127.0.0.1:6379> setbit sign 2 0
0
127.0.0.1:6379> setbit sign 3 1
0
127.0.0.1:6379> setbit sign 4 1
0
127.0.0.1:6379> setbit sign 5 0
0
127.0.0.1:6379> setbit sign 6 0
0

getbit

GETBIT key offset获取offset设置的值,未设置过默认返回0

127.0.0.1:6379> getbit sign 3 # 查看周四是否打卡
1
127.0.0.1:6379> getbit sign 6 # 查看周七是否打卡
0

bitcount

bitcount key [start, end]统计 key 上位为1的个数

# 统计这周打卡的记录,可以看到只有3天是打卡的状态:
127.0.0.1:6379> bitcount sign
3

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

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

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

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

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

  3. 详解redis的三种特殊数据类型

    14天学习训练营导师课程: 郑为中<Vue和SpringBoot打造假日旅社管理系统> 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识 ...

  4. Redis三种特殊数据类型

    Redis三种特殊数据类型 geospatial 地理位置 朋友的定位, 附近的人, 打车的距离计算 Redis的Geo在Redis3.2版本就推出了.这个功能可以推算地理位置信息, 两地之间的距离, ...

  5. redis 三种特殊数据类型

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

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

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

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

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

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

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

  9. Redis(四)------三种特殊数据类型

    Redis(四)------三种特殊数据类型 7.三种特殊数据类型 7.1 Geospatial(地理位置) 使用经纬度定位地理坐标,并用一个有序集合Zset保存,所以,Zset的命令也可以使用 有效 ...

最新文章

  1. 图解5G NR帧结构
  2. qt-designer使用教程3--编写自己的槽
  3. Spring-视图解析
  4. 通讯实例 modbus_实例讲解PLC实现modbus通讯
  5. NodeJS入门04-Express路由和中间件 - 小之 - 博客园
  6. c语言流水灯小程序,流水灯小程序.doc
  7. vs 2019 aspx灰色_蛇纹当道,豹纹在侧:穿成动物园是2019时尚大势?
  8. RaabitMQ:rabbitmqctl的几个命令
  9. 微软将推出Surface Duo双屏手机:售价1399美元
  10. 新款iPhone SE是改良版iPhone 8无误了,部分零件可互换
  11. socket解读,http和socket之长连接和短连接区别!
  12. Python字符串常用方法(split,partition,maketrans,strip...)
  13. STM32F401的RCC时钟配置
  14. 愚人节的背后:技术在一面打假,一面造假
  15. [Linux] 非root安装Lefse软件及其数据分析
  16. 荣耀10青春版支持鸿蒙吗,荣耀10青春版详细评测:又一款年轻群体收割机
  17. 个人作业2——集大通APP案例分析
  18. Java实现桐桐的数学难题
  19. 百度搜索结果页url参数详解
  20. dw网页设计期末设计一个网页_《网页设计与制作Dreamweaver》期末考试试题

热门文章

  1. js 把数字转换成万
  2. 什么是机器学习?机器学习与AI的关系?
  3. GNSS/INS组合导航(2)-加速度计选型参数解析
  4. 【云原生】第二篇--容器管理工具 Docker生态架构及部署
  5. ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏
  6. angular2项目里使用 Spin(加载中)
  7. windows 睡眠倒计时_如何在手机上设置音乐睡眠计时器
  8. 睡眠质量不好怎么改善,这些助眠好物让你失眠快速入睡
  9. NB-IoT模组选型及项目初始必看!
  10. CREO二维CAD图纸导出1:1比例导出,单位为mm