Redis的3个高级数据结构

转载自   Redis的3个高级数据结构

平常接触最多的是5个入门级数据结构:String,Hash,List,Set,Sorted Set,本文介绍3个高级数据结构:Bitmaps,Hyperloglogs,GEO。

Bitmaps

bitmaps不是一个真实的数据结构。而是String类型上的一组面向bit操作的集合。由于strings是二进制安全的blob,并且它们的最大长度是512m,所以bitmaps能最大设置2^32个不同的bit。

bit操作被分为两组:

  • 恒定时间的单个bit操作,例如把某个bit设置为0或者1。或者获取某bit的值。
  • 对一组bit的操作。例如给定范围内bit统计(例如人口统计)。

Bitmaps的最大优点就是存储信息时可以节省大量的空间。例如在一个系统中,不同的用户被一个增长的用户ID表示。40亿(2^32=4*1024*1024*1024≈40亿)用户只需要512M内存就能记住某种信息,例如用户是否登录过。

Bits设置和获取通过SETBIT 和GETBIT 命令,用法如下:

SETBIT key offset value
GETBIT key offset

使用实例:

127.0.0.1:6380> setbit dupcheck 10 1
(integer) 0
127.0.0.1:6380> getbit dupcheck 10 
(integer) 1

SETBIT命令第一个参数是位编号,第二个参数是这个位的值,只能是0或者1。如果bit地址超过当前string长度,会自动增大string。

 

Bitmaps示意图

GETBIT命令指示返回指定位置bit的值。超过范围(寻址地址在目标key的string长度以外的位)的GETBIT总是返回0。三个操作bits组的命令如下:

  • BITOP 执行两个不同string的位操作.,包括AND,OR,XOR和NOT.
  • BITCOUNT 统计位的值为1的数量。
  • BITPOS 寻址第一个为0或者1的bit的位置(寻址第一个为1的bit的位置:bitpos dupcheck 1; 寻址第一个为0的bit的位置:bitpos dupcheck 0).

bitmaps一般的使用场景:

  • 各种实时分析.
  • 存储与对象ID关联的节省空间并且高性能的布尔信息.

例如,想象一下你想知道访问你的网站的用户的最长连续时间。你开始计算从0开始的天数,就是你的网站公开的那天,每次用户访问网站时通过SETBIT命令设置bit为1,可以简单的用当前时间减去初始时间并除以3600*24(结果就是你的网站公开的第几天)当做这个bit的位置。

这种方法对于每个用户,都有存储每天的访问信息的一个很小的string字符串。通过BITCOUN就能轻易统计某个用户连续访问网站的天数。另外通过调用BITPOS命令,或者客户端获取并分析这个bitmap,就能计算出最长停留时间。

HyperLogLogs

HyperLogLog是用于计算唯一事物的概率数据结构(从技术上讲,这被称为估计集合的基数)。如果统计唯一项,项目越多,需要的内存就越多。因为需要记住过去已经看过的项,从而避免多次统计这些项。

然而,有一组算法可以交换内存以获得精确度:在redis的实现中,您使用标准错误小于1%的估计度量结束。这个算法的神奇在于不再需要与需要统计的项相对应的内存,取而代之,使用的内存一直恒定不变。最坏的情况下只需要12k,就可以计算接近2^64个不同元素的基数。或者如果您的HyperLogLog(我们从现在开始简称它为HLL)已经看到的元素非常少,则需要的内存要要少得多。

在redis中HLL是一个不同的数据结构,它被编码成Redis字符串。因此可以通过调用GET命令序列化一个HLL,也可以通过调用SET命令将其反序列化到redis服务器。

HLL的API类似使用SETS数据结构做相同的任务,SETS结构中,通过SADD命令把每一个观察的元素添加到一个SET集合,用SCARD命令检查SET集合中元素的数量,集合里的元素都是唯一的,已经存在的元素不会被重复添加。

而使用HLL时并不是真正添加项到HLL中(这一点和SETS结构差异很大),因为HLL的数据结构只包含一个不包含实际元素的状态,API是一样的:

  • PFADD命令用于添加一个新元素到统计中。
  • PFCOUNT命令用于获取到目前为止通过PFADD命令添加的唯一元素个数近似值。
  • PFMERGE命令执行多个HLL之间的联合操作。
127.0.0.1:6380> PFADD hll a b c d d c
(integer) 1
127.0.0.1:6380> PFCOUNT hll
(integer) 4
127.0.0.1:6380> PFADD hll e
(integer) 1
127.0.0.1:6380> PFCOUNT hll
(integer) 5

PFMERGE命令说明:

