美文网首页
redis基础(三种特殊数据类型)

redis基础(三种特殊数据类型)

作者: 小名源治 | 来源:发表于2022-10-12 11:25 被阅读0次

redis中文网站
redis官方网站

redis三种特殊的数据类型

1 GEOSPATIAL地理位置

使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。
  • 只有6个命令


    image.png

1.1geoadd 添加地理位置

处理一个报错信息
127.0.0.1:6379[1]> geoadd china 39.290000 116.400000 "beijin"
(error) ERR invalid longitude,latitude pair 39.290000,116.400000
这是因为效的纬度从-85.05112878度到85.05112878度
添加经纬度一般情况都是用程序导入自动添加的

127.0.0.1:6379[1]> geoadd china:city 39.290000 16.400000 "beijin"
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 24.290000 10.400000 "shanghai" #添加城市的经度和纬度
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 123.290000 40.400000 "nanjin"
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 33.290000 50.400000 "hangzhou" 24.45 43.44 "kunmin"
(integer) 2

1.2geopos获取地理位置

获得当前定位,一定是一个坐标值

127.0.0.1:6379[1]> geopos china:city shanghai #获取指定城市的精度和纬度
1) 1) "24.29000169038772583"
   2) "10.400000204945691"
127.0.0.1:6379[1]> geopos china:city beijin
1) 1) "39.28999811410903931"
   2) "16.39999949452474226"

1.3geodist返回给定两个位置之间的距离

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

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
    如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
127.0.0.1:6379[1]> geodist china:city shanghai beijin #查看上海到北京的直线距离  单位默认是m(米)
"1753788.6161"
127.0.0.1:6379[1]> geodist china:city shanghai beijin KM #查看距离,将单位设置为KM(千米)
"1753.7886"

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

georadius 组别 当前经度 当前纬度 范围 单位
withdist 知道详细的直线距离
withcoord 知道详细经纬度

127.0.0.1:6379[1]> georadius china:city 30.00 15.00 100 KM  #通过当前坐标查找附近100千米的人
(empty array)
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 1000 KM 
1) "shanghai"
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM 
1) "shanghai"
2) "beijin"
3) "kunmin"
4) "hangzhou"
5) "nanjin"
####添加了withdist不仅可以知道城市名,还可以知道详细的直线距离
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM withdist  
1) 1) "shanghai"
   2) "803.3572"
2) 1) "beijin"
   2) "1006.7467"
3) 1) "kunmin"
   2) "3206.9954"
4) 1) "hangzhou"
   2) "3948.5609"
5) 1) "nanjin"
####知道详细经纬度
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM withcoord
1) 1) "shanghai"
   2) 1) "24.29000169038772583"
      2) "10.400000204945691"
2) 1) "beijin"
   2) 1) "39.28999811410903931"
      2) "16.39999949452474226"
3) 1) "kunmin"
   2) 1) "24.4500008225440979"
      2) "43.4399992669671775"
4) 1) "hangzhou"
   2) 1) "33.28999847173690796"
      2) "50.39999884843426514"
5) 1) "nanjin"
   2) 1) "123.28999847173690796"
      2) "40.39999918756212338"
####限制查询数量
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM withcoord withdist count 2
1) 1) "shanghai"
   2) "803.3572"
   3) 1) "24.29000169038772583"
      2) "10.400000204945691"
2) 1) "beijin"
   2) "1006.7467"
   3) 1) "39.28999811410903931"
      2) "16.39999949452474226"

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

127.0.0.1:6379[1]> GEORADIUSBYMEMBER china:city shanghai 1000 km  #通过指定城市查找周边范围内的其他城市
1) "shanghai"
127.0.0.1:6379[1]> GEORADIUSBYMEMBER china:city shanghai 10000 km
1) "shanghai"
2) "beijin"
3) "kunmin"
4) "hangzhou"

1.6GEOHASH 命令

该命令返回11个字符长度的geohash字符串!

#返回的是两个城市的经纬度,但是会将二维的经纬度转化为一维的字符串
#如果两个字符串越接近,那么两个地理位置越近
127.0.0.1:6379[1]> geohash china:city beijin shanghai
1) "sfgvq1d0gm0"  #北京的经纬度转化为字符串
2) "s9c70tr2qh0"   #上海的经纬度转化为字符串

1.7geo的底层实现原理其实是zset,那么就意味着我们可以用zset的命令来操作它

