哈喽,我是飞鸟,如果文章写得不是很好还请见谅,我会继续学习总结,那么可以的话给我点个关注,点赞支持小编,谢谢
推荐阅读:
Day2、我室友打了一把王者时间我学会了Redis的入门指南
Redis三种特殊数据类型(地理位置、基数统计、位图场景使用)
启动服务端
redis-server.exe redis.windows.conf
启动客户端
redis-cli.exe -h 127.0.0.1 -p 6379
1、Gaospatial地理位置
朋友的定位,附近的人,打车距离如何计算?
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增
可以查询位置的经纬度测试数据:http://www.jsons.cn/lngcode/
GEOADD 将指定的地理空间位置(经度、纬度、名称)添加到指定的key中
GEOADD key longitude latitude member [longitude latitude member …]
- longitude经度
- latitude纬度
- member名称
查询深圳,北京,上海的经纬度
#规则:两级无法直接添加,我们一般会下载城市数据,直接通过Java程序一次性导入! 127.0.0.1:6379>GEOADD china:city 114.08 22.54 shenzhen (integer) 1 127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing (integer) 1 127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai (integer) 1 127.0.0.1:6379> GEOADD china:city 120.15 30.28 hangzhou 113.28 23.12 guangzhou (integer) 2
GEOPOS 从key里返回所有给定位置元素的位置(经纬度)
- GEOPOS key member [member …]
获取当前定位!
127.0.0.1:6379> GEOPOS china:city beijing 1) 1) "116.39999896287918091" 2) "39.90000009167092543" 127.0.0.1:6379> GEOPOS china:city shanghai 1) 1) "121.47000163793563843" 2) "31.22999903975783553"
GEODIST 返回两个定位之间的距离
GEODIST key member1 member2 [unit]
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺
北京与广州的距离!
127.0.0.1:6379> GEODIST china:city beijing guangzhou "1889326.0478"
GEORADIUS 已给定的经纬度为中心,找出某一半径内的元素
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC
附近的人?(获得所有附近的人地址,定位),通过半径来查询,北京经纬度116,39为中心,半径1000公里,寻找1000以内获取北京,上海位置
127.0.0.1:6379> GEORADIUS china:city 116 39 1000 km 1) "beijing" 2) "shanghai" 127.0.0.1:6379> GEORADIUS china:city 116 39 1000 km WITHDIST# 显示到中心距离的位置 1) 1) "beijing" 2) "105.8343" 2) 1) "shanghai" 2) "996.7785" 127.0.0.1:6379> GEORADIUS china:city 116 39 1000 km withcoord #显示他人的定位信息 1) 1) "beijing" 2) 1) "116.39999896287918091" 2) "39.90000009167092543" 2) 1) "shanghai" 2) 1) "121.47000163793563843" 2) "31.22999903975783553"
GEORADIUSBYMEMBER 找出位于指定范围内的元素,中心点是由给定的位置元素决定
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [
以上海为中心,半径为500公里指出范围内的元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 500 km 1) "hangzhou" 2) "shanghai"
GEOHASH 返回一个或多个位置元素的Geohash表示
命令将返回11个字符的Geohash字符串
将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近
127.0.0.1:6379> geohash china:city shanghai hangzhou 1) "wtw3sj5zbj0" 2) "wtmkq069cc0"
geo低层的实现原理就是Zset,我们可以使用Zset命令来使用geo
127.0.0.1:6379> ZRANGE china:city 0 -1 #查看地图中全部元素 1) "shenzhen" 2) "guangzhou" 3) "hangzhou" 4) "shanghai" 5) "beijing" 127.0.0.1:6379> zrem china:city beijing #移除指定元素 (integer) 1 127.0.0.1:6379> zrange china:city 0 -1 1) "shenzhen" 2) "guangzhou" 3) "hangzhou" 4) "shanghai"
Redis GEO 操作总结方法有:
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。
2、HyperLogLog基数统计
Redis HyperLogLog 是用来做基数统计的算法
优点:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。2^64不同的元素的技术,只需要费12kb内存
什么事基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
127.0.0.1:6379> PFADD feiniao a b c d e #创建第一组元素feiniao (integer) 1 127.0.0.1:6379> PFCOUNT feiniao #统计基数数量 (integer) 5 127.0.0.1:6379> PFADD feiniao1 c d f g h #创建第一组元素feiniao (integer) 1 127.0.0.1:6379> PFCOUNT feiniao1 ##统计基数数量 (integer) 5 127.0.0.1:6379> PFMERGE feiniao2 feiniao feiniao1 #合并两组,并集 OK 127.0.0.1:6379> PFCOUNT feiniao2 # 查看基数数量 (integer) 8
3、Bitmaps位图场景
位存储
统计用户信息,用01表示,例如打卡为1,不打卡为0,关注博主为1,不关注为0,都可以使用bitmaps!
使用bitmap来记录 周一到周日的打卡
周一:0 周二:1 周三:0…
127.0.0.1:6379> setbit sign 1 0 (integer) 0 127.0.0.1:6379> setbit sign 2 1 (integer) 0 127.0.0.1:6379> setbit sign 3 0 (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> getbit sign 3 (integer) 0 127.0.0.1:6379> getbit sign 2 (integer) 1
统计打卡天数
127.0.0.1:6379> bitcount sign (integer) 2
文献:官方中文文档 、狂神up主、菜鸟教程
赠人玫瑰,手有余香