Redis三种特殊结构的数据类型
geospatial
朋友的定位、附近的人、打车距离计算?
Redis的Geospatial在Redis3.2就推出了,这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
- getadd 添加地理位置,规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!参数 key 值(维度、经度、名称)
例如:
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing #添加城市的经度纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> GEOPOS china:city beijing shenzhen #获取指定城市的经度纬度
1) 1) “116.39999896287918091”
2) “39.90000009167092543”
2) 1) “114.04999762773513794”
2) “22.5200000879503861”
-
GEODIST:两人之间的距离!
单位:
m表示单位、km表示千米127.0.0.1:6379> GEODIST china:city beijing shenzhen #北京到深圳的直线距离 单位:米
“1945788.0901”
127.0.0.1:6379> GEODIST china:city beijing shenzhen km #北京到深圳的直线距离 单位:千米
“1945.7881” -
GEORADIUS 以给定的经纬度为中心,找出某一半径内的元素
我附近的人?(获得所有附近的人的地址,定位!)通过半径来查询!
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #查询以110 30经纬度为中心,半径为1000km的中国城市
1) “chongqing”
2) “shenzhen”
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) “chongqing”
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist #withdist显示直线距离
1) 1) “chongqing”
2) “341.9374”
2) 1) “shenzhen”
2) “924.6408”
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord #显示经纬度
1) 1) “chongqing”
2) 1) “106.49999767541885376”
2) “29.52999957900659211”
2) 1) “shenzhen”
2) 1) “114.04999762773513794”
2) “22.5200000879503861”
#找出位于指定元素周围的其他元素:
127.0.0.1:6379> GEORADIUSBYMEMBER china:city chongqing 1100 km
1) “chongqing”
2) “shenzhen”
GEOHASH命令-返回一个或多个位置元素的Geohash字符串属性
127.0.0.1:6379> ZRANGE china:city 0 -1
1) “chongqing”
2) “shenzhen”
3) “beijing”
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) “chongqing”
2) “shenzhen”
Hyperloglog
什么是基数?
A{1,3,5,7,8,9} B{1,3,5,7,8}
基数(不重复的元素)= 5,可以接受误差!
简介
Redis2.8.9版本就更新了Hyperloglog数据结构!
Redis Hyperloglog 基数统计的算法!
优点:占用的内存是固定,2^64不同的元素的技术,只需要费12KB内存!
网页的UV(一个人访问一个网站多次,但是还是算作一个人!)
传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了技术,而不是保存用户id;0.81%错误率!统计UV任务,可以忽略不计的!
127.0.0.1:6379> PFadd mykey a b c d e f g h i j #创建第一组元素 mykey
(integer) 1
127.0.0.1:6379> PFCOUNT mykey #统计mykey元素的基数数量
(integer) 10
127.0.0.1:6379> PFadd mykey2 i j z x c v b n m #创建第二组元素 mykey2
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 #合并两组 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> PFCOUNT mykey3 #看并集的数量!
(integer) 15
如果允许容错,那么一定可以使用Hyperloglog!
如果不允许容错,就使用set或者自己的数据类型即可!
Bitmaps
位存储
统计用户信息,活跃,不活跃!登录,未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps!
Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!
365天=365bit 1字节=8bit 46个字节左右!
- 常用操作:模拟一周打卡的情况
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(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 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> bitcount sign #统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3