127.0.0.1:6379[1]> zrange china:city 0 -1  #zset的查询命令来操作
1) "shanghai"
2) "beijin"
3) "kunmin"
4) "hangzhou"
127.0.0.1:6379[1]> zrem china:city shanghai #zset的删除命令
(integer) 1
127.0.0.1:6379[1]> zrange china:city 0 -1
1) "beijin"
2) "kunmin"
3) "hangzhou"

2 HyperLogLog

什么是基数?

A{1,2,4,6,7}
B{2,4,5,6,8}
基数(不重复的元素) = 4 ,可以接受误差

HyperLogLog简介

redis的HyperLogLog是用来做基数统计的算法!
优点:占用的内存是固定的,2^64的数据只需要占用12KB的内存,从内存角度来比较的话HyperLogLog是首选。
网页的UV -访问人数(一个人访问多次网站,但访问量还是只算一个人)
传统的方式:用set保存用户的uid,然后就可以通过统计set中的元素数量作为标准判断!
但是这个方式会保存大量的用户ID,假如是分布式ID,并且人数众多,那么我们的内存占用就比较大!我们的目的是为了计数,而不是保存用户ID
这个时候就可以用HyperLogLog,它虽然有0.81%的错误率,但是这个误差是可以忽略的。
所有的HyperLogLog命令是以P开头的

命令

pfadd添加一个set集合
pfcount输出这个集合中不重复的元素的数量
PFMERGE合并两个集合到另外的一个集合中

127.0.0.1:6379[1]> pfadd mykey a b c d #新建一个集合
(integer) 1
127.0.0.1:6379[1]> pfadd mykey1 c d e f
(integer) 1
127.0.0.1:6379[1]> pfcount mykey #输出这个集合中不重复的元素的数量
(integer) 4
127.0.0.1:6379[1]> pfcount mykey mykey1 #输出两个集合中不重复元素的数量
(integer) 6
127.0.0.1:6379[1]> PFMERGE mykey3 mykey mykey1 #合并两个集合到另外的一个集合中 (并集)
OK
127.0.0.1:6379[1]> pfcount mykey3
(integer) 6

3Bitmaps位图

用来统计用户信息,活跃不活跃!登录未登录!等等这些状态!只要是只有两个状态的,都可以使用Bitmaps!
Bitmaps位图,是一种数据结构!只有0和1两种状态!!
例如:存某个人365天的状态 :365天=365bit 1字节=8bit 46个字节就可以存完!

测试:用Bitmpas来存储用户每周是否打卡

image.png

0代表没有打卡,1代表打卡

127.0.0.1:6379[1]> setbit sign 1 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 2 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 3 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 4 1
(integer) 0

查看用户某一天是否打过卡

127.0.0.1:6379[1]> getbit sign 2
(integer) 0
127.0.0.1:6379[1]> getbit sign 3
(integer) 1

统计打卡的天数

127.0.0.1:6379[1]> bitcount sign 
(integer) 2

相关文章

  • 【Redis 系列】redis 学习五,多学习一些 redis

    【Redis 系列】redis 学习五,多学习一些 redis 的三种特殊数据类型 redis 三种特殊的数据类型...

  • redis常用命令教程

    Redis 基础教程 Redis 教程、Redis 安装、Redis 配置、Redis 数据类型 Redis 命令...

  • 亿级流量电商系统多级缓存架构

    Redis基础 数据类型String hash list set zset java操作Redis redis的R...

  • Redis

    Redis 内容:1、Redis简介2、Redis 安装和基础管理3、Redis 数据类型4、Redis 的消息模...

  • redis dict and redis list

    string是redis基础的数据类型,而redis的dict和list是redis中最基本的数据结构,redis...

  • PHP数据类型

    数据类型 数据类型分为三种:标量型、复合型、特殊类型标量型: 复合型 特殊类型 数据类型检测 PHP中变量的数据类...

  • Redis 特殊数据类型

    一、Geo Geo,即地理位置,核心原理是使用 GeoHash 这种地理空间位置编码方法,将二维的地理空间位置的经...

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

    1、geospatial地理位置: GEOADD: 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中语...

  • Redis内存优化

    Redis 内存优化 官网文档 翻译 使用特殊编码方式存储聚合数据类型 从 Redis 2.2 开始,很多数据结构...

  • 数据类型

    typescript 命令 ​ tsc --init 生成配置文件 ts的基础数据类型 特殊数据类型 数组 ...

网友评论

      本文标题:redis基础(三种特殊数据类型)

      本文链接:https://www.haomeiwen.com/subject/huztzrtx.html