你所不知的Redis三个特殊类型

geospatial 地理位置

做什么的:geo就是可以将用户的地理位置信息存储起来!(获取你当前的位置)

示例:附近的人,摇一摇,周围多少距离等等。

相关命令:

  • GEOADD
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

实操:

# =====================================
# geoadd 添加一个地理位置到key中
# key longitude latitude member [longitude latitude member ...]
# 将给定的位置(经度和维度)定位一个元素的
# 本质:有序集合。
# =====================================
127.0.0.1:6379> geoadd china:city 116.39 39.91 北京
(integer) 1
127.0.0.1:6379> geoadd china:city 108.93 34.23 西安 113.88 22.55 深圳 120.21
30.20 杭州
(integer) 3
127.0.0.1:6379> geoadd china:city 106.54 29.40 重庆
(integer) 1
127.0.0.1:6379> geoadd china:city 113.64 34.72 郑州
(integer) 1
127.0.0.1:6379> geoadd china:city 116.58702947265623 35.670057681797914 潍坊
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看所有的值,发现确实是一个有序集合!
1) "\xe9\x87\x8d\xe5\xba\x86"
2) "\xe8\xa5\xbf\xe5\xae\x89"
3) "\xe6\xb7\xb1\xe5\x9c\xb3"
4) "\xe6\x9d\xad\xe5\xb7\x9e"
5) "\xe9\x83\x91\xe5\xb7\x9e"6) "\xe6\xbd\x8d\xe5\x9d\x8a"
7) "\xe5\x8c\x97\xe4\xba\xac"
# =====================================
# 查看某个地方的地理位置
# GEOPOS
# =====================================
127.0.0.1:6379> GEOPOS china:city 北京
1) 1) "116.38999968767166138"
2) "39.90999956664450821"
127.0.0.1:6379> GEOPOS china:city 上海 重庆 # 不存在返回nil
1) (nil)
2) 1) "106.54000014066696167"
2) "29.39999880018641676"
127.0.0.1:6379> GEOPOS china:city 潍坊 重庆 # 存储在就返回经纬度
1) 1) "116.58702939748764038"
2) "35.67005742096608145"
2) 1) "106.54000014066696167"
2) "29.39999880018641676"
# =====================================
# 两点之间的距离
# GEODIST key member1 member2 [unit]
# unit 单位 m km mi ft。如果不指定,默认就是 米为单位
# 计算使用地球为一个球型来计算的。可能会造成误差。
# =====================================
127.0.0.1:6379> GEODIST china:city 北京 重庆
"1473946.1729"
127.0.0.1:6379> GEODIST china:city 北京 深圳
"1945352.1782"
127.0.0.1:6379> GEODIST china:city 北京 深圳 km
"1945.3522"
# =====================================
# 附近的人
# key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH]
[COUNT count]
# redis客户端中文乱码问题 --raw
# =====================================
127.0.0.1:6379> GEORADIUS china:city 110.99 35.01 500 km # 查看方圆500km内的城市
西安
郑州
127.0.0.1:6379> GEORADIUS china:city 110.99 35.01 1500 km # 查看方圆1500km内的城市
重庆
西安
深圳
杭州
郑州
潍坊
北京
127.0.0.1:6379> GEORADIUS china:city 110.99 35.01 1500 km withcoord # 查看方圆
1500km内的城市经纬度
重庆
106.54000014066696167
29.39999880018641676
西安108.92999857664108276
34.23000121926852302
深圳
113.87999922037124634
22.5500010475923105
杭州
120.21000176668167114
30.19999988833350102
郑州
113.64000052213668823
34.72000084018613109
潍坊
116.58702939748764038
35.67005742096608145
北京
116.38999968767166138
39.90999956664450821
127.0.0.1:6379> GEORADIUS china:city 110.99 35.01 1500 km withcoord withdist #
查看方圆1500km内的城市距离
重庆
751.2770
106.54000014066696167
29.39999880018641676
西安
207.5518
108.92999857664108276
34.23000121926852302
深圳
1414.0145
113.87999922037124634
22.5500010475923105
杭州
1015.4250
120.21000176668167114
30.19999988833350102
郑州
243.9765
113.64000052213668823
34.72000084018613109
潍坊
513.0298
116.58702939748764038
35.67005742096608145
北京
723.8027
116.38999968767166138
39.90999956664450821
127.0.0.1:6379> GEORADIUS china:city 110.99 35.01 1500 km withcoord withdist
count 2 #查询指定的城市数量
西安
207.5518
108.92999857664108276
34.23000121926852302
郑州
243.9765
113.64000052213668823
34.72000084018613109地图信息表:java=> 批量录入到我们的 china:city (耗内容)===> 然后就可以做所有的地图相关的操
作,距离!
动态录入:获取当前用户的地理位置(APP接口),根据这个范围找到周围的人了!实现了附近的人的
功能
bitmaps
介绍:
在开发中,统计用户的信息,活跃和不活跃,登录还是没有登录,一年的打卡情况!
# =====================================
# 附近的人,通过 member
# GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST]
[WITHHASH] [COUNT count]
# =====================================
127.0.0.1:6379> GEORADIUSBYMEMBER china:city 北京 1000 km
郑州
潍坊
北京
西安
127.0.0.1:6379> GEORADIUSBYMEMBER china:city 北京 1000 km withdist
郑州
626.3359
潍坊
471.9106
北京
0.0000
西安
914.4648
# =====================================
# 删除元素;zrem
# 原理:底层就是 有序集合
# =====================================
127.0.0.1:6379> zrange china:city 0 -1 # 查看全部的元素!
重庆
西安
深圳
杭州
郑州
潍坊
北京
127.0.0.1:6379> zrem china:city 北京 # 移除元素
1 1
27.0.0.1:6379> zrange china:city 0 -1
重庆
西安
深圳
杭州
郑州
潍坊

