热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis经纬度_Redis扩展数据类型

一、简述前面一篇文章中,我们已经介绍过了《Redis基本数据类型》,这些基本数据类型对于大多数的业务需求都可以很好的满足,但是对于这些基本

一、简述

前面一篇文章中,我们已经介绍过了《Redis基本数据类型》,这些基本数据类型对于大多数的业务需求都可以很好的满足,但是对于这些基本数据类型,在一些特殊的场景中,却并不一定适用,下面我们来介绍一下Redis提供的一些扩展数据类型和时序数据库模块。

bitmap:基于bit位的存储,每一个bit存储0或1,一般用来进行海量数据的精准判重

HyperLogLog:一般用来对海量数据进行基于概率的基数统计,比如说网站的独立访客数、独立IP数等

Geo:基于地理空间的数据存储,常应用在那些基于位置服务,也就是我们常说的LBS(Location-Based Service)的应用,比如说打车等生活服务类应用

Stream:消息流,Redis自5.0版本之后,引入了消息队列的机制,也就是我们熟悉的Pub/Sub(发布/订阅)机制。

RedisTimeSeries:时间数据库模块,主要存储一些跟时间戳相关,需要范围查询,聚合计算等场景的数据集

二、Bitmap

Bitmap,也叫位图,通过二进制bit中的0或1来表示,某个位置的标记,因为每一个bit都只能是0或1,所以通常用来表示一个数据(通常对应于数组下标)是否已经存在(存在的话,该bit位上是1,否则为0)。下面,我们看看具体的存储结构,如下图所示:

d12e216b704692bd882f3023915568b3.png

其实在Redis中,bitmap是通常字符串来实现的,每一个字符的ASC2编码值代表一个字节,比如上面的数据就代表字符串"ab"。

Redis中的bitmap最多能存512M个字节,如果超出会报错,但这在绝大多数场景中已经足够了,因为512M可以表示:512*1024*1024*8 = 4294967296个。

bitmap一般用在什么场景呢&#xff1f;比如说&#xff0c;我们有一个id(id <4294967296)集合A&#xff0c;要存储起来&#xff0c;然后和另外一个id集合B进行比较&#xff0c;找出重复的id有哪些&#xff1f;比如说有1亿个id吧。那么这种情况&#xff0c;采用bitmap就十分合适了。

bitmap的getbit和setbit的时间复杂度都是&#xff1a;O(1)

三、HyperLogLog

上面简述中&#xff0c;我们已对提到&#xff0c;HyperLogLog主要是用来做基数统计的&#xff0c;我们知道在计算机领域&#xff0c;可以做基数统计的还有其它的类型&#xff0c;比如set, hash, bitmap都可以实现&#xff0c;但是面对海量数据的基数统计&#xff0c;这些数据结构都将消耗大量内存&#xff0c;比如说set和hash可以适用少量数据的统计和滤重&#xff0c;bitmap适合海量数据的滤重&#xff0c;但不适合海量数据的统计。

其实HyperLogLog呢&#xff0c;它的底层也是采用bitmap来实现的&#xff0c;它是采用一种基数估算算法来实现的&#xff0c;如果你有兴趣&#xff0c;可以去研究一下基数估算算法。HyperLogLog&#xff0c;它仅仅只需要12KB的内存空间&#xff0c;可以完成对264个数据完成基数统计&#xff0c;而且标准误差只有0.81%。

采用PFADD命令往HyperLogLog中添加数据&#xff0c; PFCOUNT命令就可以返回HyperLogLog的基数统计结果。

添加与统计的时间复杂度都是&#xff1a;O(1)

四、Geo

基于LBS的应用&#xff0c;比如说生活服务类的应用&#xff0c;我们想要查询附近3公里内所有的餐馆&#xff0c;那么这个时候&#xff0c;我们输入的数据应该就是一个经纬度坐标&#xff0c;那么Redis就会从数据库中查找出以输入坐标为圆心3公里作为半径范围内所有数据。