PFMERGE destkey sourcekey [sourcekey ...]
Merge N different HyperLogLogs into a single one.

用法(把hll1和hll2合并到hlls中):

127.0.0.1:6380> PFADD hll1 1 2 3
(integer) 1
127.0.0.1:6380> PFADD hll2 3 4 5
(integer) 1
127.0.0.1:6380> PFMERGE hlls hll1 hll2
OK
127.0.0.1:6380> PFCOUNT hlls

HLL数据结构的一个使用场景就是计算用户每天在搜索框中执行的唯一查询,即搜索页面UV统计。而Bitmaps则用于判断某个用户是否访问过搜索页面。这是它们用法的不同。

GEO

Redis的GEO特性在 Redis3.2版本中推出,这个功能可以将用户给定的地理位置(经度和纬度)信息储存起来,并对这些信息进行操作。GEO相关命令只有6个:

  • GEOADD:GEOADD key longitude latitude member [longitude latitude member …],将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。例如:GEOADD city 113.501389 22.405556 shenzhen

经纬度具体的限制,由EPSG:900913/EPSG:3785/OSGEO:41001规定如下:
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
  • GEOHASH:GEOHASH key member [member …],返回一个或多个位置元素的标准Geohash值,它可以在http://geohash.org/使用。查询例子:http://geohash.org/sqdtr74hyu0.(可以通过谷歌了解Geohash原理,或者戳Geohash基本原理:https://www.cnblogs.com/tgzhu/p/6204173.html)。
  • GEOPOS:GEOPOS key member [member …],从key里返回所有给定位置元素的位置(经度和纬度)。
  • GEODIST:GEODIST key member1 member2 [unit],返回两个给定位置之间的距离。GEODIST命令在计算距离时会假设地球为完美的球形。在极限情况下,这一假设最大会造成0.5%的误差。
指定单位的参数unit必须是以下单位的其中一个:
m 表示单位为米(默认)。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
  • GEORADIUS:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count],以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。这个命令可以查询某城市的周边城市群。
  • GEORADIUSBYMEMBER:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count],这个命令和GEORADIUS命令一样,都可以找出位于指定范围内的元素,但是GEORADIUSBYMEMBER的中心点是由给定的位置元素决定的,而不是像 GEORADIUS那样,使用输入的经度和纬度来决定中心点。

指定成员的位置被用作查询的中心。

GEO的6个命令用法示例如下:

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2redis> GEOHASH Sicily Palermo Catania
1) "sqc8b49rny0"
2) "sqdtr74hyu0"redis> GEOPOS Sicily Palermo Catania NonExisting
1) 1) "13.361389338970184"2) "38.115556395496299"
2) 1) "15.087267458438873"2) "37.50266842333162"
3) (nil)redis> GEODIST Sicily Palermo Catania
"166274.15156960039"redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"

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

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

相关文章

SpringCloudConfig整合Nacos

SpringCloudConfig 的作用是可以进行配置的更新处理,这个的确是很好,但是原始的SpringCloudNetflix 架构所提供的动态的抓取配置实在是太繁琐了,包括还要使用到SpringCloudBus进行Actuator处理 SpringCloudAlibaba套件之中是基于Nacos 实现的…

使用VS Code开发调试.NET Core 2.0

使用VS Code 从零开始开发调试.NET Core 2.0。无需安装VS 2017 15.3即可开发调试.NET Core 2.0应用。 VS Code 全称是 Visual Studio Code,Visual Studio Code是一个轻量级的跨平台Web集成开发环境,可以运行在 Linux,Mac 和Windows下&#x…

jzoj3382-七夕祭【贪心,中位数】

正题 大意 有k个摊点,有n行m列,每次只能让摊点移动到相邻的格子(如果相邻的有那么就交换)。要求最少的移动次数让每行每列的摊点数一样,如果不行就输出只能做到行或只能做到列或都不行。注意最上面一行和最下面一行相…

不管什么事,只要用心做,总不会太差!

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。KTV项目基本已经做完,于是自上周五以来就开始挨个小组的进行试讲。上周五第一次试讲,只讲了三个小组,整体来说讲的都不行。组员与组长之间的协调不统一&#xff…

学生自定义的键盘,功能强大齐全!!!

大家好,我是雄雄,欢迎关注公众号:雄雄的小课堂。今天给大家介绍一款键盘,本款键盘属于私人订制,“专业性”很强,且功能齐全,在使用时可以一人使用,在某种特定的场合下,两…

jzoj3383-太鼓达人【欧拉回路,位运算】

