本文将详细解释Redis中的特殊数据类型。边肖觉得挺实用的,分享给大家参考。希望你看完这篇文章能有所收获。
Redis中除了五种基本数据类型外,还有三种特殊的数据类型,即HyperLogLogs(基数统计)、Bitmaps(位图)和geospatial(地理位置)。
00-1010版本的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、在线用户、共同好友等等。
它的优势体现在哪?
比如一个大型网站,每天有100万个IP,大致一个IP消耗15个字节,那么100万个IP就是15M。但是Redis中HyperLogLog的每个键占用12K,理论存储接近2.64个值。无论存储的内容是什么,Hyperloglog都是一种基于基数估计的算法,只能准确估计基数,并且可以使用少量的固定内存来存储和识别集合中唯一的元素。而且估计的基数不一定准确,是标准误差为0.81%的近似值(对于可以接受一定容错的业务场景,如IP数统计、UV等。可以忽略)。
相关命令使用
创建第一组元素
(整数)1
17.0.0.1:6379 pfcountkey1 #统计元素基数数
(整数)9
17 . 0 . 0 . 1:6379 pf addkey 2 cjklmoga #创建第二组元素
(整数)1
127.0.0.1:6379pfcountkey2
(整数)8
17 . 0 . 0 . 1:6379 pfmergekey 3 key 1 key 2 #合并两个组:key 1k key 2-key 3 merge。
好
127.0.0.1:6379pfcountkey3
(整数)13
HyperLogLogs(基数统计)
Bitmap,即位图数据结构,全部操作二进制位进行记录,只有0和1两种状态。
用来解决什么问题?
例如:统计用户信息,活动,非活动!登录,未登录!打卡,别打卡!两个状态的,都可以使用 Bitmaps!
存储打卡状态一年需要多少内存?35天=365位1字节=8位46字节左右!
相关命令使用
用位图记录周一到周日打卡!周一:1周二:0周三:0周四:1.
127.0.0.1:6379setbitsign01
(整数)0
127.0.0.
1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
查看某一天是否有打卡!
127.0.0.1:6379> getbit sign 3 (integer) 1 127.0.0.1:6379> getbit sign 5 (integer) 0
统计操作,统计 打卡的天数!
127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤! (integer) 3
geospatial (地理位置)
Redis 的 Geo 在 Redis 3.2 版本就推出了! 这个功能可以推算地理位置的信息:两地之间的距离,,方圆几里的人。
geoadd
添加地理位置
127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang (integer) 3 127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian (integer) 3
规则
两级无法直接添加,我们一般会下载城市数据(这个网址可以查询 GEO:http://www.jsons.cn/lngcode)!
-
有效的经度从-180度到180度。
-
有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin (error) ERR invalid longitude,latitude pair 39.900000,116.400000
geopos
获取指定的成员的经度和纬度
127.0.0.1:6379> geopos china:city taiyuan manjing 1) 1) "112.54999905824661255" 1) "37.86000073876942196" 2) 1) "118.75999957323074341" 1) "32.03999960287850968"
获得当前定位, 一定是一个坐标值!
geodist
如果不存在, 返回空
单位如下
-
m
-
km
-
mi 英里
-
ft 英尺
127.0.0.1:6379> geodist china:city taiyuan shenyang m "1026439.1070" 127.0.0.1:6379> geodist china:city taiyuan shenyang km "1026.4391"
georadius
附近的人 ==> 获得所有附近的人的地址, 定位, 通过半径来查询
获得指定数量的人
127.0.0.1:6379> georadius china:city 110 30 1000 km 以 100,30 这个坐标为中心, 寻找半径为1000km的城市 1) "xian" 2) "hangzhou" 3) "manjing" 4) "taiyuan" 127.0.0.1:6379> georadius china:city 110 30 500 km 1) "xian" 127.0.0.1:6379> georadius china:city 110 30 500 km withdist 1) 1) "xian" 2) "483.8340" 127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2 1) 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> georadiusbymember china:city taiyuan 1000 km 1) "manjing" 2) "taiyuan" 3) "xian" 127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2 1) 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> geohash china:city taiyuan shenyang 1) "ww8p3hhqmp0" 2) "wxrvb9qyxk0"
将二维的经纬度转换为一维的字符串, 如果两个字符串越接近, 则距离越近
底层
geo底层的实现原理实际上就是Zset, 我们可以通过Zset命令来操作geo
127.0.0.1:6379> type china:city zset
查看全部元素 删除指定的元素
127.0.0.1:6379> zrange china:city 0 -1 withscores 1) "xian" 2) "4040115445396757" 3) "hangzhou" 4) "4054133997236782" 5) "manjing" 6) "4066006694128997" 7) "taiyuan" 8) "4068216047500484" 9) "shenyang" 1) "4072519231994779" 2) "shengzhen" 3) "4154606886655324" 127.0.0.1:6379> zrem china:city manjing (integer) 1 127.0.0.1:6379> zrange china:city 0 -1 1) "xian" 2) "hangzhou" 3) "taiyuan" 4) "shenyang" 5) "shengzhen"
关于“Redis中的特殊数据类型有哪些”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155147.html