那么Redis是存储经纬度坐标的呢&#xff1f;

其实对于地理空间数据的编码方式&#xff0c;通常来说有两种&#xff1a;

(1)、二分区间法&#xff1b;

(2)、坐标转换法&#xff1b;

关于上述两种算法的实现原理&#xff0c;如果你有兴趣&#xff0c;可以自行了解一下。

Redis采用的是性能更高的坐标转换法&#xff0c;基本思想就是将经纬度二维坐标数据转为整数存储。

最常见的命令有&#xff1a;

geoadd&#xff1a;输入坐标&#xff0c;将一个经纬度坐标添加到geo数据集中

georadius&#xff1a;输入坐标和半径&#xff0c;返回geo数据集中&#xff0c;所有在指定坐标为圆心指定半径范围内的所有其它坐标点。

geodist&#xff1a;输入两个坐标点&#xff0c;计算两点之间的距离。

五、Stream

Redis自5.0.0之后&#xff0c;引入了消息队列的功能&#xff0c;也就是开始支持Pub/Sub(发布/订阅)的功能。

Stream&#xff0c;消息流的底层存储结构采用的是listpack&#xff0c;就是一个序列化之后的字符串列表。因为它还是一个队列&#xff0c;那么它需要满足先进先出的特性。

Redis的消息队列相对于传统专门的消息中间件来说&#xff0c;有哪些优点和缺点&#xff1a;

优点&#xff1a;

(1)、高性能&#xff1b;

(2)、低延迟&#xff1b;

(3)、轻量级。

缺点&#xff1a;

(1)、容量小&#xff0c;基于内存&#xff0c;如果内存爆了&#xff0c;就无法写入新消息&#xff1b;

(2)、可靠性差&#xff0c;需要自己业务代码实现可靠性保证&#xff1b;

综合来看&#xff1a;如果业务对消息队列的容量要求不是那么大、可靠性要求也不是非常非常高&#xff0c;同时又不想引入专门的消息中间件使得架构变得更加复杂的话&#xff0c;那么Redis的消息队列功能也不失为一种办法。

六、RedisTimeSeries

RedisTimeSeries是Redis提供的时序数据库模块&#xff0c;那么时序数据库主要用来干什么呢&#xff1f;

比如说有这样的需求&#xff1a;

我们要存储北京市最近一年每一分钟的温度数据&#xff0c;然后查询需求有&#xff1a;

(1)、输入一个时间点&#xff0c;查询这个时间点的温度数据&#xff1b;

(2)、输入一个时间范围&#xff0c;同时返回这个时间范围的温度平均值&#xff0c;最高值&#xff0c;最低值。

如果采用之前的基本数据类型来存储&#xff0c;那么可能需要同时使用hash和sorted set。而且&#xff0c;要求一个时间范围的温度平均值的话&#xff0c;我们还必须把数据加载到客户端来进行聚合计算。

这里需要说明一下&#xff0c;RedisTimeSeries跟上面的扩展数据类型不一样&#xff0c;它并不是Redis内置的功能&#xff0c;它只是一个Redis扩展模块。它专门面向时间序列数据提供了数据类型和访问接口&#xff0c;并且支持在 Redis 实例上直接对数据进行按时间范围的聚合计算。

所以&#xff0c;你在使用RedisTimeSeries时&#xff0c;需要先把它的源码单独编译成动态链接库 redistimeseries.so&#xff0c;再使用 loadmodule 命令进行加载&#xff0c;如下所示&#xff1a;

loadmodule redistimeseries.so

常见的操作如下&#xff1a;

(1)、用 TS.CREATE 命令创建时间序列数据集合&#xff1b;

(2)、用 TS.ADD 命令插入数据&#xff1b;

(3)、用 TS.GET 命令读取最新数据&#xff1b;

(4)、用 TS.MGET 命令按标签过滤查询数据集合&#xff1b;

(5)、用 TS.RANGE 支持聚合计算的范围查询。




推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
author-avatar
zulaka_208
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有