问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Redis中三种特殊数据类型详解

发布网友 发布时间:2024-09-29 04:07

我来回答

1个回答

热心网友 时间:2024-10-24 06:38

Redis除了5种基础数据类型,还有三种特殊的数据类型,分别是 HyperLogLogs(基数统计), Bitmaps (位图) 和 geospatial (地理位置)。

HyperLogLogs(基数统计)

Redis 2.8.9 版本更新了 Hyperloglog 数据结构!

什么是基数?

举个例子,A = {1, 2, 3, 4, 5}, B = {3, 5, 6, 7, 9};那么基数(不重复的元素)= 1, 2, 4, 6, 7, 9; (允许容错,即可以接受一定误差)

HyperLogLogs 基数统计用来解决什么问题?

这个结构可以非常省内存的去统计各种计数,比如注册 IP 数、每日访问 IP 数、页面实时UV、在线用户数,共同好友数等。

它的优势体现在哪?

一个大型的网站,每天 IP 比如有 100 万,粗算一个 IP 消耗 15 字节,那么 100 万个 IP 就是 15M。而 HyperLogLog 在 Redis 中每个键占用的内容都是 12K,理论存储近似接近 2^64 个值,不管存储的内容是什么,它一个基于基数估算的算法,只能比较准确的估算出基数,可以使用少量固定的内存去存储并识别集合中的唯一元素。而且这个估算的基数并不一定准确,是一个带有 0.81% 标准错误的近似值(对于可以接受一定容错的业务场景,比如IP数统计,UV等,是可以忽略不计的)。

相关命令使用

127.0.0.1:6379>pfaddkey1abcdefghi#创建第一组元素(integer)1127.0.0.1:6379>pfcountkey1#统计元素的基数数量(integer)9127.0.0.1:6379>pfaddkey2cjklmega#创建第二组元素(integer)1127.0.0.1:6379>pfcountkey2(integer)8127.0.0.1:6379>pfmergekey3key1key2#合并两组:key1key2->key3并集OK127.0.0.1:6379>pfcountkey3(integer)13Bitmap (位存储)

Bitmap 即位图数据结构,都是操作二进制位来进行记录,只有0 和 1 两个状态。

用来解决什么问题?

比如:统计用户信息,活跃,不活跃! 登录,未登录! 打卡,不打卡! 两个状态的,都可以使用 Bitmaps!

如果存储一年的打卡状态需要多少内存呢? 365 天 = 365 bit 1字节 = 8bit 46 个字节左右!

相关命令使用

使用bitmap 来记录 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:1 ......

127.0.0.1:6379>setbitsign01(integer)0127.0.0.1:6379>setbitsign11(integer)0127.0.0.1:6379>setbitsign20(integer)0127.0.0.1:6379>setbitsign31(integer)0127.0.0.1:6379>setbitsign40(integer)0127.0.0.1:6379>setbitsign50(integer)0127.0.0.1:6379>setbitsign61(integer)0

查看某一天是否有打卡!

127.0.0.1:6379>getbitsign3(integer)1127.0.0.1:6379>getbitsign5(integer)0

统计操作,统计 打卡的天数!

127.0.0.1:6379>bitcountsign#统计这周的打卡记录,就可以看到是否有全勤!(integer)3geospatial (地理位置)

Redis 的 Geo 在 Redis 3.2 版本就推出了! 这个功能可以推算地理位置的信息:两地之间的距离,,方圆几里的人。

geoadd

添加地理位置

127.0.0.1:6379>geoaddchina:city118.7632.04manjing112.5537.86taiyuan123.4341.80shenyang(integer)3127.0.0.1:6379>geoaddchina:city144.0522.52shengzhen120.1630.24hangzhou108.9634.26xian(integer)3

规则

两级无法直接添加,我们一般会下载城市数据(这个网址可以查询 GEO: http://www.jsons.cn/lngcode)!

有效的经度从-180度到180度。

有效的纬度从-85.05112878度到85.05112878度。

#当坐标位置超出上述指定范围时,该命令将会返回一个错误。127.0.0.1:6379>geoaddchina:city39.90116.40beijin(error)ERRinvalidlongitude,latitudepair39.900000,116.400000geopos

获取指定的成员的经度和纬度

127.0.0.1:6379>geoposchina:citytaiyuanmanjing1)1)"112.54999905824661255"1)"37.86000073876942196"2)1)"118.75999957323074341"1)"32.03999960287850968"

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

geodist

如果不存在, 返回空

单位如下

m

km

mi 英里

ft 英尺

127.0.0.1:6379>geodistchina:citytaiyuanshenyangm"1026439.1070"127.0.0.1:6379>geodistchina:citytaiyuanshenyangkm"1026.4391"georadius

附近的人 ==> 获得所有附近的人的地址, 定位, 通过半径来查询

获得指定数量的人

127.0.0.1:6379>georadiuschina:city110301000km以100,30这个坐标为中心,寻找半径为1000km的城市1)"xian"2)"hangzhou"3)"manjing"4)"taiyuan"127.0.0.1:6379>georadiuschina:city11030500km1)"xian"127.0.0.1:6379>georadiuschina:city11030500kmwithdist1)1)"xian"2)"483.8340"127.0.0.1:6379>georadiuschina:city110301000kmwithcoordwithdistcount21)1)"xian"2)"483.8340"3)1)"108.96000176668167114"2)"34.25999964418929977"2)1)"manjing"2)"864.9816"3)1)"118.75999957323074341"2)"32.03999960287850968"

