Redis三种特殊数据类型

geospatial地理位置

定位、附近的人、打车距离计算
Redis的Geo在redis3.2版本就推出了,这个功能可以推算地理位置的信息,(两地之前的距离,方圆几里的人……)
可以查询一些测试数据:http://www.jsons.cn/lngcode/

命令

在这里插入图片描述

geoadd 添加地理位置

  • 规则:南北极无法直接添加,一般会下载城市数据,通过java程序一次性导入
  • 语法:geoadd key 经度 纬度 name
  • 有效的经度从-180度到+180度之间
  • 有效的纬度从-85.05112878到85.05112878度
  • 当坐标超出上述制令范围时,该命令会返回一个错误
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 106.50 29.53 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3

geopos获取指定城市的经纬度

127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing xian
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "108.96000176668167114"
   2) "34.25999964418929977"

geodist返回两地之间的距离

  • 单位
    • m表示米
    • km表示千米
    • mi表示英里
    • ft表示英尺
127.0.0.1:6379> geodist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"

georadius通过半径招找人

附近的人?(需或得所有附近的人的定位,通过半径查询)

  • 语法:geordius key 经度 纬度 半径 单位
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
#结果带经纬度
127.0.0.1:6379> georadius china:city 110 30 1000 km withdist withcoord 
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
3) 1) "shenzhen"
   2) "924.6408"
   3) 1) "114.04999762773513794"
      2) "22.5200000879503861"
4) 1) "hangzhou"
   2) "977.5143"
   3) 1) "120.1600000262260437"
      2) "30.2400003229490224"
#结果带经纬度且限制返回个数
127.0.0.1:6379> georadius china:city 110 30 1000 km withdist withcoord count 2
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"

georadiusbymember 找出指定范围内的元素,中心点由给定的位置元素决定

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km withdist
1) 1) "hangzhou"
   2) "166.7613"
2) 1) "shanghai"
   2) "0.0000"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km withdist withcoord
1) 1) "hangzhou"
   2) "166.7613"
   3) 1) "120.1600000262260437"
      2) "30.2400003229490224"
2) 1) "shanghai"
   2) "0.0000"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km withdist withcoord count 1
1) 1) "shanghai"
   2) "0.0000"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"

geohash返回一个或多个位置元素的geohash表示

#将二维经纬度转换为一维字符串
127.0.0.1:6379> geohash china:city beijing shanghai
1) "wx4fbxxfke0" #表示经纬度字符串
2) "wtw3sj5zbj0"

geo底层由zset实现,可以通过zrem删除

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city xian
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"

hyperloglog

基数

A{1,3,5,7,8,7}
B{1,3,5,7,8}
基数(不重复的数)= 5,可以接受误差

简介

Redis2.8.9就更新了Hyperloglog
Redis Hyperloglog基数统计的算法
优点: 占用的内存是固定的,264不同的元素的技术,只需要12KB内存
网页的UV(一个人访问一个网站多次,但还是算作一个人)

  • 传统方式
    • set保存用户id,然后就可以统计set中的元素数量作为标准判断
    • 如果保存大量的用户id,就会比较麻烦;我们的目的是为了计数而不是存储id
    • 0.81%错误率,统计UV任务,可以忽略不计!
  • redis方式
################################################################
127.0.0.1:6379> pfadd mykey a b c d e f g
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 7
127.0.0.1:6379> pfadd mykey a b c d e f g a d m
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 8
################################################################
127.0.0.1:6379> pfadd mykey a b c d e f g h i j#创建第一组
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m#创建第二组
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2#合并两组
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
  • 如果允许容错就用Hyperloglog
  • 如果不允许容错就用set或者自己的数据类型即可

bitmaps

位存储

统计用户信息。活跃、不活跃;登录、未登录;打卡,未打卡;
只要是两个状态的都可以使用bitmaps
bitmaps位图,数据结构都是操作二进制位来记录,只有0和1两个状态

测试

  • 使用bitmap来记录周一到周日的打卡
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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(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> getbit sign 6
(integer) 0
################################################################
#统计打卡天数
127.0.0.1:6379> bitcount sign
(integer) 4

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值