正题 大意 一个数K,求一个最长的01环形序列(头和尾相连),使得每个长度为k的连续子序列都不相同。(要输出这个串,如果有多个答案输出字典序最小的) 解题思路 尝试将长度为k的01序列全排列一下我…

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾虑,为我们提前设计了一个工具:.NET Port…

深入理解Java ClassLoader及在 JavaAgent 中的应用

转载自 深入理解Java ClassLoader及在 JavaAgent 中的应用 背景 众所周知, Java 或者其他运行在 JVM(java 虚拟机)上面的程序都需要最终便以为字节码,然后被 JVM加载运行,那么这个加载到虚拟机的过程就是 classloader 类加载器所干的事情.直白一点,就是 通过一个类的全限定…

如何从Gitee中拉取项目到HBuilder中?

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。今天,给大家分享一下,如何使用HBuilder连接gitee,进行代码的提交(明天在看)与拉取。1首先,在HBuilder中下载Git的插件…

jzoj3384-理工男【欧拉定理,gcd,数论】

正题 大意 给出一个分数ABAB求它在k进制下的小数循环。 如果是有限小数直接输出位数 无限循环输出混循环节和循环节长度。 代码 直接切正题 用a数组表示每一位的余数,然后a[0]Aa[0]A,之后a[1]a[0]∗K%Ba[1]a[0]∗K%B,然后如果有q位那么a…

ASP.NET Core Razor页面 vs MVC

作为.NET Core 2.0发行版的一部分,还有一些ASP.NET的更新。其中之一是添加了一个新的Web框架来创建“页面”,而不需要复杂的ASP.NET MVC。新的Razor页面是一个比较简单的MVC框架版本,在某些方面是老的“.aspx” WebForms的演变。 在本文中&a…

Gradle 简单使用

文章目录创建Gradle项目dependencies.gradlegradle.propertiesbuild.gradleGradle配置文件详解dependency-management 插件SpringBootPlugin 插件多模块热部署创建Gradle项目 dependencies.gradle ext.versions [ // 定义所有要使用的版本号springboot: 2.4.1 // Spri…

Nginx可以做什么?看完这篇你就懂了

转载自 Nginx可以做什么?看完这篇你就懂了 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得,欢迎留言…

如何将HBuilder中的项目Push至Gitee中!

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。昨天,给大家介绍了下HBuilder中怎么从gitee中拉取项目至本地,需要的小伙伴们可以点击链接查看:如何从Gitee中拉取项目到HBuilder中?今天&…

jzoj3385-黑魔法之门【并差集】

正题 大意 一个图有n个点,每次增加一条边。每次增加一条边之后统计每个点度数大于0且是偶数的子图个数。 解题思路 首先满足要求的子图至少有一个环,然后我们考虑每加入一个环和别的环的判断情况。每加入一个环的话我们会发现其实就是有若干个环之中选…

PLEASE小组KTV点歌系统简要说明

PLEASE小组KTV项目指导老师:穆老师 班主任:佟老师小组成员:组长:徐祥 副组长:孟祥帅组员:董经纬 组员:孙晓文 周航 组员:徐龙一 张远远制作周期:2021年6月25日…

(选择 冒泡 插入 二分 异或)

文章目录选择排序冒泡排序插入排序二分二分查找某个数是否存在在arr上,找满足大于等于value的最左位置在arr上,找满足小于等于value的最右位置局部最小值异或选择排序 O(n^2) public class Code01_SelectionSort {public static void selectionSort(in…

C#使用Xamarin开发可移植移动应用(5.进阶篇显示弹出窗口与通讯中心)附源码

源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 没啥好说的.开干吧. 今天的学习内容? 今天的内容比较简单. 就几个弹出框和内置的消息通讯中心. 如图: 正文 1.xamarin中的弹出窗 xamarin帮我们把各个系统的弹出窗做了2个统一的类. 1.…

Java Agent的隔离实现以及卸载时一些坑

转载自 Java Agent的隔离实现以及卸载时一些坑 在《一文带你了解Java Agent》中,让大家了解了Java Agent的来龙去脉,当通过attach方式去动态加载一个Java Agent时,Agent中的类会被加载到业务的虚拟机中,在使用完Agent的之后&am…

2018/7/13-纪中某C组题【jzoj3382,jzoj3383,jzoj3384,jzoj3385】

今天的题目出奇的难(好吧是我把时间全砸在第一题上了) 今日分数 person分数xjq60xxy40hjq40lrz30lw30hzb20zyc10蒟蒻30 正题 T1:jzoj3382-七夕祭【贪心,中位数】 博客链接:https://blog.csdn.net/mr_wuyongcong/article/detai…