Redis(四)------三种特殊数据类型
7、三种特殊数据类型
7.1 Geospatial(地理位置)
使用经纬度定位地理坐标,并用一个有序集合Zset保存,所以,Zset的命令也可以使用
有效经纬度
经度:-180度到180度
纬度:-85.05112878度到85.05112878度
7.1.1 基本用法
命令
描述
GeoAdd key longitud(经度) latitude(维度) member…
将具体经纬度的坐标存入一个有序集合
Geopos key member1 member2…
获取集合中一个/多个成员的坐标
Geodist key member1 member2 距离单位
返回给定两个位置之间的距离,默认单位为米
Georadius key longitudu(经度) latitude(纬度) 半径最大距离 单位(m/km/mi/ft) [with位置元素]
以给定经纬度为中心点,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
Georadiusbymember key member 半径最大距离…
以已有成员作为中心点,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
Geohash key member1 member2…
返回一个/多个位置元素的Geohash表示,使用Geohash位置52点整数编码(11个字符)
Georadius参数:
withcoord:显示坐标
withdist:显示距离,单位和半径单位相同
count n:只显示前n个,距离递增排序
7.1.2 Geoadd
坐标存储到Zset中,查看集合的数据可以用Zset命令来查看
当坐标位置超出上述指定范围时,该命令将会返回一个错误
南北两级无法直接添加,一般会下载城市数据,通过java程序一次性导入
---------- getadd ---------- 添加地理位置 ----------
127.0 .0.1:6379 > GEOADD china:city 116.41667 39.91667 beijing
( integer) 1
127.0 .0.1:6379 > GEOADD china:city 121.43333 34.50000 shanghai
( integer) 1
127.0 .0.1:6379 > GEOADD china:city 117.20000 39.13333 tianjing
( integer) 1
127.0 .0.1:6379 > GEOADD china:city 118.78333 32.05000 jiangsu
127.0 .0.1:6379 > ZRANGE china:city 0 -1
1 ) "jiangsu"
2 ) "shanghai"
3 ) "tianjing"
4 ) "beijing"
7.1.3 Geopos
---------- Geopos ---------- 获取当前定位(经纬度) ----------
127.0 .0.1:6379 > GEOPOS china:city jiangsu
1 ) 1 ) "118.78332942724227905"
2 ) "32.04999907785209956"
127.0 .0.1:6379 > GEOPOS china:city jiangsu shanghai
1 ) 1 ) "118.78332942724227905"
2 ) "32.04999907785209956"
2 ) 1 ) "121.4333304762840271"
2 ) "34.49999971716130887"
7.1.4 Geodist
指定单位的参数必须是以下单位的其中一个:
m :米
km :千米
mi :英里
ft :英尺
---------- Geodist ---------- 获取两位置间距离 ----------
127.0 .0.1:6379 > GEODIST china:city jiangsu beijing km
"900.4314"
7.1.5 Georadius
Georadius参数:
withcoord:显示坐标
withdist:显示距离,单位和半径单位相同
count n:只显示前n个,距离递增排序
---------- Georadius ---------- 获取距该位置(经纬度)半径为n的位置 ----------
127.0 .0.1:6379 > GEORADIUS china:city 110 30 1000 km
1 ) "chongqing"
2 ) "shenzhen"
3 ) "hangzhou"
4 ) "jiangsu"
127.0 .0.1:6379 > GEORADIUS china:city 110 30 500 km
1 ) "chongqing"
127.0 .0.1:6379 > GEORADIUS china:city 110 30 1000 km withcoord withdist
1 ) 1 ) "chongqing"
2 ) "346.0548"
3 ) 1 ) "106.4500012993812561"
2 ) "29.56666939001875249"
2 ) 1 ) "shenzhen"
2 ) "915.6424"
3 ) 1 ) "114.06667023897171021"
2 ) "22.61666928352524764"
3 ) 1 ) "hangzhou"
2 ) "981.3098"
3 ) 1 ) "120.20000249147415161"
2 ) "30.2666706589875858"
4 ) 1 ) "jiangsu"
2 ) "867.3741"
3 ) 1 ) "118.78332942724227905"
2 ) "32.04999907785209956"
127.0 .0.1:6379 > GEORADIUS china:city 110 30 1000 km withcoord withdist count 1
1 ) 1 ) "chongqing"
2 ) "346.0548"
3 ) 1 ) "106.4500012993812561"
2 ) "29.56666939001875249"
7.1.6 Georadiusbymember
Georadius参数:
withcoord:显示坐标
withdist:显示距离,单位和半径单位相同
count n:只显示前n个,距离递增排序
---------- Georadiusbymember ---------- 获取距离该成员半径为n的位置 ----------
127.0 .0.1:6379 > GEORADIUSBYMEMBER china:city jiangsu 1000 km
1 ) "jiangsu"
2 ) "shanghai"
3 ) "tianjing"
4 ) "beijing"
5 ) "hangzhou"
127.0 .0.1:6379 > GEORADIUSBYMEMBER china:city jiangsu 500 km
1 ) "jiangsu"
2 ) "shanghai"
3 ) "hangzhou"
7.1.7 Geohash
---------- Geohash ---------- 返回元素 的hash表示 ----------
127.0 .0.1:6379 > GEOHASH china:city jiangsu shanghai hangzhou
1 ) "wtsqqfx2u00"
2 ) "wwnk72911d0"
3 ) "wtmkpjyuph0"
---------- 可以用Zset命令操作Geo ----------
127.0 .0.1:6379 > ZRANGE china:city 0 -1
1 ) "chongqing"
2 ) "shenzhen"
3 ) "hangzhou"
4 ) "jiangsu"
5 ) "shanghai"
6 ) "tianjing"
7 ) "beijing"
127.0 .0.1:6379 > ZRANGEBYLEX china:city - +
1 ) "chongqing"
2 ) "shenzhen"
3 ) "hangzhou"
4 ) "jiangsu"
5 ) "shanghai"
6 ) "tianjing"
7 ) "beijing"
127.0 .0.1:6379 > ZREM china:city jiangsu
( integer) 1
127.0 .0.1:6379 > ZRANGE china:city 0 -1
1 ) "chongqing"
2 ) "shenzhen"
3 ) "hangzhou"
4 ) "shanghai"
5 ) "tianjing"
6 ) "beijing"
7.1.8 Geospatial应用场景
7.2 Hyperloglog(基数)
Redis Hyperloglog是用来做基数统计时的算法。
优点:输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且很小的
花费12KB内存,可以计算接近2^64个不同元素的基数
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素
底层使用的是String数据类型
7.2.1 什么是基数
7.2.2 基本用法
命令
描述
PFadd key element1 element2…
添加一个/多个元素到Hyperloglog中
PFcount key1 key2…
返回给定一个/多个Hyperloglog的基数估算值(所有元素不重复个数)
PFmerge 新key key1 key2…
将多个Hyperloglog合并为一个新Hyperloglog,相同的去除
----------PFADD--PFCOUNT---------------------
127.0 .0.1:6379 > PFADD myelemx a b c d e f g h i j k
( integer) 1
127.0 .0.1:6379 > type myelemx
string
127.0 .0.1:6379 > PFCOUNT myelemx a
( integer) 11
127.0 .0.1:6379 > PFCOUNT myelemx
( integer) 11
127.0 .0.1:6379 > pfadd myelems a c d j k m n o p q
( integer) 1
127.0 .0.1:6379 > PFCOUNT myelemx myelems
( integer) 16
127.0 .0.1:6379 > PFCOUNT myelems
( integer) 10
127.0 .0.1:6379 > get myelemx
"HYLL\x01 \x00 \x00 \x00 \x0b \x00 \x00 \x00 \x00 \x00 \x00 \x80 DE\x8c B&\x80 @\x89 \x88 H_\x84 @\xfc \x80 EV\x94 F\xca \x80 D<\x84 8\x80 B=\x80 K\x83 \x80 B\xed \x84 A\xfc \x8c C\x93 \x84 C\xf9 \x80 Bm\x80 BZ"
----------------PFMERGE-----------------------
127.0 .0.1:6379 > PFMERGE myelemz myelemx myelemy
OK
127.0 .0.1:6379 > PFCOUNT myelemz
( integer) 17
允许容错的情况下,可以使用Hyperloglog
不允许容错的情况下,用Set或自己的数据类型
7.2.3 Hyperloglog应用场景
网站的UV,一个人访问一个网站多次,仍然算作一个人
7.3 BitMaps(位图)
使用位存储,信息状态只有0和1
BitMaps是一串连续的二进制数字,每一位所在的位置位偏移(offset),再BitMaps上执行
7.3.1 基本用法
命令
描述
SETBIT key offset value
为指定key的第offset位设置值
GETBIT key offset
获取指定第offset位的值
BITcount key n1 n2
统计字符串被设置为1的个数,可以按[n1,n2]区间进行统计
BITtop operration 新key key1 key2…
对一个/多个保存二进制字符串key进行位元操作。并将结果保存到新key中
BITpos key bit n1 n2
返回该字符串中第一个设置位1或0的位数,[n1,n2]区间只能安字节,不能按位
------------setbit--getbit--------------
127.0 .0.1:6379 > setbit sign 0 1
( 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 5 1
( integer) 0
127.0 .0.1:6379 > type sign
string
127.0 .0.1:6379 > getbit sign 2
( integer) 1
127.0 .0.1:6379 > getbit sign 3
( integer) 1
127.0 .0.1:6379 > getbit sign 4
( integer) 0
-----------bitcount----------------------------
127.0 .0.1:6379 > BITCOUNT sign
( integer) 4
127.0 .0.1:6379 > get sign
"\xb4 "
7.3.2 BitMaps应用场景
打卡记录
统计数据
有两个相对状态的事务,可以用BitMaps来统计