Redis学习日志——三种特殊数据类型

三种特殊数据类型

geospatial 地理位置

使用场景:定位?附近的人?打车距离计算?

Redis的Geo在redis3.2版本推出了,这个功能可以推算两地之间的地理距离

查询地理位置及经纬度:http://www.jsons.cn/lngcode

Redis学习日志——三种特殊数据类型_第1张图片

getadd

#getadd	添加地理位置
#两级无法添加,我们一般不会下载城市数据,直接通过java导入
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing		#geoadd  <经度> <纬度>
(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 104.06 30.65 chengdu
(integer) 1
127.0.0.1:6379> geoadd china:city 106.09 30.79 nanchong
(integer) 1

getpos

#getpos 获取指定城市的经度和纬度
127.0.0.1:6379> geopos china:city nanchong
1) 1) "106.09000056982040405"
   2) "30.78999932842934584"

geodist

返回两个给定位置之间的距离。

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
127.0.0.1:6379> geodist china:city nanchong chengdu km		#查看直线距离
"194.7264"
127.0.0.1:6379> geodist china:city beijing chengdu km
"1518.4302"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"

georadus

#以设置的经纬度为圆心,radiss为半径,向周围搜索
127.0.0.1:6379> georadius china:city 105 30 500 km withdist withcoord 
1) 1) "chengdu"
   2) "115.6341"		#withdist	为直线距离
   3) 1) "104.05999749898910522"		#withcoord为经纬度
      2) "30.6499990746355806"
2) 1) "nanchong"
   2) "136.5874"
   3) 1) "106.09000056982040405"
      2) "30.78999932842934584"
127.0.0.1:6379> georadius china:city 105 30 500 km withdist withcoord count 1			#用count规定个数
1) 1) "chengdu"
   2) "115.6341"
   3) 1) "104.05999749898910522"
      2) "30.6499990746355806"

georaduisbymember

#通过key中元素来查找周围符合条件的元素
127.0.0.1:6379> georadiusbymember china:city nanchong 200 km withdist withcoord
1) 1) "chengdu"
   2) "194.7264"
   3) 1) "104.05999749898910522"
      2) "30.6499990746355806"
2) 1) "nanchong"
   2) "0.0000"
   3) 1) "106.09000056982040405"
      2) "30.78999932842934584"

geohash

该命令将返回11个字符的Geohash字符串

#将二维的经纬度转化为一维的哈希值
127.0.0.1:6379> geohash china:city beijing chengdu
1) "wx4fbxxfke0"
2) "wm3yrgwjjt0"

geo的底层实现是zset,所以我们可以通过zset的命令来操作geo

127.0.0.1:6379> zrange china:city 0 -1
1) "chengdu"
2) "nanchong"
3) "shanghai"
4) "beijing"
127.0.0.1:6379> zrem china:city nanchong
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chengdu"
2) "shanghai"
3) "beijing"

Hyperloglog

简介

Hyperloglog是redis基数(无重复)统计的算法

优点:占用的内存是固定的,用12kb的内存可以保存2^64不同元素的计数,从内存角度来看,hyperloglog是首选

比如说:计算网站的人数(一个客户访问一个网站多次,但还是算作一个)

传统的方式是使用set方法保存用户的id,可以统计set的元素数量来作为人数

这个方式在保存大量的用户id,就会比较麻烦!我们的目的是计数而不是保存用户id!

测试

127.0.0.1:6379> pfadd mykey a a b c d e
(integer) 1
127.0.0.1:6379> pfcount mykey			#只计算集合的基数
(integer) 5
127.0.0.1:6379> pfadd mykey1 d e f g h
(integer) 1
127.0.0.1:6379> pfmerge mykey2 mykey mykey1		#求两个集合的并集并转化为一个新的集合
OK
127.0.0.1:6379> pfcount mykey2
(integer) 8

Bitmaps

位存储

操作二进制位来进行数据记录,一般用于两种状态的记录,比如:

统计用户信息:登录,未登录;打卡,未打卡 可以用0 1来描述

测试

比如说,记录一周的打卡记录,0为未打卡,1为打卡

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0

获取某一天的情况

127.0.0.1:6379> getbit sign 0	#获取星期一的打卡状态		
(integer) 1
127.0.0.1:6379> getbit sign 2	#获取周日的打卡状态
(integer) 0

统计一段时间内的打卡数

127.0.0.1:6379> bitcount sign
(integer) 6

你可能感兴趣的:(java学习之路,redis)