Redis的三种特殊数据类型

三种特殊数据类型

Geospatial

朋友的定位,附近的人,打车距离计算?

可以查询一些测试数据 http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3

操作命令
命令描述
Redis GEOHASH 命令返回一个或多个位置元素的 Geohash 表示
Redis GEOPOS 命令从key里返回所有给定位置元素的位置(经度和纬度)
Redis GEODIST 命令返回两个给定位置之间的距离
Redis GEORADIUS 命令以给定的经纬度为中心, 找出某一半径内的元素
Redis GEOADD 命令将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
Redis GEORADIUSBYMEMBER 命令找出位于指定范围内的元素,中心点是由给定的位置元素决定
# gadd key 纬度 经度 名称
#有效经度从-180到180度。
#有效纬度从 -85.05112878 到 85.05112878 度。
#当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379> geoadd china:city 116.405289 39.904987 beijing 
(integer) 1
127.0.0.1:6379> geoadd china:city 121.472641 31.231707 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504959 29.533155 chongqing 114.085945 22.547001 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.15358 30.287458 hangzhou 125.151421 42.920414 xian
(integer) 2
###########################################
127.0.0.1:6379> geopos china:city beijing # 获取指定城市的定位(经度,纬度)
1) 1) "116.40528827905654907"
   2) "39.90498588819134085"
127.0.0.1:6379> geopos china:city beijing chongqing
1) 1) "116.40528827905654907"
   2) "39.90498588819134085"
2) 1) "106.50495976209640503"
   2) "29.53315530684997015"
   
######################################## 
#GEODIST 命令 - 返回两个给定位置之间的距离
#如果两个位置之间的其中一个不存在, 那么命令返回空值。
#指定单位的参数 unit 必须是以下单位的其中一个:
#m 表示单位为米。
#km 表示单位为千米。
#mi 表示单位为英里。
#ft 表示单位为英尺。
#如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
#返回值
#计算出的距离会以双精度浮点数的形式被返回。 如果给定的位置元素不存在, 那么命令返回空值。
127.0.0.1:6379> geodist china:city beijing shanghai #查看北京到上海的直线距离,默认单位为m
"1067597.0432"
127.0.0.1:6379> geodist china:city beijing shanghai km #指定单位为km
"1067.5970"
127.0.0.1:6379> geodist china:city beijing chongqing km
"1464.2211"

###############################################
GEORADIUS 命令 - 以给定的经纬度为中心, 找出某一半径内的元素
127.0.0.1:6379> georadius china:city 110 30 1000 km #找出以(110,30)为中心,寻找方圆1000km内的城市
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist #显示到中心距离的位置
1) 1) "chongqing"
   2) "341.4052"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord # 显示城市的地位
1) 1) "chongqing"
   2) 1) "106.50495976209640503"
      2) "29.53315530684997015"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2 #筛选指定数量
1) 1) "chongqing"
   2) "341.4052"
   3) 1) "106.50495976209640503"
      2) "29.53315530684997015"
      
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km #找出以指定元素周围的元素
1) "beijing"
2) "xian"
######################################
#Geohash 返回11个字符的Geohash字符串
# 将二位的经纬度转换为一维的字符串,降维打击,两个字符串越接近则距离越近
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4g0b7xru0"
2) "wm78p86e170"
127.0.0.1:6379> 
底层原理

底层就是Zset集合,我们可以使用Zset命令来操作GEO

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

应用
  • 获取目的地位置
  • 附近的人
  • 同城距离

Hyperloglog

基数(不重复的元素)

简介
  • 2.8.9更新该结构
  • 基数统计的算法
  • 优点
    • 占用内存固定,2^64不同元素,只需要12KB内存
    • 从内存角度比较,Hyperloglog首选
  • 0.81%错误率! 使用时要可以忽略
操作
127.0.0.1:6379> pfadd mykey a b c d e f g h i j #创建第一组元素 mykey
(integer) 1
127.0.0.1:6379> pfcount mykey # 统计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 #合并两组 mykey mykey2=>mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15

应用
  • 计数统计
    • 如果允许容错,那么一定可以使用Hyperloglog
    • 如果不允许,就是使用set或 自己的数据结构

Bitmap

简介
  • 位存储
    • 统计用户信息,活跃,不活跃!登录、未登录!打开,365天打卡。
    • 只有两个状态的都可以使用Bitmaps
  • Bitmap位图,数据结构!都是操作二进制位来进行记录,只有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 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3 # 获取3位置 周四未打卡为0
(integer) 0
127.0.0.1:6379> getbit sign 0 # 获取0位置,周一打卡为1
(integer) 1
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> bitcount sign # 统计这一周的打卡记录,可以查看是否全勤
(integer) 2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值