redis三大特殊模型
Geospatial 地理位置
# getadd 添加地理位置
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379> geoadd china:city 39.90 116.40 beijing
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
geoadd #添加地理位置信息
127.0.0.1:6379> geoadd china:city 116.40 39.30 beijing #添加4个位置信息
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.32 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.35 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 10.16 30.24 hangzhou
(integer) 1
geopos #获取指定位置的经纬度
127.0.0.1:6379> geopos china:city shanghai #获取指定位置的地理位置经纬度
1) 1) "121.47000163793564"
2) "31.319999383962482"
127.0.0.1:6379>
geodisi #查看两地之间的距离
俩人之间的位置
单位:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
127.0.0.1:6379> geodist china:city shanghai beijing km #获取上海到北京的直线距离
"999.3336"
127.0.0.1:6379> geodist china:city shanghai hangzhou km #获取上海到杭州的直线距离
"10051.2701"
127.0.0.1:6379>
georadius 以给定的经纬度为中心, 找出某一半径内的元素
我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询!
127.0.0.1:6379> georadius china:city 121.47 31.32 2000 km #以上海为中心方圆2000km的城市
1) "chongqing"
2) "shanghai"
3) "beijing"
127.0.0.1:6379> georadius china:city 121.47 31.32 2000 km withdist #获取以上海为中心方圆2000km的城市和该城市到上海的直线距离
1) 1) "chongqing"
2) "1452.5208"
2) 1) "shanghai"
2) "0.0002"
3) 1) "beijing"
2) "999.3335"
127.0.0.1:6379> georadius china:city 121.47 31.32 50 km withcoord #显示该121.47 31.32地址方圆50km里其他城市的定位信息(查询某人的定位)
1) 1) "shanghai"
2) 1) "121.47000163793564"
2) "31.319999383962482"
127.0.0.1:6379>
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1 #筛选出该位置所在地离重庆的直线距离和重庆的经纬度!(筛选指定位置信息)
1) 1) "chongqi"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
GEORADIUSBYMEMBER #找出位于指定元素周围的其他元素!
127.0.0.1:6379> georadiusbymember china:city beijing 500 km #位于北京周围方圆500km的城市(因为地址是我手动输入所以显示的比较少)
1) "beijing"
127.0.0.1:6379> georadiusbymember china:city beijing 500 km withcoord #位于北京周围方圆500kM 的城市和该城市的经纬度
1) 1) "beijing"
2) 1) "116.39999896287918"
2) "39.300001176601477"
127.0.0.1:6379>
GEOHASH 命令 - 返回一个或多个位置元素的 Geohash 表示
该命令将返回11个字符的Geohash字符串!
# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city chongqing #重庆
1) "wm5wzrnbju0"
127.0.0.1:6379> geohash china:city beijing chongqing #北京 重庆
1) "wwfz8drghe0"
2) "wm5wzrnbju0"
127.0.0.1:6379>
geo底层是zset 可以使用zset命令来操作Geospatial
127.0.0.1:6379> zrange china:city 0 -1 #查询所有城市
1) "hangzhou"
2) "chongqing"
3) "shanghai"
4) "fanlan"
5) "beijing"
127.0.0.1:6379> zrem china:city fanlan #删除某个城市
(integer) 1
127.0.0.1:6379>
Hyperloglog
基数:基数(cardinal number)在数学上,是集合论中刻画任意集合大小的一个概念。两个能够建立元素间一一对应的集合称为互相对等集合。例如3个人的集合和3匹马的集合可以建立一一对应,是两个对等的集合。
(不重复的元素)
Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!
Redis Hyperloglog 基数统计的算法!
优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的
话 Hyperloglog 首选!
网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
传统的方式, set 保存用户的id,然后就可以统计 set 中的元素数量作为标准判断 !
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;
0.81% 错误率! 统计UV任务,可以忽略不计的!
测试使用
127.0.0.1:6379> pfadd name fanlan fx zfx woshifanlan #创建元素
(integer) 1
127.0.0.1:6379> pfcount name #查看里面元素个数
(integer) 4
127.0.0.1:6379> pfadd name1 zhouzhou
(integer) 1
127.0.0.1:6379> pfadd name1 fanlan fx
(integer) 1
127.0.0.1:6379> pfcount name1
(integer) 3
127.0.0.1:6379> pfmerge name3 name name1 #合并两个元素到一个新元素当中
OK
127.0.0.1:6379> pfcount name3 #查看新元素
(integer) 5
127.0.0.1:6379>
Bitmap
位存储
统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用
Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
周一:1 周二:0 周三:0 周四:1 …
127.0.0.1:6379> setbit week 0 1 #打卡第一天
(integer) 0
127.0.0.1:6379> setbit week 1 1
(integer) 0
127.0.0.1:6379> setbit week 2 0
(integer) 0
127.0.0.1:6379> setbit week 3 1
(integer) 0
127.0.0.1:6379> setbit week 4 1
(integer) 0
127.0.0.1:6379> setbit week 5 0
(integer) 0
127.0.0.1:6379> setbit week 6 1
(integer) 0
127.0.0.1:6379> getbit week 3 #查看星期三是否打卡
(integer) 1
127.0.0.1:6379> bitcount week #查看打卡天数
(integer) 5
127.0.0.1:6379>