参数 key 经度 纬度 半径 单位 [显示结果的经度和纬度] [显示结果的距离] [显示的结果的数量]

georadiusbymember

显示与指定成员一定半径范围内的其他成员

127.0.0.1:6379>georadiusbymemberchina:citytaiyuan1000km1)"manjing"2)"taiyuan"3)"xian"127.0.0.1:6379>georadiusbymemberchina:citytaiyuan1000kmwithcoordwithdistcount21)1)"taiyuan"2)"0.0000"3)1)"112.54999905824661255"2)"37.86000073876942196"2)1)"xian"2)"514.2264"3)1)"108.96000176668167114"2)"34.25999964418929977"

参数与 georadius 一样

geohash(较少使用)

该命令返回11个字符的hash字符串

127.0.0.1:6379>setbitsign01(integer)0127.0.0.1:6379>setbitsign11(integer)0127.0.0.1:6379>setbitsign20(integer)0127.0.0.1:6379>setbitsign31(integer)0127.0.0.1:6379>setbitsign40(integer)0127.0.0.1:6379>setbitsign50(integer)0127.0.0.1:6379>setbitsign61(integer)00

将二维的经纬度转换为一维的字符串, 如果两个字符串越接近, 则距离越近

底层

geo底层的实现原理实际上就是Zset, 我们可以通过Zset命令来操作geo

127.0.0.1:6379>setbitsign01(integer)0127.0.0.1:6379>setbitsign11(integer)0127.0.0.1:6379>setbitsign20(integer)0127.0.0.1:6379>setbitsign31(integer)0127.0.0.1:6379>setbitsign40(integer)0127.0.0.1:6379>setbitsign50(integer)0127.0.0.1:6379>setbitsign61(integer)01

查看全部元素 删除指定的元素

127.0.0.1:6379>setbitsign01(integer)0127.0.0.1:6379>setbitsign11(integer)0127.0.0.1:6379>setbitsign20(integer)0127.0.0.1:6379>setbitsign31(integer)0127.0.0.1:6379>setbitsign40(integer)0127.0.0.1:6379>setbitsign50(integer)0127.0.0.1:6379>setbitsign61(integer)02
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么影响了汇率 我有一支万宝龙金笔4810,18K750。可惜笔杆坏了,请问什么地方能配件? 荣耀手机怎么弄轻触亮屏 大姨妈全是血块怎么办 不锈钢丝生产商怎么选好呢? 在春晚上赢的优酷会员卡怎么激活 暑假里 我读了好多好多的书 我也看了电视剧 三国演义 和 西游记... 西游记中银角大王:“叫你一声你敢答应吗?”为何有如此大的力量 ...就玩具战争打不开,加载到100时就停了,肿么办啊? 苹果4手机优酷7天会员怎么激活 为什么哥哥要删我微信呢。哥哥要结婚了? Liqui-Cel 膜接触器、脱气膜国内哪家可以供应? 一般病人送花选什么好 快七夕了,我要送男友花,可是他现在正躺在医院大床上,我该送什麽花祝福... 七夕适合不适合看病人 民营企业贷款,银行强行要求打工的法定代表人做无限连带责任担保合理吗... 哈飞明意汽车,启动不来,没油没电,是霍尔式点火的。什么原因,?? 东风11型机车简介 侄儿刚刚一岁,最近因为感冒,牙都不长了。想给他吃点营养素。亲们推荐一... 东风内燃机车介绍 我梦见侄儿吐血 他还小才5个月,这几天有点感冒又有点咳嗽,我梦见他吐血... Mac上有没有五笔输入法? 苹果mac五笔输入法哪个好用? 历代名著精选集:韩非子目录 韩非子·安危第二十五作者思想 韩非子·安危第二十五原文3 2022新人领证结婚祝福语 淘粉吧玛瑙币怎么提现 淘粉吧返利提现实名认证淘粉吧返利 两岁八个月的孩子积食发烧怎么办 Redis 5种基本数据类型详解 天然酵母耐高糖酵母 做面包为什么要用耐高糖酵母 GTA5怎么刷物品:一种流行游戏内的资源管理策略 福建长乐的护照几年换一次,我是金峰镇的也是在长乐市公安局办证大厅办理... 长乐更换护照需要带什么证件 比现款更精致更运动,全新奥迪A3即将亮相广州车展 ie3.0鼠标dpi值低能否通过设置提高速度? 我有两道数学题不会,就各位帮帮我! ie3.0复刻版只有400dpi,适合打游戏吗?新版外壳掉色吗。 我有两道初一数学题解不开,数学尖子们帮下忙 两道数学题不会,亲们会哪个回答哪个,好不!急急急急急急!!!作业!_百度... 有两道数学题不会 帮下忙 有两道初二数学题不会,求各位指点!最好是有详细过程,谢谢! 韩非子·主道第五作者思想 韩非子·主道第五作者简介 永恒之塔中如何才能显示附近的天族玩家 韩非子·主道第五作品原文3 剑灵,如何像永恒之塔一样在文件上隐藏玩家 韩非子·主道第五作品原文2