应用:
地图信息表:java=>批量录入到我们的china:ctiy(耗内容)===》然后就可以做所有的地图相关的操作,距离!
动态录入:获取当前用户的地理位置(APP接口),根据这个范围找到周围的人了!实现了附近的人的功能!

bitmaps

场景描述:

在开发中,我们需要统计用户的信息,例如活跃和不活跃,登录还是没有登录,一年的打卡情况!
正常:key/value 365个记录。如果用户量很大,空间也很浪费!

而bitmaps是存放的0101这种二进制数据的,我们可以按照0和1两个标识代表没打卡和打卡,这样的话只需要365bit的数据了,极大的节约了内存.

set操作

# 打卡sign:id 0记录天数 值就是0和1
# 周一:来了
# 周二:没来
# ....
127.0.0.1:6379> setbit sign 0 1
0 
127.0.0.1:6379> setbit sign 1 0
0 
127.0.0.1:6379> setbit sign 2 0
0 
127.0.0.1:6379> setbit sign 3 0
0 
127.0.0.1:6379> setbit sign 4 0
0 
127.0.0.1:6379> setbit sign 5 1
0 
127.0.0.1:6379> setbit sign 6 0
0

get操作

127.0.0.1:6379> getbit sign 3 # 查看周三是否打卡
0 
127.0.0.1:6379> getbit sign 5 # 查看周五是否打卡
1

统计功能

#统计存储的值的记录,返回值为1的个数!
127.0.0.1:6379> BITCOUNT sign
2

我们在生活中,或编程中,只要只有两个标志位(0 1)我们都可以使用bitmap来进行操作,这样的话,十分方便,还有就是能够极大的节约内存!

hyperloglogs

hyperloglog是用来做基数统计的,优点:输入的体积无论多么大,那hyperloglog使用的空间总是固定的12KB,且很小!利用12KB,它可以计算2^64个不同元素的基数!

例子:网页统计UV(浏览用户数量,一天同一个用户访问多次,只能算访问一次!目的是计数,而不是保存用户)

传统:set(用户的id,存到set中),获取set的大小.但是一点用户量过大,就会出现问题,而hyperloglog只需要12kb就可以统计超大的用户数量.

去重

什么是基数,例如有一个原始的数据集{1,3,5,7,5,7,8},而它的基数集就是{1,3,5,7,8},从这里可以看出所谓基数就是去重后的数.

测试:

127.0.0.1:6379> pfadd mykey a b c d e f g h i j # 添加元素
1 
127.0.0.1:6379> PFCOUNT mykey # 统计
10
127.0.0.1:6379> pfadd tkey a a a b b b
1 
127.0.0.1:6379> PFCOUNT tkey
2 #
多个数据集合并?
127.0.0.1:6379> pfadd mykey a b c d e f g h i j
1 
127.0.0.1:6379> pfadd mykey2 i j k l m n o
1 
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
OK
127.0.0.1:6379> PFCOUNT mykey3 # 合并后的基数集!
15

什么情况使用hyperloglogs:统计不重复的数,大数据量更好,容错率!精确统计的就不要用hyperloglogs,因为它存在 ~ 1%的错误率!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值