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>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值